라즈베리 파이 4에 슬랙웨어 설치하기

예전의 라즈비안과 새로운 라즈베리 파이 OS 모두 데비안을 기반으로 만들어져서 내 취향에 정말 안 맞는다. 다른 사용자들도 대부분 같이 쓰는 배포본이라서 도움을 받기는 편하지만 패키지 의존성, systemd를 통한 데몬 관리까지 뭐 하나 깔끔하고 쉬운 게 없다. 와이파이가 자꾸 끊기길래 이것저것 해 보다가 wpa_supplicant 프로그램이 두 번 실행되고 있다는 걸 알았다. 하나는 systemd가 실행하고 다른 하나는 raspi-config가 실행하나? 아무튼 다음과 같이 systemd의 wpa_supplicant를 비활성화시켜 줬다.

sudo systemctl disable wpa_supplicant.service

나머지 하나는 도대체 어디에서 실행되는지 알 수가 없었다. 그러고 나니 슬슬 짜증이 나면서 라즈베리 파이에 슬랙웨어를 설치하고 싶어졌다. 우린 복잡하고 지저분한 거 싫어한다!

여기를 둘러 보니 SARPi라는 HOW TO 프로젝트를 따라 하면 슬랙웨어를 라즈베리 파이에 설치할 수 있다고 한다. 뭐 다 좋은데 라즈베리 파이 제로는 지원하지 않는다. 하지만 마지막 노트를 보면 기어코 파이 제로에 설치한 사용자가 있기는 한가 보다. 링크나 좀 걸어 주지. 이 글을 보면 슬랙웨어 14.1을 설치하는데 성공한 사람이 있다. glibc다시 빌드할 필요도 있는 것 같다. 일단은 라즈베리 파이 제로 W에 타이니 코어 리눅스 설치하기로 아주 가벼운 파이 제로 W를 구현했다.

아무튼, 라즈베리 파이 4로 이더리움 풀 노드 돌리기도 할 겸 라즈베리 파이 4삼성 T7 500GB SSD를 샀다.

라즈베리 파이라고 특별한 것은 없었다. 그냥 설치 디스크 대신 이미지를 받아서 마이크로 SD 카드에 써 주는 것과 설치할 패키지를 따로 내려받아야 한다는 것이 차이점이라고 할 수 있었다. 그리고 마지막으로 추가적인 설정이 좀 필요했다.

1   설치 SD 카드 만들기

1.1   32 비트 커널

여기sarpi4-installer_slackcurrent_06Sep20_sp1.img.xz 파일을 받아서 SD 카드에 쓴다.

xz -dc sarpi4-installer_slackcurrent_06Sep20_sp1.img.xz | dd of=/dev/mmcblk0 bs=65536

1.2   64 비트 커널

여기sarpi64-armv8-installer_slackcurrent_13May20_sp64.img.xz 파일을 받아서 SD 카드에 쓴다.

xz -dc sarpi64-armv8-installer_slackcurrent_13May20_sp64.img.xz | dd of=/dev/mmcblk0 bs=65536

2   소스 미디어 USB 드라이브 준비하기

rsync -Prv --delete ftp.arm.slackware.com::slackwarearm/slackwarearm-current .

3   파이 부팅하기

이제 SD 카드와 USB 드라이브를 파이에 꽂고 켜면 설치가 시작된다.

4   시간 설정하기

우선 파이에는 Real Time Clock(RTC)이 없기 때문에 시간을 직접 설정해야 한다. 인터넷에서 정확한 시간을 동기화하기 위해서 eth0에 인터넷을 설정한 후 ntp를 사용해서 시간을 설정한다.

ifconfig eth0 192.168.1.2
route add default gw 192.168.1.1
echo nameserver 192.168.1.1 >> /etc/resolv.conf

ntpd -p 0.pool.ntp.org
date

5   파티션 생성하기

리눅스에서 스왑 파티션의 크기 결정하기를 참고해서 스왑 파티션을 크기를 결정한다. 데스크탑이 아닌 서버로 쓸 계획이므로 하이버네이션은 필요없다. 8GB RAM의 0.625배인 5GiB로 설정했다. 루트 파티션은 25GiB를 할당하고 나머지를 홈 파티션으로 설정했다.

fdisk /dev/mmcblk0

