삽화 출처: https://www.contribution.ac/
Linux Kernel Networking Stack
멘토: 유태희님
커널 빌드를 위한 Linux
환경, 커널 테스트를 위한 Linux
환경 구성
현 시점에서는 IBM Cloud
사용 예정. 08월 이후에는 호스트 머신으로 옮겨서 Native
환경에서 운영할 예정.
테스트 환경도 위와 동일한 호스트 머신. 빌드 환경
에서 빌드한 리눅스 커널을 QEMU
위에 올리고 NIC
를 bind
하여 실행.
SR-IOV
(Single-Root I/O Virtualization) 는 단일 PCI Express(PCIe) 장치에서 VF (Virtual Function) 라는 여러 개의 개별 PCI 장치를 호스트 시스템에 제공할 수 있도록 하는 사양이다.
PCI: Peripheral Component Interconnect
VFIO: Virtual Function I/O
NIC: Network Interface Card
솔직히 잘은 모르겠고 아무튼 NIC
가 이 기능을 지원해줘야 QEMU
에서 NIC
를 당겨 받아서 bind
할 수 있다는 것 같다. 일단 현 시점에서는 NIC
의 SR-IOV
지원 여부를 확인해야 한다.
출처: https://www.digikey.kr/ko/products/detail/startech.com/PNL9M16/21398508
요즈음 나오는 메인보드는 Serial Port
를 외부로 빼지 않고 Internal Serial Port (10-pin)
만을 지원한다. 따라서 위의 경우 COM
포트 변환 장비를 따로 사용해야 한다.
추천서적: 리눅스 네트워크의 이해 (크리스찬 벤베누띠)
어찌저찌 간신히 중고로 구함. 사장님께서 감사하게도 군인이라고 배송비를 깎아주셨다 ^^
일단은 여기에 있는 글을 읽고 네트워크에 대한 배경지식을 확보할 예정.
https://d2.naver.com/helloworld/47667
사용할 리눅스 커널 네트워킹 스택은 net
과 net-next
이다. net
branch 는 bugfix 용도로만 사용되며, 그 외의 모든 패치는 net-next
에서 진행된다.
net
branch 는 2주에 한번 꼴로 토발즈 tree 로 PR 을 날리고, net-next
는 정식 릴리즈(non-RC) 될때만 PR 을 날리며 이는 대략 2~3달 정도이다.
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/
Kernel
빌드하기git clone https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
mv net linux-kernel
what?????
sudo dnf install bc
mkdir build
make ARCH=x86_64 O=build/ defconfig
make ARCH=x86_64 O=build/ -j$(nproc)
rootfs
빌드하기buildroot
다운로드# https://buildroot.org/download.html
wget https://buildroot.org/downloads/buildroot-2024.02.4.tar.gz
tar -xvzf buildroot-2024.02.4.tar.gz
rm buildroot-2024.02.4.tar.gz
mv buildroot-2024.02.4 buildroot
필자는 최신 버전으로 다운로드 받았다.
make qemu_x86_64_defconfig
make menuconfig
# System Configuration > Run a getty (login prompt) after boot >
# TTY port = ttyS0
make -j$(nproc)
엄청 오래 걸린다. 대략 1시간?
#/bin/bash
qemu-system-x86_64 \
-M pc \
-kernel $HOME/linux-kernel/build/arch/x86_64/boot/bzImage \
-drive file=$HOME/buildroot/output/images/rootfs.ext2,if=virtio,format=raw,id=hd0 \
-append "console=ttyS0 root=/dev/vda" \
-net nic \
-nographic
지금은 아쉽게도 클라우드 환경인지라 Host
머신의 NIC
를 당겨와도 여전히 가상 장치이다. 아무튼 여기까지가 환경 설정이다.