mariadb 빌드 시 외부 라이브러리 링크

원래부터 그랬는지 기억이 나지않지만 cmake기반의 빌드 시스템이 필수가 되었다. 기본 옵션으로는 TokuDB를 위해 jemalloc가 필요한데… TokuDB를 사용하지않으려면 “cmake -DWITH_JEMALLOC=no” 이렇게 실행하여 Makefile을 생성하면 되지만 임시로 이것저것 굴리기위한 일반 사용자 계정으로 돌릴 로컬 디비를 구측하는 중이라 사용해보고싶었다.

소스코드 및 빌드 경로: /opt/mariadb-local/src
PREFIX 경로: /opt/mariadb-local/usr

jemalloc는 /opt/mariadb-local/src에 다운로드하여 빌드 및 설치(./configure --prefix=/opt/mariadb-local/usr && make && make install)

mariadb는
cmake -DBUILD_CONFIG=mysql_release -DWITH_JEMALLOC=yes -DCMAKE_INSTALL_PREFIX=/opt/mariadb-local/usr -DCMAKE_REQUIRED_FLAGS="-I/opt/mariadb-local/usr/include" -DCMAKE_REQUIRED_LIBRARIES="-L/opt/mariadb-local/usr/lib"
명령으로 Makefile 생성. 환경변수는 이곳에서 참조하였다. 이제 빌드하면 DokuDB를 사용가능한 mariadb로 빌드가된다. 아마 더 필요한 라이브러리가 있다면 /opt/mariadb-local/usr에 필요한 라이브러리를 더 빌드하여 설치하면 될것으로 보인다.

추가

모듈을 링크할 때 jemalloc를 링크할 수 없는 오류가 발생하므로 –DCMAKE_MODULE_LINKER_FLAGS="-L/opt/mariadb-local/usr/lib" 옵션을 추가해야함.

기본테이블 생성을 위한 mysql_install_db 스크립트 실행은 아래와같이 실행 (소스코드는 mariadb-10.4.11 폴더이지만 mariadb-10.4.11-build 에서 빌드하였다.)
/opt/mariadb-local/usr $ ./scripts/mysql_install_db --builddir=/opt/mariadb-local/src/mariadb-10.4.11-build --basedir=/opt/mariadb-local/usr --datadir=/opt/mariadb-local/usr/data --defaults-file=/opt/mariadb-local/usr/my.cnf --user=$LOGNAME

첫 실행시엔 비밀번호가 설정되어있지않으므로 root 계정으로 mysql -h 127.0.0.1 -P 3307 -u root와같이 실행하여 암호를 바꿔야한다. (localhost로 hostname을 넘기면 포트번호가 무시되는것같다.) 만약 root권한을 가질 수 없다면 mysql_install_db에 --auth-root-authentication-method=normal 옵션을 추가하여 실행해야한다. (이미 설치되었다면 data 폴더의 내용을 지우고 실행해야된다.)

my.cnf 파일의 내용
[client]
port=3307
socket=/opt/mariadb-local/usr/mariadb.sock

[mysqld]
port=3307
socket=/opt/mariadb-local/usr/mariadb.sock
datadir=/opt/mariadb-local/usr/data
language=/opt/mariadb-local/usr/share/korean

로컬용 실행 스크립트
#!/bin/sh
./bin/mariadbd --defaults-file=/opt/mariadb-local/usr/my.cnf

로컬용 중지 스크립트
#!/bin/sh
./bin/mariadb-admin --defaults-file=/opt/mariadb-local/usr/my.cnf shutdown

