

삽화 출처: 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 를 당겨와도 여전히 가상 장치이다. 아무튼 여기까지가 환경 설정이다.