뭘 이런걸..

Posted
Filed under 장비 리뷰
안녕하세요? PADI 강사 김정균 입니다.

내돈 내산 리뷰 첫번째 다이빙 장비 리뷰 입니다. 이 다음이 또 있을지는 모르겠지만.. :)

일단, 저는 전기에 대한 전문가가 아닙니다. 그러므로 리뷰에 적는 내용 중 틀린 내용도 많이 있을 수 있으니 감안 하시기 바라며, 또한 제품에 대한 성능이나 문제점을 지적하려는 의도도 전혀 없고 그냥 개인적인 관점에서의 리뷰임을 감안해 주셔요~

하이맥스 엑스빔 XPH70.2
이번 리뷰는 하이맥스 코리아에서 생산 판매하는 엑스빔 XPH70.2 라는 수중 라이트 입니다. 서핑을 하다가 해루질을 하시는 분들 사이에 CREE 에서 개발한 XPH70.2 LED 를 사용한 제품에 대한 호가 많아서 알아보게 되었는데요.

처음에는 국내 다이빙 제품들의 단가가 너무 높아서 중국산 제품을 먼저 알아 보았습니다. 역시나 최저 20% 정도의 가격에서 부터 가격대가 형성되어 있더군요. 정말 싼 것은 15,000 대 부터 80,000 정도의 다양한 제품 가격대가 형성이 되어 있었습니다.

먼저 XPH70.2 에 대한 규격을 보자면, 매뉴얼상 최대 32W 의 출력을 가진다고 되어 있어 밝기는  꽤 밝을 거라는 예상이 되었고, 또한 반대로 발열이 꽤 많겠구나 하는 예상도 할 수 있었습니다. 그러던 중, 이 CREE 사의 XPH70.2 LED 의 단가가 대략 8,000~12,000 원 정도선으로 형성이 되어 있다는 정보를 찾았습니다. 갑자기 중국산 저가의 XPH70.2 에 대한 의구심이 마구 솟아 오르기 시작했습니다. 그래서 형성된 가격 중에서 고가쪽으로 구매를 하려고(그래도 국내 판매 제품의 절반 가격 밖에는 ㅠㅠ) 하였으나, 검색을 할 수록 중국산 제품에서 정품 CREE XPH70.2 를 찾기가 힘들다는 정보를 많이 접하다 보니, 비싸도 국내 생산 제품으로 눈을 돌려, 하이맥스의 엑스빔 XPH70.2 제품을 구매하게 되었네요.

그래도 다른 사람들의 후기를 보면 중국산 짝퉁 XPH70.2 도 꽤 만족할 만큼의 광량을 가지고 있기는 한가 봅니다. 저는 테스트를 한 적이 없어서 알 수가 없지만요. (그래도 국내 제조 제품을 샀으니 더 밝고 좋을거라 생각 합니다.)

구매를 하고 나서, 다음날 저녁 제품이 도착을 해 버렸습니다.  요즘 우리나라는 배송이 거의 익일 배송인 듯.. 중국발 배송은 정말 너무 느려요 ㅠ

일단 처음 상품을 받았을 때, 생각보다 크고 무거웠습니다. XPH70.2 의 출력이 상당히 높은 관계로 26650 1개로는 제대로 된 출력을 못 낸다는 사실을 이미 알고 있었으므로 어느 정도 무게는 있을 거라 생각했는데 배터리 포함 700g 정도 되네요.

사용자 삽입 이미지

unboxing은 즐겁습니다. :)


제품 구성은 단순히 라이트 본체, 손목 스트랩, 여분 O-ring 4개 로 구성이 되어 있습니다. 랜턴 손잡이 부분 상/하단이 분리가 되며, 각각 2개씩 O-ring 으로 방수 처리가 되어 있습니다. L사의 제품이 3중 O-ring 으로 방수 처리된 거에 비하면, 이 부분은 조금 아쉽네요, 손목 스트랩은 뭐 그냥 별로 사용하고 싶지는 않습니다. 스트랩 대신에 하단에 100mm 정도의 볼트 스냅을 묶어서 사용할 예정 입니다. 

구매한 저가형 중국산 배터리. 그래도 KC인증 (XU101361-18005A)<br>을 받은 제품이다.

구매한 저가형 중국산 배터리