실행결과
iruis@tun /opt/mariadb-local/usr $ ./run-mariadb.sh
2019-12-22  5:52:20 0 [Note] ./bin/mariadbd (mysqld 10.4.11-MariaDB) starting as process 14794 …
2019-12-22  5:52:20 0 [Note] InnoDB: Using Linux native AIO
2019-12-22  5:52:20 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-12-22  5:52:20 0 [Note] InnoDB: Uses event mutexes
2019-12-22  5:52:20 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-12-22  5:52:20 0 [Note] InnoDB: Number of pools: 1
2019-12-22  5:52:20 0 [Note] InnoDB: Using SSE2 crc32 instructions
2019-12-22  5:52:20 0 [Note] mariadbd: O_TMPFILE is not supported on /tmp (disabling future attempts)
2019-12-22  5:52:20 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2019-12-22  5:52:20 0 [Note] InnoDB: Completed initialization of buffer pool
2019-12-22  5:52:20 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2019-12-22  5:52:20 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-12-22  5:52:20 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-12-22  5:52:20 0 [Note] InnoDB: Setting file ‘./ibtmp1’ size to 12 MB. Physically writing the file full; Please wait …
2019-12-22  5:52:20 0 [Note] InnoDB: File ‘./ibtmp1’ size is now 12 MB.
2019-12-22  5:52:20 0 [Note] InnoDB: Waiting for purge to start
2019-12-22  5:52:20 0 [Note] InnoDB: 10.4.11 started; log sequence number 60736; transaction id 23
2019-12-22  5:52:20 0 [Note] InnoDB: Loading buffer pool(s) from /opt/mariadb-local/usr/data/ib_buffer_pool
2019-12-22  5:52:20 0 [Note] Plugin ‘FEEDBACK’ is disabled.
2019-12-22  5:52:20 0 [Note] InnoDB: Buffer pool(s) load completed at 191222  5:52:20
2019-12-22  5:52:20 0 [Note] Server socket created on IP: ‘::’.
2019-12-22  5:52:20 0 [Note] Reading of all Master_info entries succeeded
2019-12-22  5:52:20 0 [Note] Added new Master_info ” to hash table
2019-12-22  5:52:20 0 [Note] ./bin/mariadbd: ready for connections.
Version: ‘10.4.11-MariaDB’  socket: ‘/opt/mariadb-local/usr/mariadb.sock’  port: 3307  MariaDB Server

최근 버전에서는 user 테이블의 암호를 update 쿼리로 변경이 불가능하게 되었다. 무조건 root 쉘에서 /opt/mariadb-local/usr/bin/mariadb-secure-installation --defaults-file=my.cnf 와같이 실행하여 별도의 설치가 필요한데… root권한을 가지지 못한다면 datadir에 해당되는 폴더를 제거한 후 mysql_install_db 스크립트에 --auth-root-authentication-method=normal 옵션을 붙여서 설치해야 됨.

맥에서 동적 라이브러리 참조문제 (Reason: image not found)

ffmpeg를 사용해볼 겸 테스트용 프로젝트를 생성하여 아래와같이 구성.

빌드까지 문제가 없었으나 실행시키면 “Reason: image not found“라는 에러가 발생.

뜬금없이 libswresample.3.dylib를 찾을 수 없다는 에러가 발생한다. 구글링 해본 결과 otool과 install_name_tool을 사용하여 해결해야하는것으로 결론.

실행파일과 dylib파일을 otool -L 명령으로 확인해보면 라이브러리 위치를 ffmpeg를 빌드할 때 prefix 대상 위치로 참조하도록 되어있다. libswresample.3.5.100.dylib 파일을 확인하면 나타나는 항목 중 첫번째 항목은 LC_ID_DYLIB, 두번째 부터 나타나는 항목은 LC_LOAD_DYLIB으로 차이가 있다. (직접 확인하려면 otool -L 대신 otool -l 옵션으로 실행하면 확인가능) 이중 LC_ID_DYLIB는 바이너리가 생성될 때 라이브러리가 참조되는 경로로 링크가되는것으로 보인다. 이 경로는 install_name_tool -id “라이브러리 경로” “라이브러리 파일”로 지정 가능하고 LC_LOAD_DYLIB는 바이너리에서 의존하는 라이브러리며 install_name_tool -change “기존경로” “새로운경로” “라이브러리 파일” 명령으로 변경 가능하다. (경로는 상대경로를 위한 예약어 비슷한 키워드가 있다. @executable_path, @loader_path, @rpath이다. 각각 의미는 구글링으로 패스.)

