在 Fedora30 中,root用户进行以下操作:
2.3.1 创建磁盘映像文件
[root@localhost minilinux]# pwd
/mnt/iso/minilinux
[root@localhost minilinux]# dd if=/dev/zero of=minilinux_disk.img bs=1M count=128
2.3.2 对磁盘分区
[root@localhost minilinux]# fdisk minilinux_disk.img
命令(输入 m 获取帮助):n
分区类型
p 主分区 (0个主分区,0个扩展分区,4空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认 1): 1
第一个扇区 (2048-262143, 默认 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-262143, 默认 262143):
创建了一个新分区 1,类型为“Linux”,大小为 127 MiB。
命令(输入 m 获取帮助):w
分区表已调整。
正在同步磁盘。
[root@localhost minilinux]#
2.3.3 关联磁盘分区
[root@localhost minilinux]# fdisk -l minilinux_disk.img
Disk minilinux_disk.img:128 MiB,134217728 字节,262144 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0d27477d
设备 启动 起点 末尾 扇区 大小 Id 类型
minilinux_disk.img1 2048 262143 260096 127M 83 Linux
[root@localhost minilinux]# losetup -o 1048576 /dev/loop0 minilinux_disk.img
2.3.4 格式化分区和挂载分区
[root@localhost minilinux]# mkfs.ext4 /dev/loop0
[root@localhost minilinux]# mkdir /mnt/minilinux
[root@localhost minilinux]# mount -t ext4 /dev/loop0 /mnt/minilinux
2.3.5 安装grub2
[root@localhost minilinux]# grub2-install --boot-directory=/mnt/minilinux/boot/ --target=i386-pc --modules=part_msdos minilinux_disk.img
2.3.6 下载、编译内核
[root@localhost ~]# cd /opt/linux-smartphone/linux-kernel/
[root@localhost linux-kernel]# ls
linux-5.1.5.tar.xz
[root@localhost linux-kernel]# tar xJvf linux-5.1.5.tar.xz
[root@localhost linux-kernel]# cd linux-5.1.5/
[root@localhost linux-5.1.5]# make x86_64_defconfig
[root@localhost linux-5.1.5]# make menuconfig
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
[root@localhost linux-5.1.5]# dnf install openssl-devel elfutils-libelf-devel
[root@localhost linux-5.1.5]# make -j4 bzImage
[root@localhost linux-5.1.5]# cp arch/x86/boot/bzImage /mnt/minilinux/boot/
2.3.7 制作initrd
[root@localhost minilinux]# pwd
/mnt/iso/minilinux
[root@localhost minilinux]# dd if=/dev/zero of=initrd.img bs=1M count=4
[root@localhost minilinux]# mkfs.ext4 initrd.img
[root@localhost minilinux]# mkdir /mnt/rootfs
[root@localhost minilinux]# mount -o loop initrd.img /mnt/rootfs
[root@localhost busybox]# dnf install ncurses-devel
[root@localhost busybox]# tar xjvf busybox-1.30.1.tar.bz2
[root@localhost busybox]# cd busybox-1.30.1/
[root@localhost busybox-1.30.1]# make menuconfig
勾选下面的选项:
Settings --->
--- Build Options
[*] Build static binary (no shared libs)
[root@localhost busybox-1.30.1]# dnf install glibc-static
[root@localhost busybox-1.30.1]# make -j4
[root@localhost busybox-1.30.1]# make CONFIG_PREFIX=/mnt/rootfs install
[root@localhost busybox-1.30.1]# mkdir -p /mnt/rootfs/etc/init.d/
[root@localhost busybox-1.30.1]# gedit /mnt/rootfs/etc/init.d/rcS
#!/bin/busybox sh
echo "Hello miniLinux!"
[root@localhost busybox-1.30.1]# chmod +x /mnt/rootfs/etc/init.d/rcS
[root@localhost busybox-1.30.1]# mkdir /mnt/rootfs/dev
[root@localhost busybox-1.30.1]# mknod /mnt/rootfs/dev/console c 5 1
[root@localhost busybox-1.30.1]# mknod /mnt/rootfs/dev/ram b 1 0
[root@localhost busybox-1.30.1]# umount /mnt/rootfs
最后生成的 initrd.img文件就是根文件系统
[root@localhost minilinux]# cp initrd.img /mnt/minilinux/boot/
[root@localhost minilinux]# ls /mnt/minilinux/boot/
bzImage grub2 initrd.img
[root@localhost minilinux]#
2.3.8 编写grub.cfg
[root@localhost minilinux]# cd /mnt/minilinux/boot/grub2
[root@localhost grub2]# cat > grub.cfg << EOF
menuentry "minilinux" {
linux (hd0,msdos1)/boot/bzImage root=/dev/ram rw init=/linuxrc
#linux (hd0,msdos1)/boot/bzImage console=tty0
initrd (hd0,msdos1)/boot/initrd.img
}
EOF
2.4 从VirtualBox运行Linux
[root@localhost ~]# cd /mnt/iso/minilinux/
[root@localhost minilinux]# ls
initrd.img minilinux_disk.img minilinux_disk.raw minilinux_disk.vdi
[root@localhost minilinux]#
qemu-img convert minilinux_disk.img -O raw minilinux_disk.raw
VBoxManage convertdd minilinux_disk.raw minilinux_disk.vdi