배터리는 제품 소개에, 자사 배터리를 사용하는 것이 가장 best 라는 문구도 있었고, 매뉴얼상에도 고출력 제품인 것을 확인 했기 때문에 배터리 선택에 신중했었어야 했는데, 고가의 제품을 사다 보니 어쩔 수 없이 저가의 중국산 (그래도 KC 인증을 받은..) 제품을 구매를 했습니다. 다만 그래도 짱구를 좀 굴려서 하이맥스에서 판매하는 제품과 동일한 cell (인증번호: XU101361-18005A) 을 사용하는 제품을 골라 보았고 거의 25% 정도의 가격에 구매를 했네요.

드디어, 배터리를 넣고 스위치를 켜 보았습니다. 그..런..데..

아뿔사, 15초 정도 지나니 전원이 꺼져 버립니다. 배터리를 재탈착 하기 전에는 전원이 들어오지 않습니다. 그래서 일단 배터리를 완충하고 다시 테스트를 해 봅니다. 역시나 ㅠㅠ

전기에 대한 지식이 미천하다 보니 뭐가 문제인지 감도 안옵니다. 그래서 제조사에 증상에 대하여 남겨 놓아 보았고, 바로 다음날 연락이 왔으며, 일단 제품 확인을 해 보겠다고 회수를 해 갔습니다. 그런데!! 회수해간 다음날 오전에 제품이 도착을 했습니다. 아무래도 회수해 가면서 새 제품을 보내 주신 것 같더군요. (진실은 모르겠지만.. 전 새 제품을 보내주신 것으로 믿고 있습니다. 감사합니다..) 하여튼 하이맥스라는 회사에 대한 호감도가 쑥쑥 올라갔습니다.

그....런....데, 또 15초 정도 지나니 꺼져 버립니다. 아무래도 배터리 분리를 하기 전에는 전원이 안들어오는 것으로 봐서, 또 배터리 분리를 하고 다시 장착을 하면 전원이 들어오는 것으로 봐서, 라이트의 문제라기 보다는 배터리의 보호회로가 삽질을 하는 것이 아닌가 하는 의심이 들기 시작 했습니다. (그래서 배터리 선택을 신중하게 했어야 합니다 ㅠㅠ 그냥 제품 권고를 따랐으면 이런 삽질을 안했을텐데 말이죠)

여기서 부터는배터리 이야기로 넘어가게 됩니다.

일단, 처음 의심을 한 것은 보호 회로 보다는 배터리 방전용량에 대한 의심을 먼저 하게 되었습니다. 26650 배터리의 경우, 일반용/중방전/고방전 이렇게 제품을 나누어서 판매를 하고 있었는데, 일반용은 평균방전용량이 5A 이고, 중방전은 대략 10A, 고방전은 10A 이상의 방전 용량을 가지고 있습니다. 그래서 처음 생각을 했던 것이 XPH70.2 의 매뉴얼상 출력이 28.8W(6V, 4800mAh) 이고, 26650 배터리가 3.7V를 사용하므로, 최소 8A 이상의 방전용량을 가진 배터리가 필요하다고 판단을 하여, 구매한 배터리가 일반용이지 않을까 의심을 하게 되었습니다. 하지만 구매한 배터리의 세부 사항을 확인해 보니 C RATE 가  2C이고 평균 방전용량이 10A 인 제품인 것을 확인하고 나니, 또 멘붕이 오기 시작했습니다. 또 제품 교체를 해 봐야 하는 건가..

XPH70.2 sheet

XPH70.2 세부 사항


배터리 스펙상으로는 문제가 없어야 할 것 같은데, 제가 방전전류을 측정할 수 없어서, 여기저기 손을 벌려 동일 셀을 사용하는 하이맥스 배터리와, 저가의 고방전용 배터리를 구해왔습니다. 일단 하이맥스 배터리는 상세 스펙이나 테스트한 후기가 없어 방전용량을 알 수는 없었지만, 21700 고방전용 배터리를 따로 판매를 하는 것과 자사 배터리를 권고한 것으로 보아 제가 구매한 저렴이와 동일한 평균방전용량이 10A  정도 되는 중방전용 배터리라고 판단을 하였고요.

사용자 삽입 이미지사용자 삽입 이미지

다른 고방전용 배터리는 KC 인증을 받은 XU101361-21024A cell 을 사용하는 제품으로 평균 방전 용량은 15A, 최대 방전 용량은 25A 인 제품 입니다. 역시 저가형이기는 하지만 고방전 제품이라서 그런지 처음 산 저렴이 보다는 2배 정도 가격이 됩니다.
 