install_name_tool -id @executable_path/../Frameworks/libavcodec.58.54.100.dylib libavcodec.58.54.100.dylib
install_name_tool -change /Users/iruis/OpenSource/ffmpeg-4.2.1-lgpl/output/lib/libswresample.3.dylib @executable_path/../Frameworks/libswresample.3.5.100.dylib libavcodec.58.54.100.dylib

위와같은 명령으로 라이브러리 경로를 하나하나 바꾸고나면 맥의 패키지 내 복사되는 라이브러리가 참조되어 정상 로딩되어 실행된다. 덕분에 거의 반나절을 삽질한건 안비밀.

emerge –sync가 안될 때

(제목은 왜 저렇게 되는거지. 하이픈 두개가 이상하게 포맷되는건 왜그런걸까?)

아래와같은 메시지가 계속 떠서 구글링해보다가 emerge-websync로 sync가 되긴 되기때문에 몇달동안 그냥 무시했지만 이건 올바른 방법이 아니기때문에 다시 구글링을 해보았다.

>>> Syncing repository 'gentoo' into '/usr/portage'...
* Using keys from /usr/share/openpgp-keys/gentoo-release.asc
* Refreshing keys via WKD ... [ !! ]
* Refreshing keys from keyserver hkps://keys.gentoo.org ...OpenPGP keyring refresh failed:
gpg: refreshing 4 keys from hkps://keys.gentoo.org
gpg: keyserver refresh failed: General error

OpenPGP keyring refresh failed:
gpg: refreshing 4 keys from hkps://keys.gentoo.org
gpg: keyserver refresh failed: General error

OpenPGP keyring refresh failed:
gpg: refreshing 4 keys from hkps://keys.gentoo.org
gpg: keyserver refresh failed: General error
[반복]

해결법이 달려있는 글은 이곳에서 볼 수 있다. 결론은 emerge -av –oneshot net-libs/gnutls 명령으로 gnutls을 다시 빌드하는것. 아마 얼마전 리눅스 머신을 완전히 새로 설치하기위해 다운받았던 stage파일에 무언가 문제가 있었던것이 아닐까 싶은 생각이 든다.

결과적으로 gnutls를 다시 빌드하고난 후 emerge –sync 명령을 내리니 바로 키가 업데이트되고 싱크가 되었다. (sync하고나서 보니 webkit-gtk를 빌드한지 한시간도 안지났는데 또 업뎃되어 또 빌드되고있다는건 안비밀.)

SATA 확장카드

PCI-e인터페이스의 SATA 확장카드가 필요해서 약 3개월 전 아래 링크의 제품을 구입했다. (인터페이스는 PCI-e 2.0 x 1)
https://www.amazon.com/gp/product/B00AZ9T3OU

국내의 쇼핑몰에서 구입가능한것은 2포트 아니면 4포트에 PCI-e 2배속 이상의 슬롯에만 호환되었다. 그리고 이러한 4포트짜리를 구입하여 리눅스 머신으로 사용중인 AMD 데스크톱에 꼽고 부팅해보니… 호환이 안되었다. 내장 SATA 컨트롤러마저 오동작하여 파일시스템 인식에 문제까지 발생되었다. 보드모델은 B450 AORUS PRO. (다행스럽게 파일시스템이 깨지지는 않았지만 순간 느꼈던 위화감은…)

제품 설명서에 Supports Port Multiplier FIS based switching or command based switching 이라는 문구가 있으니 외장 케이스 중 이러한 기술을 지원하는 제품을 쓴다면 유용하게 사용가능하다.

아래 이미지는 https://sata-io.org/developers/sata-ecosystem/port-multipliers 이곳에서 가지고 온 Port Multiplier 방식

FIS based switching
Command based switching

