윈도우에서 라즈베리파이 커널 빌드

WSL이나 qemu등을 사용하지 않고 MSYS2에서 라즈베리파이 커널 빌드와 busybox를 initd로 사용하여 부팅가능한 SD카드 만드는 과정을 기록한다. MSYS2에서 만들면 발생하는 문제점으로는 라즈베리파이가 부팅 된 이후 특별히 할 수 있는것이 없다.

WSL을 사용하거나 qemu에서 HAXM 가속으로 리눅스를 부팅해서 작업하는것이 시간도 몇배나 절약되고 자잘한 문제가 덜 발생한다. 예로 윈도우에서 빌드한 툴체인에서 libc를 static 라이브러리로 링크하면 _Unwind_Resume등을 찾을 수 없어서 링크가 불가능하여 라즈베리파이에서 구동되는 컴파일러를 빌드할 수 없는 등 할 수 없는 작업들이 많다. (LDPlayer같은 프로그램을 사용한다면 하이퍼바이저를 사실상 사용할 수 없기때문에 WSL을 사용할 수 없다.)

만약 부팅가능한 SD 카드를 만들고 젠투 리눅스같은 배포본을 설치 할 예정이라면 MSYS2에서도 시도할만하다.

Continue reading 윈도우에서 라즈베리파이 커널 빌드

ARM 네이티브 툴체인 만들기

buildroot로 만든 라즈베리 파이의 파일 시스템에서 파이썬으로 만들어진 데모를 돌리기위해(pip로 설치하는 모듈이 C 코드를 빌드하기때문) 툴체인 빌드에 끝까지 성공하여 과정을 기록. (참고: 구버전 buildroot는 타겟 파일 시스템에서 실행되는 컴파일러를 지원 한것으로 보인다. 아쉬운 부분.)

커널 버전은 x.y.z 중 x.y까지만 동일, glibc 버전은 타겟 시스템의 glibc 버전 2.30과 동일하게 사용했다. 대상 시스템보다 높은 버전의 glibc를 사용하여 툴체인을 만들었다면 bison, python등에서 공유 라이브러리 libc.so.6 참조에서 문제가 발생한다. (또는 glibc의 버전이 동일해도 configure 옵션에 따라서 다른 문제가 발생할수도 있다.) 만약 취미삼아 최신 glibc를 써보고싶다면 대상 시스템에서 원하는 버전의 glibc를 --prefix=/usr로 빌드 후 설치하여 업데이트 할 수 있겠지만 특별히 의미도 없고 추천할 수 없다.

Continue reading ARM 네이티브 툴체인 만들기

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 옵션을 붙여서 설치해야 됨.