笨方法制作 NetBSD 9 LiveCD
过程:
- 在 Windows 10 的 VirtualBox 里创建虚拟机,安装好 NetBSD 9 64位的系统
- 在 NetBSD 系统里,用 pkg_add 安装好mklivecd,用来自动生成netbsd内核及文件系统
- 可能因为mklivedcd没有更新,自动创建好的iso文件在虚拟机里测试,自动挂载临时文件系统时会报错,如提示找不到/rescure/mount_mfs等程序。Mounthing memory filesystem directories: dev, eval: /rescure/mount_mfs: not found...临时的解决办法是从根目录的相应位置将提到的程序复制到/rescure目录里
- 用mklivecd自动制作的iso文件,在带有光驱设备的虚拟机或带有IPMI虚拟光驱的服务器里测试,是可运行的,boot device:cd0 root on cdoa dumps on cd0b。但在使用pxelinux或grub的环境中无法找到文件系统,启动屏幕信息停留在 boot device:
root device: - 尝试转到grub引导方向。新建一个虚拟机,安装debian 10系统,用于grub引导测试。先是尝试用grub的knetbsd来引导mklivecd和netbsd官方的安装iso,都是提示如之前的错误提示,找不到文件root设备。按网上的教程,grub的kfreebsd是能成功引导FreeBSD的新版本安装镜像,但必须添加相应的模块和参数,如 kfreebsd_module ${freebsd_root}/cd.iso type=mfs_root, set kFreeBSD.vfs.root.mountfrom="cd9660:/dev/md0", set kFreeBSD.vfs.root.mountfrom.options=ro 我死搬硬套,将FreeBSD字样换成netbsd,无效。翻看grub的资料后,grub在knetbsd加载内核后,可以通过knetbsd_module_elf来加载安装光盘里的miniroot.kmod,成功启动,可以看到netbsd的安装欢迎信息。但我不知道如何将文件系统镜像塞到miniroot.kmod中,尝试在netbsd虚拟机里make miniroot.kmod,无预期效果(miniroot.kmod的个头不会增加,还是仅几百KB)
- 翻看netbsd的资料,是可以将ramdisk塞到内核netbsd中,ramdisk的程序可以通过list配置文件来增加。但我尝试很多次,均无法添加如可远程连接的程序,如telnetd,sshd和dropbear。用默认的ramdisk配置生成的文件塞到内核netbsd后,在grub是能直接knetbsd引导后启动,是netbsd的安装欢迎信息
- 尝试直接将mklivecd生成的iso目录创建ramdisk,然后塞到netbsd内核中,之后grub尝试加载netbsd内核,VirtualBox报错,Guru Meditation,强制退出虚拟机。估计netbsd的内核个头太大了,当时netbsd的内核约有230M
- 尝试通过crunchgen来生成静态、精简的程序,如只包括必须的init, login等,以减小ramdisk的个头,但失败,会报哪个未定义等等,即使已经将Makefile里提到的libs库都写到配置文件中,总crunchgen不成
- 回到mklivecd生成的iso目录(如netbsd安装说明提到的,最小化安装仅需base.tar.xz和etc.tar.xz),尝试先移除一些非必要的目录,如firmware(主要包含无线网卡的驱动文件);删除了netbsd内核,因为要的是文件系统,不是内核文件本身。然后看到usr目录占得多,干脆就先移走原来的usr/bin和usr/sbin目录,再测试要用到哪个程序,如login能不能用,不能用就将程序放回;删除几个非必须的usr/lib大个头文件。反复测试,直到将文件系统iso的目录大小减小到约83M(约95M带有ramdisk的netbsd内核可在grub成功引导)。用如
/usr/src/obj/tooldir.NetBSD-9.0-amd64/bin/nbmakefs -t ffs -s 65093632 ramdisk.fs.tmp iso
的命令生成指定大小的ramdisk.fs文件。用如/usr/src/obj/tooldir.NetBSD-9.0-amd64/bin/x86_64--netbsd-mdsetimage -v netbsd ramdisk.fs.tmp
的命令来将ramdisk.fs文件塞到netbsd的内核中。netbsd的内核可用INSTALL的配置文件,指定MEMORY_DISK_ROOT_SIZE=127200
(反复测试后,最大值可能不能超过152500)。最后,用mkisofs -no-emul-boot -J -R -v -b bootxx_cd9660 -o NetBSD-9-LiveCD-3.iso iso2
的命令来生成可启动的iso文件,其中iso2是只包含boot,boot.catalog,boot.cfg,bootxx_cd9660和netbsd内核文件的“精简”目录,这样生成的 NetBSD-9-LiveCD-3.iso 大小约有83M,且能在虚拟机的光驱及debian系统中的grub引导 - 这个iso文件基本上是使用netbsd的默认内核,能识别到多数网卡及设备,默认启动dhcpcd和sshd,系统启动后自动获得IP及准备好sshd连接,默认密码是 drserver38nb 。测试时发现ssh连接提示 PTY allocation request failed on channel 0 ,在/stand里的ramfs_etc.tgz解压后,修改etc/rc.local,添加一行 mount_ptyfs ptyfs /dev/pts 以让系统启动后自动挂载/dev/pts,记得要为rc.local添加执行权限
NetBSD-9-LiveCD-3.iso 保存在“百度网盘”里(链接:https://pan.baidu.com/s/1w8JUC4NiEELrITFHKfSUPQ
提取码:lg3e),有时间玩的话,可以试试。文件验证值是:
- SHA1:59286444F48C64791987F8F2F90F219AEA86A826
- MD5:7103B64BD75460FBE69FF59924BD82D0
ssh root@144.172.126.250
Warning: Permanently added '144.172.126.250' (RSA) to the list of known hosts.
root@144.172.126.250's password:
X11 forwarding request failed on channel 0
NetBSD 9.0 (MKLIVECD_INSTALL_A2) #29: Fri Jul 3 17:50:52 CST 2020
We recommend that you create a non-root account and use su(1) for root access.
localhost# lsls
-sh: lsls: not found
localhost# ls -l /
total 149
-r--r--r-- 1 root wheel 1220 Feb 14 00:06 .cshrc
-r--r--r-- 1 root wheel 701 Feb 14 00:06 .profile
drwxr-xr-x 2 root wheel 1024 Jul 1 14:16 bin
-r--r--r-- 1 root wheel 84408 Jun 30 14:43 boot
-rw-r--r-- 1 root wheel 172 Feb 14 00:06 boot.cfg
-r--r--r-- 1 root wheel 2048 Jun 30 14:43 bootxx_cd9660
drwxr-xr-x 9 root wheel 41472 Jul 3 10:09 dev
drwxr-xr-x 30 root wheel 2048 Jul 3 10:10 etc
drwxr-xr-x 4 root wheel 2560 Feb 14 00:06 lib
drwxr-xr-x 2 root wheel 512 Jul 3 09:32 libdata
drwxr-xr-x 5 root wheel 512 Feb 14 00:06 libexec
drwxr-xr-x 2 root wheel 512 Feb 14 00:06 mnt
drwxrwxrwt 6 root wheel 512 Jul 3 10:09 ramfs
drwxr-xr-x 2 root wheel 512 Jun 21 15:34 rescue
drwxr-xr-x 2 root wheel 512 Jul 3 10:09 root
drwxr-xr-x 2 root wheel 3072 Jul 1 14:16 sbin
drwxr-xr-x 2 root wheel 512 Jul 3 07:54 stand
drwxrwxrwt 3 root wheel 512 Jul 3 10:12 tmp
drwxr-xr-x 10 root wheel 512 Jul 3 09:33 usr
drwxr-xr-x 24 root wheel 512 Jul 3 10:09 var
参考:
- https://cdn.netbsd.org/pub/pkgsrc/current/pkgsrc/sysutils/mklivecd/README.html
- https://wiki.syslinux.org/wiki/index.php?title=MEMDISK
- https://www.gnu.org/software/grub/manual/grub/html_node/NetBSD.html
- https://www.gnu.org/software/grub/manual/grub/html_node/Loopback-booting.html#Loopback-booting
- https://blog.cvhc.cc/html/en/20190206_freebsd_netboot_in_simple_pxe.html
- https://wiki.netbsd.org/tutorials/how_to_create_bootable_netbsd_image/
- http://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/rescue/list
- https://www.freebsd.org/cgi/man.cgi?query=crunchgen&sektion=1&n=1
- http://www.reedmedia.net/misc/netbsd/live-cd.html
- http://www.horizon9.org/~geroy/embedded/netbsd-embedded.txt
- https://yazzy.org/docs/NetBSD/netbsd-on-cf.txt
- https://www.freebsd.org/cgi/man.cgi?query=mkisofs&sektion=8&manpath=freebsd-release-ports
- https://www.netbsd.org/docs/guide/en/chap-exinst.html
- ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-9.0/source/sets/
- https://www.alti.at/knowhow/obsdlivecd/index.php
- https://stackoverflow.com/questions/27021641/how-to-fix-request-failed-on-channel-0
- https://mfsbsd.vx.sk/
- https://en.wikipedia.org/wiki/Guru_Meditation