요즘 컨트롤러는 다 지원하지않을까 생각되지만 확인해서 나쁠것 없는 사양. 혹시나 SATA 컨트롤러가 필요하다면 링크걸린 아마존의 상품을 추천하고싶다.

Bluecom DECIBEL BCS-T90 일주일 사용기

글쓰는 제주가 없으니까 짧게 핵심만.

제품외관

2015년형 아이폰 6s라 요즘 폰 보다 색감이 안좋은 듯.

부담감 안느껴지는 유닛크기였다. 단지 기본으로 장착 된 중간사이즈의 이어폰 팁이 맞지않아 교체를 하게 될 경우 의외로 꽉 끼여있어서 지나칠정도로 잡아당긴다는 느낌으로 빼야 빠졌다. 넣을때는 대충 구멍에 맞춰서 볼트를 돌리듯 시계방향, 반시계방향으로 돌리면서 밀어넣어야 들어갔다.

사운드는 언급은 음악이 직업이신 Producer dk의 영상이 나을거같으니 링크: https://www.youtube.com/watch?v=og8I6zhppyk

개인적인 느낌으로는 와~! 라고 감탄할 정도는 아니였지만 정가 10만원 블루투스 커널형 이어폰이라는 조건에서 잘 뽑혔다고 생각된다. 현재 쓰고있는 유선 커널 20만원대의 Beoplay H3와 비교하면 T90이 조금 더 고음이 약한것 말고 확 느껴질 정도는 아니였다. 저음은 T90이 살작 더 묵직한듯 했지만 이건 고음이 약한탓인지는 특성 그래프를 못봐서 모르겠다. 가성비로 생각하면 T90쪽이 확실히 우월한듯하다. Beoplay H3와 얼마나 차이날지 모르겠지만 Producer dk의 Beoplay E8 평가에서는 고음이 강해서 오래 들으면 피로할 수 있겠다고 했다. 이건 개인취향+기기의 특성에따라 다를 듯 하다. (E8은 올해 내 구입할 생각이니 H3와 얼마나 차이날지 궁금하긴하다. 아이폰 신형을 구입하려하기때문에 어차피 E8 2.0을 사려고 했던것이니 언젠가 직접 비교해보게 될듯.)

단지 어느정도 주의를 가지고 구입해야 할점이 완전하게 선 없는 블루투스 이어폰이 처음이라 그런지 제품의 상태가 사람마다 다른 듯 하다. (단지 공구때문에 며칠사이에 9천명이 구입하면서 유난히 눈에 띄는것일 수 있다. 불량률 1%라고 쳐도 90명은 불량품을 받은것이 되기때문이다.)

대기상태가 아닐 때 화이트노이즈가 좀 느껴지는데 뽑기가 안좋은건지 원래그런건지 모르겠고, 실내임에도 간혹 툭 끊김을 경험했다. 블루투스 5에서는 안그럴지 모르겠지만. 조작에 있어서도 아직 편리하지않다. 캐이스에 넣지않고 바로 연결대기로 진입하려면 터치부분 5초이상 누르면 된다고하지만 거의 안되었고 양쪽 다 5초 이상 눌러야 되던데… 그래도 연결이 안된 경우도 몇몇 있었다. 기기와 연결되었을 때 흘러나오는 음성도 귀 아플정도로 너무 컸다. 완전 무선 이어폰 1세대여서 그런지 수율이 안좋은거같고(공구로 한번에 구입량이 몰려서 그렇게 보인것일 수 있다.) 개선되어야 할 중요한 문제가 몇가지 보였다. 다음세대는 더 나은 제품이 출시되기를!

덧) 화이트노이즈는 블루투스 이어폰이라면 조금씩 있다고하는데 지금까지 유선이어폰만 사용해왔고 몇몇 청음했던 블루투스 이어폰은 장소가 소음없는 곳이 아니여서 다른 제품을 조용한 실내에서 직접 사용해본적이 없어서 어느정도가 정상인지는 모르겠다.