1,生成镜像文件hd0.img
#构建一个50MB左右的磁盘镜像
dd if=/dev/zero of=hd0.img count=$((63*16*100))
#绑定到一个loop设备
losetup /dev/loop0 hd0.img
#格式化
cfdisk -s 63 -h 16 /dev/loop0
#检查结果
fdisk -lu /dev/loop0
#将分区1挂载到/dev/loop1
losetup /dev/loop1 hd0.img -o $((63*512))
#格式化为ext3
mkfs.ext3 /dev/loop1
##############################################################
2,添加GRUB菜单
mkdir hd0
mount /dev/loop1 hd0
mkdir hd0/boot/grub -p
cp -r /usr/lib/grub/i386-pc/ hd0/boot/grub
cd hd0/boot/grub/
grub-mkimage -O i386-pc -o core.img biosdisk part_msdos ext2
ls -lh core.img
#写入grub启动
echo "(hd0) /dev/loop0" > ./device.map
grub-setup -m ./device.map -d /mnt/img/boot/grub/ -r '(hd0,1)' '(hd0)'
#清理
cd
umount hd0
losetup -d /dev/loop1
losetup -d /dev/loop0
############################################################
3.安装内核
mount hd0.img hd0 -o loop,offset=$((63*512))
cp /usr/src/linux/arch/i386/boot/bzImage hd0/boot/vmlinuz
vim hd0/boot/grub/grub.cfg
# grub.cfg 内容 #############################################
set timeout=10
set default=0
menuentry "Linux-3.0.00" {
set root=(hd0,1)
linux /boot/vmlinuz-3.0.00 root=/dev/hda1
initrd /boot/initrd.img
}
#############################################################
umount hd0
4.制做initrd.img
4.1 busybox
apt source busybox
cd busybox-1.22.0/
make menuconfig
#menuconfig 选择静态连接 Build Options | Build BusyBox as a static binary
make
make install
4.2.1 方法一:制作initrd.img
mkdir initrds
cd initrds
cp ../../busybox-1.22.0/_install/* . -a
##################################
vim init
##################################
linux内核(init/main.c)会调用 /init /sbin/init /etc/init /bin/init /bin/sh 依次运行
# init 内容 这是内核第一个加载的文件##################################
#!/bin/sh
echo "************************************************************"
echo "* Welcome to initrd *"
echo "************************************************************"
echo "Create file path /proc /sys /dev /etc /lib /sysroot"
mkdir proc sys dev etc lib/modules sysroot -p
echo "Create device nodes."
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
#mknod /dev/console c 5 1
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
echo "Mount kernel files."
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o mode=0755 -t tmpfs dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
echo Mount /root
mdev -s
mount -t ext3 /dev/sda1 /sysroot
exec switch_root /sysroot /sbin/init
4.2.2 方法二:
mkdir initrds
cd initrds
cp ../busybox-1.22.0/_install/* . -a
##################################
cp ../busybox-1.22.0/examples/bootfloppy/etc ./ -a
../busybox-1.22.0/busybox mdev -s
#####################
touch init
chmod +x init
vim init
###############当然也可以放在etc/init.d/rc.S里面
#!/bin/sh
mkdir /proc /sys /var
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mkdir /var/tmp /var/modules /var/run /var/log
mdev -s
./linuxrc
####################
#添加功能,支持poweroff
vim etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
console::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::restart:/sbin/init
::shutdown:/bin/umount -a -r
#####################
cat etc/fstab #显示系统默认挂载的文件系统,系统自动挂载,前面使用脚本一样
proc /proc proc defaults 0 0
####################
cat etc/profile #shell配置环境变量
###
export LD_LIBRARY_PATH=/lib:/usr/lib
#构建lib库
mkdir /lib /usr/lib
#复制lib库: libstdc++.so 等。。
#生成initrd.img
find . | cpio -H newc --quiet -o > ../initrd.img
#把initrd.img复制到 hd0.img的文件系统中.
#验证
qemu-system-x86_64 -kernel vmlinuz-4.15.0-45-generic -initrd initrd.img -m 128M
4, 构造文件系统
cd hd0
mkdir bin proc sys dev usr lib/modules -p
mkdir home root mnt -p
#复制Busybox下的_install到这里...(略)
mknod dev/console c 5 1
mknod dev/null c 1 3
#配置inittab文件
####添加驱动到initramfs中;
mkdir /lib/modules/[内核版本]/
如:mkdir lib/modules/4.15.0-45-generic
cat /proc/bus/input/devices #查看键盘和鼠标
lspci #查看PCI设备
cat /proc/bus/usb/devices
lspci -nv #查看PCI参数与信息
8086:100e #8086为厂家,100e为网卡型号,就是e1000网卡驱动 kernel/drivers/net/ethernet/intel/e1000/e1000.ko
sudo apt-get install uml-utilities bridge-utils
uml-utilities : 例如命令 tunctl -t tap0 :创建tap0虚拟网卡
bridge-utils : 例如命令 brctl addbr br0 : 创建br0网桥
https://haoningabc.iteye.com/blog/2306952 不知道原因..
sudo qemu-system-x86_64 -kernel vmlinuz-4.15.0-45-generic -initrd initrd.img -m 256M -net nic,vlan=0,model=e1000,addr=08 -net tap,name=haha,ifname=tap1,script=no,downscript=no
开始:enp0s3 ip 192.168.8.112
sudo brctl addbr virbr0
tunctl -t tap0 -u root
brctl addif virbr0 tap0
ifconfig tap0 0.0.0.0 promisc up
brctl addif virbr0 enp0s3
sudo ifconfig enp0s3 0 up
sudo ifconfig virbr0 192.168.8.112 up
sudo route add default gw 192.168.8.1
sudo sysctl -w net.ipv4.ip_forward=1
sudo qemu-system-x86_64 -kernel vmlinuz-4.15.0-45-generic -initrd initrd.img -m 256M -net nic -net tap,name=haha,ifname=tap0,script=no,downscript=no
qemu:
ifconfig eth0 192.168.8.151
route add default gw 192.168.8.1
只能在qemu 与 ubuntu 之间通信