# p 현재 파티션을 확인한다.
# n 새 파티션을 생성한다.
#   p 기본값
#   2 기본값
#   312448 기본값은 313344이다. 왜 그럴까? 아무튼 공백 없이 312448을 입력한다.
#   64 비트의 경우 숫자가 다를 수 있다. 똑같이 공백 없이 섹터를 시작한다.
#   +5G 5GiB 스왑 파티션
# t 스왑 파티션의 타입을 설정한다.
#   2
#   82
# n 새 파티션을 생성한다.
#   p 기본값
#   3 기본값
#   10799104 기본값
#   64 비트의 경우 숫자가 다를 수 있다. 똑같이 공백 없이 섹터를 시작한다.
#   +25G 25GiB 루트 파티션
# n 새 파티션을 생성한다.
#   p 프라이머리 파티션을 하나 더 생성할 수 있는데 기본값이 e로 되어 있다.
#   63227904 기본값
#   64 비트의 경우 숫자가 다를 수 있다. 똑같이 공백 없이 섹터를 시작한다.
#   기본값
# w 파티션을 쓰고 fdisk를 빠져 나온다.

6   소스 미디어 USB 드라이브 마운트하기

만약 USB 드라이브에서 패키지를 설치하고 싶다면 여기서 미리 내려받은 다음 setup의 SOURCE에서 설정하면 된다. 그렇지 않고 인터넷으로 설치하고 싶다면 setup의 SOURCE에서 FTP/HTTP 소스를 선택하면 DHCP로 인터넷을 설정한 건지 물어 본다. 물론 현재는 eth0만 되기 때문에 와이파이는 설정할 수 없다. 인터넷을 설정한 다음 ftp://ftp.arm.slackware.com 서버의 /slackwarearm/slackwarearm-current/slackware 디렉토리로부터 패키지를 설치하면 된다.

여기서는 USB 드라이브에서 설치한다고 가정한다.

mount /dev/sda1 /floppy

ls -al /floppy/slackware/slackwarearm-current

7   파티션 마운트 포인트 설정하기

이제 setup을 실행한 후 ADDSWAP부터 시작한다.

/dev/mmcblk0p2 swap
/dev/mmcblk0p3 /
/dev/mmcblk0p4 /home

파티션을 다 더하고 나면 “FAT or NTFS PARTITIONS DETECTED”라는 메시지가 뜬다. 여기서 “Yes”를 선택한 후 설치 이미지가 있는 첫 번째 파티션의 보안을 “Root has read/write access, users have no access”로 설정하고 /boot 디렉토리에 마운트해야 한다.

/dev/mmcblk0p1
Root has read/write access, users have no access
/boot

8   소스 미디어 선택하기

“Install from a pre-mounted directory”를 선택한다.

/floppy/slackware/slackwarearm-current/slackware

9   패키지 설치하기

일반 PC에 설치할 때같이 욕심내서 모든 패키지를 다 설치할 필요는 없다. 어차피 대부분 쓰지도 않을테니까. 하지만 귀찮기도 하고 파이 4의 성능도 테스트할 겸 일단 모두 선택된 그대로 진행했다. “full Install everything”으로 패키지 설치를 시작한다.

10   시스템 설정하기

패키지 설치가 끝나면 다음의 순으로 시스템을 설정한다.

  • 마우스: usb ⇒ gpm
  • 네트워크: 호스트명, 도메인명, DHCP
  • 기본 에디터: vim
  • 하드웨어 시계: UTC, 타임존
  • 데스크탑: xinitrc.xfce
  • root 비밀번호

그리고 setup에서 EXIT을 하는데 재부팅을 하면 안 된다.

11   불필요한 패키지 제거하기

패키지로 설치된 부트 이미지와 커널 모듈은 필요없기 때문에 삭제한다. 이에 대응하는 패키지는 13절에서 설치한다.

ROOT=/mnt removepkg kernel_armv7 kernel-modules-armv7

12   부트 파티션 설정하기

이제 필요없는 initrd.gz 파일을 삭제해서 부트 파티션에 공간을 만들어 줘야 한다.

mount /dev/mmcblk0p1 /mnt/boot
rm /mnt/boot/initrd.gz

13   펌웨어와 커널 패키지 설치하기

