
최근 서점에서 '실전! 러스트로 배우는 리눅스 커널 프로그래밍' 이라는 책을 구입하였습니다. 그래서 보면서 따라하다가 그동안 버전 변경 때문인지 생각보다 `make menuconfig`에서 Rust 항목을 활성화 시키는 것부터 어려웠습니다. 그래서 혹시 저처럼 해당 책이나 Docs를 보면서 시작하고 싶으신 분들을 위해 간략하게 세팅 과정을 남겨봅니다.
참고로 저는 Arch Linux과 vim를 쓰는지라 사용하시는 Distro랑 텍스트 에디터에 맞게 변경하시면 됩니다. 폴더는 위치만 잘 찾으면 돼서 그렇게 중요하진 않으니 적절하게 배치하시면 됩니다.
// 필요한 패키지 설치
yay -S bc llvm clang lld llvm-libs git ncurses base-devel vim
// Rust 설치
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
// Rust for Linux 커널소스 클론
git clone https://github.com/Rust-for-Linux/linux.git
// Linux 커널 소스 폴더로 이동
cd /path/to/linux
// 필요한 도구들 설치
rustup override set $(scripts/min-tool-version.sh rustc)
cargo install --locked --version $(scripts/min-tool-version.sh bindgen) bindgen-cli
rustup component add rust-src
// make menuconfig에서 Rust 메뉴 활성화, Rust라서 LLVM=1 활성화를 추천
make LLVM=1 rustavailable
// Rust bindings generator 'bindgen' < 0.69.5 together with libclang >= 19.1 및 Error가 나오면 아래 파일 편집
vim scripts/min-tool-version.sh
// bindgen을 표시된 버전으로 설정 후 도구들 재설치
cargo install --locked --version $(scripts/min-tool-version.sh bindgen) bindgen-cli
rustup component add rust-src
// 재시도
make LLVM=1 rustavailable
// 안 될시 패키지 설치
yay -S rust-src rust-bindgen
// General Setup에 Rust가 있는지 확인
make LLVM=1 menuconfig
// 없으면 "/" -> "Rust" 검색 후 필요한 Rustc 최소 버전 확인
// rustc를 최소 버전으로 수정 후 rustc 덮어쓰기
vim scripts/min-tool.version.sh
rustup override set $(scripts/min-tool-version.sh rustc)
// General setup에서 Rust support 활성화
make LLVM=1 menuconfig
// 커널 빌드, -j$(nproc --all)은 CPU의 모든 코어를 사용하는 옵션
make LLVM=1 -j$(nproc --all)
// 빌드된 커널 확인
ls arch/x86_64/boot/bzImage
// QEMU 패키지 설치
yay -S qemu-full libvirt virt-manager bridge-utils dnsmasq iptables-nft ebtables
// busybox 리포지토리 클론 || busybox source 다운 후 압축 해제
git clone https://github.com/mirror/busybox.git
// busybox 폴더로 이동
cd /path/to/busybox
// busybox 설정 수정
make menuconfig
// ncurses header 오류 발생 시 아래 파일의 50번째쯤 줄의 main()에 int 추가
vim scripts/kconfig/lxdialog/check-lxdialog.sh
```
#include CURSES_LOC
int main() {}
EOF
```
// 재시도 후 Settings의 Build static binary (no shared libs) 활성화
make menuconfig
// 상위 폴더에 busybox_install_result 라는 폴더로 빌드
make install CONFIG_PREFIX=../busybox_install_result
// 루트 파일 시스템이 될 디렉토리를 생성
mkdir -p initramfs
cd initramfs
mkdir -p bin sbin etc proc sys usr/bin usr/sbin
// busybox 빌드 결과물을 모두 복사
cp -a ../busybox_install_result/* .
// init 스크립트를 initramfs 폴더 최상단에 생성
vim init
```
#!/bin/sh
/bin/mount -t devtmpfs devtmpfs /dev
/bin/mount -t proc none /proc
/bin/mount -t sysfs none /sys
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /bin/sh
```
// init에 권한 설정
chmod a+x init
// 루트 파일 시스템 이미지 생성
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz
// 커널 모듈 폴더 생성
mkdir -p kernel_module
// 지금까지 빌드한 파일들로 QEMU 실행
qemu-system-x86_64 -kernel /path/to/linux/arch/x86_64/boot/bzImage -initrd /path/to/initramfs.cpio.gz -nographic -append "console=ttyS0" -virtfs local,path=/path/to/kernel_module,security_model=none,mount_tag=rust_modules
// -virtfs로 지정한 외부 디렉토리 마운트 시도
mkdir mnt
mount -t 9p -o trans=virtio rust_modules mnt
// 마운트 확인
mount
cd mnt
ls -al
// 커널 소스의 러스트 샘플 모듈 빌드
cd /path/to/linux
make LLVM=1 menuconfig
// Kernel hacking -> Sample Kernel code -> Rust Samples에서 <>은 전부 <M>으로, []는 [*]로 활성화 후 빌드
make LLVM=1 -j$(nproc --all)
// 빌드된 샘플 확인
ls samples/rust
// *.ko 파일들 복사
cp samples/rust/*.ko /path/to/kernel_module
// init 파일에서 자동으로 mnt 폴더 생성 후 마운트 되게 수정
cd /path/to/initramfs
vim init
```
#!/bin/sh
/bin/mount -t devtmpfs devtmpfs /dev
/bin/mount -t proc none /proc
/bin/mount -t sysfs none /sys
/bin/mkdir -p /mnt
/bin/mount -t 9p -o trans=virtio rust_modules /mnt
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /bin/sh
```
// QEMU 실행 후 mnt 폴더 확인
qemu-system-x86_64 -kernel /path/to/linux/arch/x86_64/boot/bzImage -initrd /path/to/initramfs.cpio.gz -nographic -append "console=ttyS0" -virtfs local,path=/path/to/kernel_module,security_model=none,mount_tag=rust_modules
cd mnt
ls
// 러스트 샘플 모듈 로딩 및 해지
insmod rust_minimal.ko
lsmod
rmmod rust_minimal.ko
// QEMU 종료는 Ctrl + a -> x
만약 config을 수정 후 재빌드한다면, sample/rust 파일들은 다시 복사를 해야 qemu에서 로딩할 수 있습니다.
cp samples/rust/*.ko /path/to/kernel_module'IT' 카테고리의 다른 글
| Arch Linux 설치 + 추천 세팅 (0) | 2025.11.20 |
|---|---|
| HP Chromebook 11 G9 EE에 Arch Linux 설치 성공 (0) | 2025.10.22 |
| 크롬북에 카카오톡 설치 및 한글 입력 설정 완료 (0) | 2025.06.12 |
| [JAVA] 백준 2556, 10798, 2903, 2869, 5086, 11653 (0) | 2025.05.03 |
| [JAVA] 백준 3003, 2941 (0) | 2025.04.24 |