나는 tftp가 작동할 수 있는 최소한의 커널을 구축하려고 합니다.
나는 busybox를 initramfs로 사용하고 있으며 arm64 가상 머신에서 커널을 실행할 것입니다. 파일을 가져오는 명령은 다음과 같습니다 tftp -g -r axpu_ldd_kc.ko my_ip_addr
(물론 내 tftp 서버가 작동 중입니다). 그러나 응답은 다음과 같습니다:
tftp: sendto: Network is unreachable
그래서 커널 구성(linux-5.10.0-rc5)에 일부 네트워크 항목을 추가했지만 여전히 작동하지 않습니다.
tftp를 작동시키기 위해 추가해야 할 것이 무엇인지 모르겠습니다. 아래 defconfig에서 누락된 것이 무엇인지 말해 줄 수 있습니까? (qemu 가상 머신에서 e1000 사용) (보시다시피 CONFIG_NF_CONNTRACK_TFTP를 추가했는데 menuconfig에서 TFTP를 지원한다고 하더군요. 그리고 .config 파일에는 CONFIG_NF_NAT_TFTP가 =y로 설정되어 있습니다. .config가 너무 길어서 defconfig를 보여줬습니다)
# CONFIG_SWAP is not set
# CONFIG_CROSS_MEMORY_ATTACH is not set
CONFIG_PREEMPT=y
# CONFIG_CPU_ISOLATION is not set
CONFIG_LOG_BUF_SHIFT=12
CONFIG_LOG_CPU_MAX_BUF_SHIFT=10
CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=10
CONFIG_USER_NS=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../../../../ab21sim/ab21tsim/busybox-1.32.1/initramfs.cpio.gz"
# CONFIG_RD_BZIP2 is not set
# CONFIG_RD_LZMA is not set
# CONFIG_RD_XZ is not set
# CONFIG_RD_LZO is not set
# CONFIG_RD_LZ4 is not set
# CONFIG_RD_ZSTD is not set
CONFIG_PERF_EVENTS=y
CONFIG_SLAB=y
CONFIG_NR_CPUS=2
# CONFIG_RODATA_FULL_DEFAULT_ENABLED is not set
# CONFIG_ARM64_TAGGED_ADDR_ABI is not set
# CONFIG_ARM64_UAO is not set
# CONFIG_ARM64_RAS_EXTN is not set
# CONFIG_ARM64_CNP is not set
# CONFIG_ARM64_PTR_AUTH is not set
# CONFIG_ARM64_AMU_EXTN is not set
# CONFIG_ARM64_TLB_RANGE is not set
# CONFIG_ARM64_BTI is not set
# CONFIG_ARM64_E0PD is not set
# CONFIG_ARCH_RANDOM is not set
# CONFIG_ARM64_SVE is not set
# CONFIG_EFI is not set
# CONFIG_SECCOMP is not set
# CONFIG_BLK_DEV_BSG is not set
# CONFIG_MQ_IOSCHED_DEADLINE is not set
# CONFIG_MQ_IOSCHED_KYBER is not set
CONFIG_BINFMT_MISC=y
CONFIG_FLATMEM_MANUAL=y
# CONFIG_COMPACTION is not set
CONFIG_NET=y
CONFIG_INET=y
CONFIG_NETFILTER=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_CONNTRACK_TFTP=y
CONFIG_NF_NAT=y
CONFIG_DEVTMPFS=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=65536
CONFIG_NETDEVICES=y
# CONFIG_KEYBOARD_ATKBD is not set
# CONFIG_INPUT_MOUSE is not set
CONFIG_SERIO_LIBPS2=y
CONFIG_VT_HW_CONSOLE_BINDING=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
# CONFIG_HWMON is not set
# CONFIG_USB_SUPPORT is not set
CONFIG_RTC_CLASS=y
# CONFIG_RTC_HCTOSYS is not set
# CONFIG_RTC_INTF_SYSFS is not set
# CONFIG_RTC_INTF_PROC is not set
# CONFIG_RTC_INTF_DEV is not set
CONFIG_RTC_DRV_M48T59=y
# CONFIG_VHOST_MENU is not set
# CONFIG_IOMMU_SUPPORT is not set
# CONFIG_NVMEM_SYSFS is not set
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
# CONFIG_DNOTIFY is not set
# CONFIG_INOTIFY_USER is not set
CONFIG_AUTOFS4_FS=y
CONFIG_ISO9660_FS=y
CONFIG_PROC_KCORE=y
# CONFIG_MISC_FILESYSTEMS is not set
CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity"
CONFIG_DEBUG_INFO=y
CONFIG_FRAME_WARN=1024
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_KERNEL=y
CONFIG_DETECT_HUNG_TASK=y
# CONFIG_SCHED_DEBUG is not set
# CONFIG_RCU_TRACE is not set
그런데 qemu 명령은 다음과 같습니다.
/home/ckim/ProjX/QEMU/qemu-6.2.0/build-baremetal/aarch64-softmmu/qemu-system-aarch64 -machine ab21q,gic-version=max,secure=off,virtualization=true -cpu max -kernel /home/ckim/ProjX/LinuxDevDrv/kernel-release-RD-INFRA-2020.11.30/arch/arm64/boot/Image -m 2048M -ngraphic -netdev 사용자,id=net0,tftp=/opt/tftp -device e1000 ,netdev=net0 -machine iommu=smmuv3 --append "root=/dev/ram init=/init nokaslr Earlycon ip=dhcp Hugepages=16"
-netdev
및 -device e1000
옵션을 사용하면 user mode
네트워크 백엔드가 qemu에 구현되어 외부 세계와 통신할 수 있습니다. 가상 머신의 IP 주소는 10.0.2.15입니다. 나는 이전에 이 사용자 네트워킹 모델을 여러 번 사용해 왔습니다. (전체 커널 기본 구성을 사용하면 이 tftp는 잘 실행됩니다. 하지만 테스트를 빠르게 실행하기 위해 커널 이미지 크기를 거의 36MB에서 약 6MB로 줄이고 싶습니다.) 여기에서 qemu 네트워크 모드를 확인하세요:https://wiki.qemu.org/Documentation/Networking
추가: (dirkt의 요청에 따라) 내 VM 내부에 DHCP 서버가 있고(위의 네트워킹 설명서 참조) 내 VM에는 고정 IP 주소가 있습니다. 그리고 나의 주인님. 나는 가상 머신의 DHCP 클라이언트가 작동하고 DHCP 서버가 qemu 프로그램에 의해 실행된다고 믿습니다. 따라서 qemu 프로그램은 가상 머신에 네트워크 환경을 제공합니다. 가상 머신에 로그인하여 디버깅할 수 있습니다. (하지만 오늘은 다른 일을 하고 있어요) 이것이 ip addr
명령 응답입니다.
/ # tftp -g -r axpu_ldd_kc.ko 129.254.32.30
tftp: sendto: Network is unreachable
/ # ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
ADD2: (dirkt의 의견에 따라)
PCI와 PCIE, e1000(인텔 이더넷 카드)을 추가했습니다. 그게 전부이길 바라면서요. 그러나 그것은 진실이 아니다. 아래는 쉘의 결과입니다.
ifconfig: SIOCSIFADDR: No such device
route: SIOCADDRT: Network is unreachable
/bin/sh: can't access tty; job control turned off
/ # tftp -g -r axpu_ldd_kc.ko 129.254.32.30
tftp: sendto: Network is unreachable