일단, 테스트한 배터리들은 모두 잘 동작을 했습니다. 그래서 라이트에는 문제가 없고 처음 구매한 26650 배터리의 보호회로에 문제가 있는 것이 아닌가 하는 의심을 하기 시작 합니다.

문제가 있는 배터리로 계속 테스트 하다보니, 처음 부터 고출력을 출력을 하면 꺼지던 현상이 출력을 조금 낮추니 라이트가 정상 동작을 하기 시작했습니다. 역시 보호회로가 원인이라고 확신을 하게 됩니다. 이 제품을 교환을 할 수 있을지 모르겠지만 일단 교환 시도는 해 봐야 겠습니다. ㅠ

직진형이라서 중간에 광원이 모인다.

중앙 광원 보소..

그래서, 일단 제품에 문제가 없다는 것은 확인을 하게 되었고, 드디어 라이트의 성능에 대해서 테스트를 할 수 가 있게 되었습니다.

일단, 고출력 제품 답게 엄청 밝습니다. 제가 가지고 있는 L사 4200루멘 라이트와 비슷한 느낌이네요. 기존 사용하던 4200루멘 라이트는 직진형 인데, 이 제품은 직진형이기는 하지만 약간 빛이 분산 되는 편입니다. 즉 용도가 먼 거리를 커버해야 한다면 이 제품 보다는 직진형 제품을 찾는게 좋을 것이고, 대략 30~40m 정도를 환하게 사용하고 싶다면 이 제품이 딱 좋은 듯 싶습니다.

그리고, 열이 엄청 많이 납니다. 외기에서는 버튼이 있는 부분은 매우 뜨거워서 잡고 있기가 힘이 듭니다. 온도계로 재어 보니 15분 정도 켜 놓았을 때 거의 55도 정도까지 올라갑니다. 35도 정도의 온수에서 테스트를 했을 때는 확실이 온도가 수온 정도로 떨어져서 편했고요. 원래 용도인 수중에서의 사용성에는 문제는 없어 보입니다. 외기에서도 장갑을 착용하면 큰 문제 없을 것 같고, 55도 정도에서 열이 올라가는 속도가 상당히 완만해 지기 시작 합니다. 이 근처 온도에서 유지될 것 같은 예상이 들었습니다.
라이트 온도 측정

온도 보소 ㅠ


결론적으로, XPH70.2 제품 구매를 하실 때 고방전출력 때문에 배터리의 방전 성능도 중요하지만 출력은 보호회로가 담당하는 부분이므로 하이맥스에서 판매하는 배터리를 같이 구매하시는 것이 저처럼 이런 삽질을 하지 않을 수 있을 것 같습니다. 안그러면 저처럼 팔자에도 없는 공부를 하게 됩니다.


P.S.
제품 설명에 보면 "모드 변경 없이 1단 100%출력만 됩니다" 라고 되어 있는데, 버튼을 길게 누르고 있으면 출력이 약해졌다가 강해집니다. 출력 강약을 선택할 수는 없고, 길게 누르고 있으면 점점 출력이 약해지다가 최저 출력에 도달하면 두번 깜빡이고, 다시 길게 누르면 출력이 최대 출력까지 점점 강해지는 패턴 입니다. 즉 출력 조정이 가능 합니다. 무슨 east egg 같은 것일까요?

P.S. 2
고방전용이 좋아 보기이는 하는데, 과방전이 될 수도 있을 것 같네요. 그러면 런타임이 짧아질 지도 모르겠네요. (이것도 공부해 봐야 하는 건지 ㅠㅠ)

P.S. 3
제품이 비싸기는 했지만.. 기 소유하고 있는 L사 4200루멘 라이트 보다도 50% 저렴하게 구매 했어요. 4200루멘 라이트에 비하면 엄청 저렴 합니다. 우리나라 다이빙 용품은 너무 비싸게 파는 것 같아요 ㅠ
2024/08/21 04:46 2024/08/21 04:46
Posted
Filed under Tech/프로그래밍
정말 오랜만에 blog 에 posting 을 해 봅니다 :)

bash 에서 옵션 처리를 할 경우, bash 의 내장 함수인 getopts 또는 GNU getopt 를 사용하게 되는데, 필자의 경우에는 long option 을 제공하는 GNU getopt 를 더 선호하는 편입니다.