ROOT=/mnt installpkg /rpi-extra/*

14   HDMI로 오디오 출력하기

vi /mnt/boot/config.txt
# dtparam=audio=on 줄을 찾아서 주석을 해제한다.
umount /mnt/boot

15   소스 미디어 USB 드라이브 제거하기

umount /floppy

이제 USB 드라이브를 제거할 수 있다.

16   재부팅하기

reboot

17   부팅할 때 시간 설정 문제 해결하기

64 비트 버전을 부팅했는데 시간이 맞지 않는다. 분명 /etc/rc.d/rc.local 파일 안에 ntpdate를 실행하는 SARPi hack이 있는데도 안 된다. 그래서 이 줄 바로 위에 ifconfig > /tmp/ifconfig.log를 추가하고 재부팅을 해 보니 eth0 인터페이스가 아직 활성화되어 있지 않았다. 이 문제는 이미 여기에 보고되어 있었다. ntpdate를 실행하기 전에 sleep을 몇 초 정도 하니까 시간이 동기화되었다. 그런데 그 sleep해야 하는 시간도 부팅할 때마다 약간씩 달라졌다. 안정적이지 않은 해결책이다.

그런데 32 비트 버전에서는 이런 문제가 없었다. 그래서 /etc/rc.d/rc.local을 살펴 보니 다른 NTP 클라이언트인 sntp를 사용하고 있었다. 테스트 결과 32 비트에서도 sntp를 실행할 때 eth0의 인터페이스가 활성화되어 있지 않았다. 그런데도 sntp는 성공적으로 시간을 동기화했다. 32 비트 버전이 64 비트 버전보다 더 최신이니까 sntp를 64 비트에 쓰면 같은 결과가 나올지 테스트해 봤다. /etc/rc.d/rc.local 파일 안의 ntpdate 줄을 다음 줄로 바꾸니까 eth0 인터페이스가 활성화되어 있지 않음에도 시간이 동기화되었다.

sntp -sS 0.pool.ntp.org > /dev/null 2>&1

그 이유가 뭘까 궁금해서 로그 파일을 만들어 살펴 보니 다음과 같은 오류가 기록되어 있었다.

sntp 4.2.8p15@1.3728-o Sun Aug 16 22:35:27 UTC 2020 (1)
kod_init_kod_db(): Cannot open KoD db file /var/db/ntp-kod: No such file or directory
sendpkt: sendto(38.229.71.1:123) failed: Network is unreachable
1969-12-31 19:00:19.999572 (+0500) +1600012984.168568 +/- 1066675322.829958 0.pool.ntp.org 194.0.5.123 s2 no-leap

아마도 실행 초기에 오류가 나느라고 시간이 지체되면서 eth0의 인터페이스가 활성화된 다음 실제 동기화가 된 것이 아닌가 짐작한다. 그렇다고 해도 앞서의 테스트처럼 기다리는 것만으로는 안정적인 해결책이 아닐 수 있다. 그래서 그냥 32 비트와 64 비트 모두 /etc/rc.d/rc.ntpd를 쓰기로 했다.

/etc/rc.d/rc.local 파일에서 ntp 관련 줄을 주석 처리하고 /etc/rc.d/rc.ntpd를 활성화시킨다.

su -
chmod a+x /etc/rc.d/rc.ntpd

vi /etc/ntpd.conf
-----
server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst
-----

reboot

18   일반 사용자 추가하기

adduser 명령을 이용해서 일반 사용자를 추가하고 이 사용자로 로그인한다.

19   CPU 상태 확인하기

CPU의 상태를 확인하기 위해서는 SARPi 프로젝트가 제공하는 cpu_status.sh라는 셸 스크립트를 이용하면 된다. 이 파일을 일반 사용자의 $HOME/bin내려받는다.

mkdir ~/bin
cd ~/bin
wget -O cpu_status.sh https://sarpi.fatdog.eu/files/extra/cpu_status.txt
chmod a+x cpu_status.sh

cat<<'EOT'>> ~/.bash_profile
export PATH="$HOME/bin:$PATH"
EOT

. ~/.bash_profile

cpu_status.sh # line 41: /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq: Permission denied

/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq 파일에 접근 권한이 없다. 이 파일은 시스템이 부팅될 때마다 생기기 때문에 부팅할 때 권한을 설정해야 된다.

su - # root로 로그인한다.

cat<<'EOT'>> /etc/rc.d/rc.local
for i in /usr/local/etc/rc.d/rc.* /root/etc/rc.d/rc.*; do
        if [ -x $i ]; then
                $i start
        fi
done
EOT

mkdir -p ~/etc/rc.d
cat<<'EOT'> ~/etc/rc.d/rc.cpuinfo
#!/bin/sh
chmod go+r /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
EOT

chmod a+x ~/etc/rc.d/rc.cpuinfo
~/etc/rc.d/rc.cpuinfo

exit

watch -d=cumulative -n0 cpu_status.sh

20   slackpkg 설정하기

/etc/slackpkg/mirrors 파일을 열어서 ftp://ftp.arm.slackware.com/slackwarearm/slackwarearm-current/ 미러 URL을 추가한 후 다음을 실행한다.

slackpkg update gpg
slackpkg update
slackpkg install-new
slackpkg upgrade-all
slackpkg clean-system

참고로 처음 설치된 /etc/slackpkg/mirrors 파일 안에는 ARM 미러 사이트가 포함되어 있지 않기 때문에 위와 같이 따로 URL을 새롭게 추가해야 한다.

21   sbopkg 설치하기

sbopkg 사이트에서 패키지내려받아서 설치한 후 슬랙웨어 current 버전을 지원하게 설정한다.

su - # root로 로그인한다.
installpkg sbopkg-0.38.1-noarch-1_wsr.tgz

# sbopkg와 sqg가 current 버전을 인식할 수 있게 설정한다.
cp /etc/sbopkg/sbopkg.conf ~/.sbopkg.conf
vi ~/.sbopkg.conf # 다음 변수를 설정한다.
-----
REPO_BRANCH=current
REPO_NAME=SBo-git
-----

cat<<'EOT'>> ~/.bash_profile
# sbopkg, sqg
export SBOPKG_CONF=$HOME/.sbopkg.conf
EOT

exit

# su - 대신 su를 이용해서 root로 로그인하면 SBOPKG_CONF 환경 변수가 설정되지 않는다.
# 이 경우를 위해 일반 사용자에도 똑같은 SBOPKG_CONF 변수를 추가한다.
cat<<'EOT'>> ~/.bash_profile
# sbopkg, sqg
export SBOPKG_CONF=/root/.sbopkg.conf
EOT

su - # root로 로그인한다.

sbopkg -r # 저장소를 동기화한다.
sqg -a # 큐를 생성한다.

exit

22   LaTeX 설정하기

파이에서 LaTeX까지 쓴다는 건 좀 무거운 느낌이지만 잊어 버릴까 봐 여기 기록한다.

cat<<'EOT'> test.tex
\documentclass{article}
\begin{document}
Test
\end{document}
EOT

pdflatex test.tex # I can't find the format file `pdflatex.fmt'!

슬랙웨어 current에서 TeX 패키지를 TeX Live로 바꾸면서 아직 패키지가 완성되지는 않은 것 같다. mktexlsr을 root에서 실행하면 설치된 TeX 파일들의 목록을 ls-R 파일에 저장한다. 그런 다음 컴파일하면 잘 된다.

su -
mktexlsr
exit

pdflatex test.tex

23   설치 소감

설치한 다음의 소감은 마치 집에 온 듯한 편안한 느낌이다. SD 카드를 차지하는 파일 시스템의 크기는 라즈베리 파이 OS 라이트보다 많이 크다. 라즈베리 파이 OS 라이트의 크기가 1.4GiB인 반면 슬랙웨어는 12GiB이다. 약 8.6 배나 크다. 제대로 비교를 하자면 라즈베리 파이 OS의 풀 버전과 비교를 해야겠지만 예전 라즈비안 시절의 풀 버전밖에 없다. 이것도 6.1GiB로 슬랙웨어의 반이다. 더 제대로 비교를 하려면 어떤 패키지들이 같이 설치되는지 살펴 봐야겠지만 슬랙웨어를 설치하는 주된 이유가 작은 설치에 있지 않고 간단하고 명료한 시스템 관리에 있기 때문에 크게 문제될 것은 없다. 그리고 안 쓰는 패키지는 언제든지 제거할 수 있다. 만약 시스템의 크기가 문제라면 타이니 코어 리눅스를 설치하면 된다. 크기로는 아무도 못 따라 온다. 하지만 약간 내장형 시스템에 더 최적화된 리눅스 배포본이라는 느낌이라서 익숙하지 않고 불편한 점이 있다. 그거야 시간이 해결해 주겠지.

참고문헌

이 칸을 비워 두세요.