NXP

Linux + Busybox 最小Linux

2019-07-12 12:41发布

  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 之间通信