하지만 GNU getopt 를 사용할 경우 치명적인 문제가 하나 있는데, 바로 옵션 값에 공백 문자가 있을 경우, getopt -> set 을 하는 과정에서 옵션 값의 공백문자를 기준으로 분리가 되어 버리는 문제 입니다. (set 을 하는 이유는, 옵션과 인자값 순서를 섞어도 되게 하기 위해서 입니다.) 예를 들어

#!/bin/bash

opts="$( getopt -o h -u -l help -- $@ )"
set -- ${opts}
echo "$@"
echo "$3"
와 같이 코드를 만들고, 실행을 하면 다음과 같이 출력이 됩니다.
[user@host ~]$ bash test.sh -h "1 2 3"
-h -- 1 2 3
1
출력되는 $3 은 기대하는 "1 2 3" 이 아니라 "1" 이 됩니다.

그래서 이 문제는 해결하기 위해서는 다음과 같이 해 볼 수 있습니다.

#!/bin/bash

for i
do
[[ $i =~ [[:space:]] ]] && opt[n++]="\"${i}\"" || opt[n++]="${i}"
done
echo "input: ${opt[@]}"

opts="$( eval getopt -o ah: -l aa,hhh: -- ${opt[@]} )"
echo "opts -> ${opts}"
eval set -- ${opts}
for i
do
case "${i}" in
-a|--aa)
A=1
shift
;;
-h|--hhh)
H="${2}"
shift 2
;;
--)
shift;
break
esac
done

echo "$@"
echo "----"
echo "-h -> $H"
echo "\$1 -> $1"
echo "\$2 -> $2"
echo "\$3 -> $3"
echo "\$4 -> $4"
결과는
[user@host ~]$ bash test.sh "123 456" -h '\"abc def\"' 789
input: -h "\"abc def\"" "123 456" 789
opts -> -h '"abc def"' -- '123 456' '789'
123 456 789
----
-h -> "abc def"
$1 -> 123 456
$2 -> 789
$3 ->
$4 ->


--
코드를 조금 더 업데이트 해 보았습니다. 옵션값이 quote 를 사용할 떄 escape 를 해야 했는데 불편해서 하지 않아도 되도록 개선해 보았습니다. 이 이슈 때문에 getopt 를 eval 을 했었는데 굳이 하지 않아도 되었더군요. ㅠ

#!/bin/bash

echo "input: $@"

opts="$( getopt -o ah: -l aa,hhh: -- "$@" )"
echo "opts -> ${opts}"
eval set -- "${opts}"

echo "input -> ${opts}"

for i
do
case "${i}" in
-a|--aa)
A=1
shift
;;
-h|--hhh)
H="${2}"
shift 2
;;
--)
shift;
break
esac
done

echo "$@"
echo "----"
echo "-h -> $H"
echo "\$1 -> $1"
echo "\$2 -> $2"
echo "\$3 -> $3"
echo "\$4 -> $4"
이렇게 하면 옵션값에 quote  를 사용할 때 escape 를 하지 않아도 됩니다.
[user@host ~]$ bash test.sh 123\ 456 -h '"abc def"' 789
iinput: 123 456 -h "abc def" 789
opts -> -h '"abc def"' -- '123 456' '789'
input -> -h '"abc def"' -- '123 456' '789'
123 456 789
----
-h -> "abc def"
$1 -> 123 456
$2 -> 789
$3 ->
$4 ->
2023/01/06 13:22 2023/01/06 13:22
Posted
Filed under Tech/안녕리눅스
안녕 리눅스 업데이트 서버가 있는 IDC 의 전원 공사로 인하여 다음 기간 동안 홈페이지 운영및 yum repository 서버 운영이 중단 되어, yum update 가 이 기간 동안 불가능 하오니 업무에 참고 바랍니다.

서비스 중지 : 2021.01.22 17:00
서비스 재개 : 2022.01.25 언젠가..

서비스 재개는 IDC 사정에 따라 유동적일 수 있습니다.

긴급 업데이트나, yum 사용이 필요할 경우에는, /etc/yum.repos.d/Annyung.repo 설정 파일에서 mirrorolist 항목을 baseurl 로 변경하여 긴급 사용할 수 있습니다.

[AN:core]
baseurl=http://ftp.kr.freebsd.org/pub/AnNyung/$annyungver/core/$basearch

[AN:base]
baseurl=http://ftp.kr.freebsd.org/pub/AnNyung/$annyungver/base/$basearch

