
2019년형 인텔 맥 프로에 젠투 리눅스와 암호화된 ZFS 루트 볼륨을 설치한 사례다. T2 칩 때문에 부팅 이미지와 부트로더에 패치된 커널이 필요했고, 그래픽카드 온도에 맞춰 팬을 제어하는 스크립트도 마련했다.
중고 맥 프로를 서버로
글쓴이는 메모리와 고성능 그래픽카드 가격이 오른 시장에서 중고 2019년형 맥 프로를 찾았다. 애플이 인텔 아키텍처를 포기하면서 가격이 떨어진 이 모델을 서버로 활용하기로 했다. 세금과 배송비를 포함해 2,066달러를 지불했고, 16코어 Xeon, 메모리 96GB, NVMe 저장장치 1TB가 포함된 기기를 구입했다.
중고 애플 기기를 살 때는 활성화 잠금(Activation Lock)이 걸려 있지 않은지 구매 전에 확인해야 한다. 글쓴이는 리눅스 설치를 위해 보안 부팅 설정을 바꾸려다 이전 사용자의 iCloud 암호를 요구하는 화면을 만났다. 판매자가 이전 사용자와 연락해 기기를 계정에서 제거했지만, 그렇게 해결되지 않았다면 반품해야 했을 수도 있다고 설명한다. 다른 사용자의 계정에 연결된 맥은 암호화나 펌웨어 암호 설정 등 보안 기능 사용도 막을 수 있다.
T2 맥에서 젠투 부팅하기
처음에는 리눅스 설치 가능성을 확인하기 위해 Mint를 설치한 뒤, T2 지원 Ubuntu 이미지로 옮겼다. 하지만 이미지에 포함된 커널이 너무 최신 버전이어서 ZFS DKIM 모듈을 컴파일할 수 없었다. 이전 버전의 Ubuntu 이미지에서도 같은 문제가 발생했다. T2 위키에서 안내한 젠투 오버레이는 2년간 갱신되지 않은 상태였지만, 최근 커널에 맞춰 자동으로 갱신하는 다른 오버레이를 찾았다.
글쓴이는 원하는 구성을 구체적으로 적은 사양 문서를 대규모 언어 모델에 제공해 T2 맥에서 부팅할 젠투 라이브 이미지와 ZFS를 포함한 빌드 스크립트를 만들었다. 스크립트는 공개 저장소인 t2-gentoo-zfs에서 확인할 수 있다.
디스크에는 EFI 파티션, 스왑 파티션, 기본 볼륨을 만들었다.
Device Start End Sectors Size Type
/dev/nvme0n1p1 256 77055 76800 300M EFI System
/dev/nvme0n1p2 77056 109823 32768 128G Linux swap
/dev/nvme0n1p3 109824 244276223 244166400 931.4G Linux filesystem
이후 기존 메모를 바탕으로 ZFS 루트 볼륨을 구성했다.
# Setup variables
ZFS_ROOT_DISK=nvme-APPLE_SSD_AP-YOUR_UNIQUE_ID-part3
EFI_DISK=nvme-APPLE_SSD_AP-YOUR_UNIQUE_ID-part1
DISK_PASSWD="SomeSuperSecretPassword"
# Disk Encryption Key
echo "$DISK_PASSWD" > /etc/zfs/zroot.key
chmod 000 /etc/zfs/zroot.key
# Setup ZFS Main Volume
zgenhostid
zpool create -f -o ashift=12 \
-o autotrim=on \
-R /mnt/gentoo \
-O compression=lz4 \
-O acltype=posixacl \
-O xattr=sa \
-O relatime=on \
-O encryption=aes-256-gcm \
-O keylocation=file:///etc/zfs/zroot.key \
-O keyformat=passphrase \
-O mountpoint=none \
-O canmount=off \
zroot /dev/disk/by-id/$ZFS_ROOT_DISK
zfs create -o mountpoint=none zroot/ROOT
zfs create -o mountpoint=/ -o canmount=noauto zroot/ROOT/gentoo
# mount root BEFORE creating children
zfs mount zroot/ROOT/gentoo
# I like keeping home and var on their own datasets
zfs create -o mountpoint=/home zroot/home
zfs create -o mountpoint=/var zroot/var
# Needed to book the ZFS volume
zpool set bootfs=zroot/ROOT/gentoo zroot
# Copy ZFS hostid and key into new Gentoo environment
mkdir -p /mnt/gentoo/etc/zfs
cp /etc/hostid /mnt/gentoo/etc/
cp /etc/zfs/zroot.key /mnt/gentoo/etc/zfs/
# Setup EFI
mkfs.fat -F32 "/dev/disk/by-id/$EFI_DISK"
mkdir -p /mnt/gentoo/efi
mount "/dev/disk/by-id/$EFI_DISK" /mnt/gentoo/efi
이후 설치 과정 대부분은 젠투 설치 핸드북을 따르면 된다. 암호화된 ZFS 루트 파티션의 부트로더로는 GRUB 대신 ZFSBootMenu를 사용했다. 부팅 때 암호를 입력해야 하는데, 맥에서는 키보드 입력이 T2 칩을 통과하므로 ZFSBootMenu에도 T2 패치 커널이 필요했다. 글쓴이는 ZFSBootMenu 빌드 요구사항을 모델에 제공해 T2 지원 EFI를 만드는 스크립트도 작성했다.
글쓴이는 모델을 이용해 특정 작업에 맞는 스크립트와 결정론적 코드를 만들면, 나중에 커널 버전을 바꿔 같은 도구로 이미지를 다시 빌드할 수 있다고 설명한다. 다른 사람도 결과물을 직접 빌드할 수 있다는 점도 언급했다.
GPU 온도에 맞춘 팬 제어
기기에 포함된 AMD Radeon Pro W5700X MPX 모듈에는 자체 팬이 없고, 큰 케이스 팬이 공기를 밀어 넣는다. 젠투 패키지 트리의 mpbfan은 CPU 온도만 감시하며 GPU 온도는 보지 않는다. 다른 팬 제어 도구도 찾았지만, 해당 도구는 Proxmox에서 윈도 가상 머신을 통해 그래픽카드 온도 정보를 호스트로 전달하는 구성이었다.
두 도구 모두 MPX 모듈의 GPU 온도에 따라 팬 속도를 올리지 못했다. 글쓴이는 두 번째 프로젝트의 문서를 참고해 명령줄에서 팬을 직접 조절하는 방법을 살펴보고, 모델을 이용해 원하는 기능과 기록 기능을 포함한 스크립트를 만들었다. 이 스크립트를 /usr/local/sbin/t2-fans에 저장하고 실행 가능하게 설정했다.
#!/bin/bash
# t2-fans: Mac Pro 2019 (T2) fan control from max(CPU, GPU) temperature
VERBOSE=true
LOW=50 # °C: at or below, fans go back to Apple automatic control
HIGH=85 # °C: at or above, fans run at max
STEP=100 # RPM: round targets to this step (fewer SMC writes and log lines)
SMC=$(dirname "$(find /sys/devices -path '*APP0001*' -name fan1_min 2>/dev/null | head -1)")
GPU=$(dirname "$(grep -l amdgpu /sys/class/hwmon/hwmon*/name | head -1)")
CPU=$(dirname "$(grep -l coretemp /sys/class/hwmon/hwmon*/name | head -1)")
[ -f "$SMC/fan1_manual" ] || { echo "SMC fan controls not found"; exit 1; }
log() { [ "$VERBOSE" = true ] && echo "$(date '+%F %T') $*"; }
cleanup() {
for m in "$SMC"/fan*_manual; do echo 0 > "$m"; done
log "exiting, all fans back to auto"
}
trap cleanup EXIT
trap 'exit' INT TERM
log "started: SMC=$SMC GPU=$GPU CPU=$CPU LOW=${LOW}C HIGH=${HIGH}C"
declare -A LAST
while true; do
g=$(cat "$GPU/temp2_input" 2>/dev/null || cat "$GPU/temp1_input" 2>/dev/null || echo 0)
c=$(cat "$CPU"/temp*_input 2>/dev/null | sort -n | tail -1); c=${c:-0}
gc=$(( g / 1000 )); cc=$(( c / 1000 ))
t=$(( gc > cc ? gc : cc ))
changes=""
for f in "$SMC"/fan*_manual; do
n=${f%_manual}; name=${n##*/}
if [ "$t" -le "$LOW" ]; then
state=auto
[ "$(cat "$f")" != 0 ] && echo 0 > "$f"
else
base=$(cat "${n}_min"); max=$(cat "${n}_max")
if [ "$t" -ge "$HIGH" ]; then target=$max
else
target=$(( base + (max - base) * (t - LOW) / (HIGH - LOW) ))
target=$(( (target + STEP / 2) / STEP * STEP ))
[ "$target" -lt "$base" ] && target=$base
[ "$target" -gt "$max" ] && target=$max
fi
state=$target
[ "$(cat "$f")" != 1 ] && echo 1 > "$f"
[ "${LAST[$name]}" != "$state" ] && echo "$target" > "${n}_output"
fi
if [ "${LAST[$name]}" != "$state" ]; then
changes+=" $name=$state"
LAST[$name]=$state
fi
done
[ -n "$changes" ] && log "cpu=${cc}C gpu=${gc}C ->$changes"
sleep 3
done
모델은 별도로 요청하지 않았는데도 openrc 초기화 스크립트도 만들었다. 글쓴이는 이를 /etc/init.d/t2-fans에 저장하고 실행 가능하게 만든 뒤 rc-update add t2-fans default 명령으로 시작 시 실행하도록 설정했다. 최신 스크립트는 t2-gentoo-zfs/fans에서 볼 수 있다.
#!/sbin/openrc-run
description="Raise Mac Pro fan minimums from CPU/GPU temperature"
command="/usr/local/sbin/t2-fans"
command_background=true
pidfile="/run/${RC_SVCNAME}.pid"
supervisor=supervise-daemon
respawn_delay=5
output_log="/var/log/t2-fans.log"
error_log="/var/log/t2-fans.log"
depend() {
after modules
}
글쓴이는 현재까지는 작동하는 것으로 보이지만, 중요한 기능을 셸 스크립트에 맡기는 방식이 마음에 들지 않아 나중에 다시 검토할 수 있다고 덧붙였다.
그래픽카드 활용 계획
글쓴이는 기본 탑재된 W5700X로 기존 도커 이미지를 이용한 작업을 실행했다. 독자적인 전원 커넥터를 쓰는 맥 프로에 일반 PCI-E 그래픽카드를 연결하기 위해 표준 어댑터 케이블을 주문했으며, 적절한 케이블을 쓰면 기본 전원 공급 장치로 3080-Ti와 R9700도 구동할 수 있을 것으로 예상했다.
외부 전원 공급 장치를 추가해 5090도 장착하는 방안은 검토했지만, 이 기기의 최대 그래픽카드 길이는 12인치로 보유한 5090보다 훨씬 짧아 장착할 수 없었다. 글쓴이는 그래픽카드 세 장과 메모리 96GB면 이미지 생성, 영상 생성, 소형 언어 모델과 의사결정 모델을 실행하기에 충분하다고 봤다. 이를 통해 앞으로 일부 프로젝트에서 클라우드 서비스 의존도를 낮추려 한다.
관련 자료: T2 Linux 위키의 젠투 설치 안내, T2 맥에서 리눅스를 실행할 때의 문제, vimproved/t2-overlay, pierolenzo/t2-overlay, mbpfan, mac-pro-fan-control.
시장 배경과 그래픽카드 관련 참고 자료: NVIDIA Has GPUs If You Have Coin, The RTX 5090 Was Already Discontinued (For Gamers), Why Does the M2 Mac Pro Exist?.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요