[AN:xless]
baseurl=http://ftp.kr.freebsd.org/pub/AnNyung/$annyungver/xless/$basearch

[AN:addon]
baseurl=http://ftp.kr.freebsd.org/pub/AnNyung/$annyungver/addon/$basearch
2021/01/19 23:39 2021/01/19 23:39
돌멩이

진짜.... 1년넘게 중지 되는거 아니지요???

김정균

ㅎㅎ 1년 쉬고 싶었나 봐요. 그럴 때도 되지 않았나

Posted
Filed under Tech/프로그래밍
디스크 크기나 네트워크 전송 대역폭 등을 단위대로 보기 좋게 하기 위한 코드를 살펴보겠습니다.
C나 여러 언어로 많이 있으나, bash 로는 딱히 마음에 드는 코드가 없어 만들어 보았습니다.

HUMANREADABLE_SIZE_SUFFIX=( "B" "KB" "MB" "GB" "TB" )
# HUMANREADABLE_SIZE req_size base_suffix
function HUMANREADABLE_SIZE {
local suffix=${2:-0}
local size=$1
local isize=${size}

while [ 1 ]
do
(( isize < 1024 )) && break
size="$( bc <<< "scale = 2; ${size} / 1024" )"
isize=${size%%.*}
let "suffix += 1"
done

echo "${size} ${HUMANREADABLE_SIZE_SUFFIX[suffix]}"
}


사용법은 간단합니다.

HUMANREADABLE_SIZE 입력_숫자 입력단위(0-B,1-KB,2-MB,3-GB)


[root@host ~]# # convert 1024 B
[root@host ~]# HUMANREADABLE_SIZE 1024
1KB
[root@host ~]# # convert 1024 KB
[root@host ~]# HUMANREADABLE_SIZE 1024 1
1MB
[root@host ~]# # convert 1024 MB
[root@host ~]# HUMANREADABLE_SIZE 1024 2
1GB
[root@host ~]# # convert 1024 GB
[root@host ~]# HUMANREADABLE_SIZE 1024 3
1TB


변환 값을 변수로 받고 싶다면 다음과 같이 할 수 있습니다.


[root@host ~]# SIZE=$( HUMANREADABLE_SIZE 1024 3 )
[root@host ~]# echo -n ${SIZE} # newline 이 없어야 할 경우..
2021/01/13 11:45 2021/01/13 11:45
Posted
Filed under Tech/안녕리눅스
안녕 리눅스 2 EOL (End Of Life) 공지 입니다.

안녕 리눅스 2의 모체인 CentOS 6 의 Life time 이 2020/11/30 종료가 되어, 안녕 리눅스 2도 같이 EOL 이 종료 됩니다.

다만, 현재 제가 아직 운영 중인 CentOS 6 이 남아 있는지라, 이 서버가 유지될 때 까지 잠시 동안은 critical bug fix 는 지원될 수도 있을 것 같습니다. 아마 2021년 상반기 안으로 정리가 되지 않을까 싶습니다.

현재, CentOS 6 이 mirror.centos.org 에서 제거 되고, valut.centos.org 로 이동이 되어, 안녕 리눅스 2에서 yum 이 동작하지 않습니다. 이 문제를 수정하기 위하여 다음의 명령을 수행해 주시면 됩니다.

[root@host ~]# rpm -Uhv http://mirror.oops.org/pub/AnNyung/2/core/x86_64/annyung-release-2.8-2.an2.noarch.rpm


P.S.
안녕 리눅스 3은 Oracle linux 또는 Rocky linux 기반으로 될 지도 모르겠습니다. Rocky linux 기반일 경우에는 많이 지연될 수 있을 것 같습니다. (아직 출시가 되지 않아서 --;) 아직은 약간 관망 중입니다.
2020/12/20 06:29 2020/12/20 06:29
Posted
Filed under Tech/안녕리눅스
안녕 리눅스  2 에서 독자 노선을 포기하고 clone 배포본 base 로 잡기 시작하면서, 버전의 괴리가 커지는 것 같아 안녕 리눅스 4는 출시하지 않고 버전을 맞추어 8 로 릴리즈 할 예정 입니다.

안녕 리눅스 3 작업 시에, systemd 에 대한 경험이 너무 없었고, RHEL 6에서 7로의 변화에서도 많은 부분을 놓쳐서 legacy 설정이나 init scritp 를 이용하고 있었는데, 안녕 8에서는 이런 부분을 좀 더 향상 시키기 위하여 RHEL 8 로 경험치를 좀 쌓고 있습니다. 그리고 RHEL 7에서 당한 것들을 보아 8.3 또는 8.4 를 base 로 안녕 8을 생각하고 있었으나, RHEL 6의 EOL 이 2020.11.30 로 다가오면서, 안녕 2의 EOL 역시 같이 종료를 되므로, 이 시점에 맞추어 8.2 또는 8.3 으로 release 를 해 보려고 합니다. 물론 CentOS 가 RHEL 보다 1~2달 정도 늦게 나오므로, 아마 실제 출시는 CentOS 8.3 에 맞춰지지 않을까 예상은 합니다만, 안녕 2의 EOL 때문에 일단은 2020.11.30 을 목표로 (아마 이 시점이면 8.2 base 가 될 수도 있을 겁니다.) 진행은 하고 있으며, 늦어지면 CentOS 8.3 출시에 맞춰서 진행될 것으로 보입니다.

출시 고지는 http://annyung.oops.org/?m=data&p=roadmap 의 [ 8 ] 섹션에 출시 날자가 업데이트 될 예정이니 참고 하시기 바랍니다.
2020/06/13 02:47 2020/06/13 02:47
김정균

출시일 약속은 못 지켰지만.. 내년 1/4 분기 이내로 출시는 가능할 것으로보고 있었는데, 어제자로 CentOS 에서 CentOS 8 release 에 대한 중단 공지를 올려 버렸네요. Release 는 더이상 배포하지 않고 Appstream 에만 집중하겠다는 발표인데, 안녕 리눅스 8이 Release 로 개발이 되어져서, Appstream 으로 변경을 해야 하나 고민 중입니다. 한 2-3주 정도는 흘러가는 형세를 관망해야 할 듯 싶네요. 일단은 현재 잠깐 작업은 멈춘 상태 입니다.

JellyPo

항상 고맙습니다. 안녕리눅스 설정을 보면 많은 공부가 됩니다.

Posted
Filed under Tech/프로그래밍
만들 때 마다 헷갈리고 까먹어서 기록해 놓아야 겠다.

# USAGE: compare_version OLD NEW
# RETURN:
# (OLD == NEW) return 0
# (OLD < NEW) return 1
# (OLD > NEW ) return 2
function compare_version {
local opt
[[ $1 == $2 ]] && return 0

# -V option 이 지원되지 않을 경우, 숫자 이외의 문자가 들어간 버전 비교가
# 정확하지 않을 수 있다. 예) 2.1.9-3el6_7.2
sort -V >& /dev/null <<< "aa"
[[ $? == 0 ]] && opt="V"

test "$(printf '%s\n' "$@" | sort -r${opt} | head -n 1)" != "$1";
res=$?
[[ $res == 0 ]] && return 1 || return 2
}


결과

[root@host ~]# source version_comapre.sh
[root@host ~]# compare_version 3 3
0
[root@host ~]# compare_version 3 4
1
[root@host ~]# compare_version 4 3
2
[root@host ~]#
2020/06/08 16:41 2020/06/08 16:41
Posted
Filed under Tech/프로그래밍
서버를 관리하다 보면 legacy OS 까지 고려하면서 코드를 작성해야 할 경우가 종종 있습니다.

스크립팅을 하다 보면 sort -V 옵션을 종종 사용해야 할 경우가 있습니다. 그런데 old OS 에 있는 sort 는 -V 옵션이 없는 경우가 있을 수 있습니다.

[root@host ~]# sort --help | grep -- "-V"
-V, --version-sort natural sort of (version) numbers within text
[root@host ~]#

sort -V 옵션이 필요한 경우는 대부분 다음과 같습니다.

cat << EOL | sort
1
2
10
20
EOL

위의 코드의 결과로는 보통은 1.. 2.. 10 .. 20 의 순서대로 나오기를 기대하게 됩니다. 하지만 위의 코드 결과는 실제

1
10
2
20

과 같이 의도하지 않는 출력이 되게 됩니다. 그러다 보니 어쩔수 없이 sort -V 를 구현을 해야 하게 됩니다.

아래 코드는 sort -V 옵션을 bash function 으로 만든 것입니다. license 는 BSD 2 clause 로 사용해 주시면 됩니다.

function sortv {
local var
local i

if [[ $# == 0 ]]; then
i=0
while read var_t
do
var[i++]="${var_t}"
done < /dev/stdin
else
var=( $* )
fi

(
for i in ${var[@]}
do
printf "ibase=2; %07d\n" "$(bc <<< "obase=2; ${i}")"
done
) | sort | bc
}

sort -V 2> /dev/null <<< "1"
[ $? -eq 0 ] && sort="sort -V" || sort="sortv"

cat <<EOL | ${sort}
1
10
2
20
EOL

출력 결과는

1
2
10
20


P.S.
기존의 sortv 함수가 문자열이나 공백이 들어갈 경우 문제가 되어 개선을 해 보았습니다.

function sortv {
local var
local i
if [[ $# == 0 ]]; then
i=0
while read var_t
do
var[i++]="${var_t}"
done < /dev/stdin
else
var=( $* )
fi

(
for i in "${var[@]}"
do
perl -p -e 's/([0-9]{4})/$1#~~#/g; s/([0-9]+)/`bc <<< "obase=2; $1" | xargs printf "%020d~~"`/eg' <<< "${i}"
done
) | sort | perl -pe 's/([0-9]{20})~~/`bc <<< "ibase=2; $1" | xargs printf "%s"`/eg; s/[0-9]{4}#~~#/$1/g'
}

sort -V 2> /dev/null <<< "1"
[ $? -eq 0 ] && sort="sort -V" || sort="sortv"

cat <<EOL | ${sort}
/home/0 asdfdsakf298u098uop;
/home/2 asdfdsakf298u097uop;
/home/5 asdfdsakf298u098uop;
/home/4 asdfdsakf298u098uop;
/home/11 asdfdsakf298u098uop;
/home/3 asdfdsakf298u028uop;
/home/1
EOL

출력 결과는 

/home/0  asdfdsakf298u98uop;
/home/1
/home/2 asdfdsakf298u97uop;
/home/3 asdfdsakf298u28uop;
/home/4 asdfdsakf298u98uop;
/home/5 asdfdsakf298u98uop;
/home/11 asdfdsakf298u98uop;
2020/01/16 18:47 2020/01/16 18:47
Posted
Filed under Tech/Tip & Trick
MegaRAID 의 VD 의 device name 을 구하는 방법

일단, controller 별 device 정보는 다음에서 구할 수 있다

/dev/disk/by-path/*
/sys/block/*/device


이 두 경로 리스트의 softlink target 에 device name 이 존재한다.

[root@host ~]# ls -l /dev/disk/by-path/
합계 0
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:00:11.5-ata-3.0 -> ../../sdg
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part1 -> ../../sdg1
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part2 -> ../../sdg2
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part3 -> ../../sdg3
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:17:00.0-scsi-0:2:0:0 -> ../../sda
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:17:00.0-scsi-0:2:1:0 -> ../../sdb
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:0:0 -> ../../sdc
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:1:0 -> ../../sdd
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:2:0 -> ../../sde
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:3:0 -> ../../sdf


by-path 의 장점은 위의 정보와 같아 cotroller 에 연결이 안되어 있는 disk 가 존재하는 경우을 처리할 수 있다는 장점이 있으나, CentOS 5 이전의 경우에는 by-path를 지원하지 않는 단점이 있다. CentOS 5 에서도 커널 버전에 따라 지원되고 안되고의 차이가 발생할 있다.

/sys 는 아래와 같다.

[root@a1page074.ndrive z]# ls -l /sys/block/sd*/device
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sda/device -> ../../../0:2:0:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdb/device -> ../../../0:2:1:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdc/device -> ../../../12:2:0:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdd/device -> ../../../12:2:1:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sde/device -> ../../../12:2:2:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdf/device -> ../../../12:2:3:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdg/device -> ../../../3:0:0:0


/sys 의 경우 /sys 를 지원하는 커널에서는 다 사용을 할 수 있지만, 위와 같이 controller 에 연결이 되어 있지 않은 device 를 솎아 내기가 좀 애매하다.

여기서는 경우의 수를 될 수 있으면 많이 처리하기 위하여 /dev/disk/by-path 를 이용하여 구하는 코드를 만들어 볼 것이다.

일단, MegaRAID 를 사용하는 device 만 솎아 내기 위하여 PCI table 을 확인한다.

[root@host ~]# lspci | grep -E "LSI|Dell|IBM|MegaRAID"
17:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)
b3:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)


여기서 주의할 것이 sort 를 해서는 안된다. 여기에 나오는 순서가 MegaCLI 에서 나오는 controller 의 순서와 동일하다. 이 정보의 첫번째 필드만 있으면 된다.

그럼 by-path 에서 controller 정보와 VD 정보는 어떻게 매핑 하면 되는지 보겠다.

pci-0000:17:00.0-scsi-0:2:0:0
pci-0000:{PCI_TABLE_NUMBER}-scsi-0:2:{VD_NUMBER}:0


위와 같은 규칙을 이용하여 찾도록 한다. 그럼 완성된 코드는 다음과 같다.

idx=0
for rc in $(lspci | grep -E "LSI|Dell|IBM|MegaRAID" | sort | awk '{print $1}')
do
bypath="$(
ls -l /dev/disk/by-path/pci-0000:${rc}-* 2> /dev/null | awk -v ctrlidx=${idx} '
{
n = split ($(NF-2), A, ":");
vdnum = A[n-1]
dev = gensub (/.*\//, "", "g", $NF);

print ctrlidx ":" vdnum ":" dev

#print $(NF-2) " " $NF
}
'
)"
echo "$bypath"
let "idx++"
done


위의 코드의 결과는 다음과 같다.

controller_number:VD_number:device_name
0:0:sda
0:1:sdb
1:0:sdc
1:1:sdd
1:2:sde
1:3:sdf
2019/09/05 13:19 2019/09/05 13:19
Posted
Filed under Tech/Tip & Trick
MariaDB 10.4 부터 mysql database 의 user table 에 변경이 발생했습니다.

mysql> UPDATE USER SET Password = password('PASS_STRING');
mysql> flush privileges;

위와 같이 기존의 방식으로 변경을 하면 다음과 같은 에러가 발생 합니다.

ERROR 1348 (HY000): Column ‘Password’ is not updatable.

이 이유는, 10.4 부터는 user table 이 없어지고 global_priv table 이 그 역할을 대신 하기 때문입니다. show tables 시에 보여지는 user table은 global_priv 등의 table를 이용하여 view 로서 대신 하게 되었기 때문에 user table 을 update 하는 것이 불가능 합니다.
MariaDB [mysql]> SHOW FULL TABLES IN mysql WHERE TABLE_TYPE LIKE 'VIEW';
+-----------------+------------+
| Tables_in_mysql | Table_type |
+-----------------+------------+
| user | VIEW |
+-----------------+------------+
1 row in set (0.007 sec)

https://mariadb.com/kb/en/library/authentication-from-mariadb-104/

위의 문서를 읽어 보시면 몇가지 특징이 있는데, mysql 10.4 부터는 더이상 mysql 의 root 계정에 대한 암호를 기본적으로는 물어보지 않습니다. 이 이유는 오직 root account 로 mysql client 를 실행 했을 경우에만 암호가 없이 동작을 하며, 기타 다른 일반 account 로는 -u root 를 이용하여 접속이 불가능 함을 의미합니다. 즉, 일반 유저로 mysql root 연결이 필요 없다면, 더이상 mysql root 암호를 지정할 필요가 없다는 얘기입니다.

역설적으로 일반 account 에서 mysql root 로 연결을 할 필요가 있다면 mysql root 암호를 변경해 주어야 한다는 얘기도 됩니다.

여기서는 일반 account 에서 mysql root 로 연결을 하고 싶을 때 root account 의 암호를 변경하는 방법입니다.

일단은
SELECT password('PASSWORD_STRING');
query 를 이용하면 암호화된 문자열을 얻을 수 있습니다. 이 정보를 가지고 global_priv table의 Priv field 의 값을 수정해 주면 됩니다. (https://www.reddit.com/r/sysadmin/comments/avx1u6/how_to_change_the_root_password_with_mariadb_104/ 참조)

하지만 이렇게 하면 굉장히 번거롭기 때문에 다음과 같이 query 하나로도 변경이 가능 합니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD_STRING';




단, mariadb 10.3 이하 버전에서 업그레이드를 하여 mysql_upgrade 를 실행한 경우에는, 위의 조건이 성립하지 않습니다. mysql_upgrade 를 이용하여 mysql table을 10.4 용으로 업그레이드 한 경우에는 기본의 mysql database 의  table 들이 유지가 되게 됩니다. 즉, 이 경우에는 global_priv database 가 생성이 되지 않고 user table 이 view가 아니라 여전히 table 이 되게 됩니다.
2019/08/12 16:37 2019/08/12 16:37