linux
busybox kernel
Author: WhoAmI
email: kccddb@gmail.com
Date: 20230224
Copyright: CC BY-NC-SA
Interface names:
enp0s3 : NAT
enp0s8 : Bridged Mode
Ubuntu 16.04.7 (server version)
kclai@ubuntu16:/boot$ uname -r
4.4.0-186-generic
kclai@ubuntu16:/boot$
Linux Cross Reference
BusyBox Cross Reference
找一不算離很多且不用patch 的 4.4.x 的版本
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.50.tar.gz
tar xvfz linux-4.4.50.tar.gz
sudo apt install bc
sudo apt-get install libssl-dev
使用 64 bits
meke menuconfig
make
日後再來幫 linux kernel 減肥瘦身
Chapter 11. Kernel build command line reference
kclai@ubuntu16:/share/src/linux-4.4.50/arch/x86/boot$
用 qemu-system-x86_64 測試
sudo qemu-system-x86_64 -machine pc -m 1024 -kernel bzImage -nographic -append "console=ttyS0"
…
2.317362] 6230002000000010 ffff88003e2efe80 ffff88003e2efe18 00000000c86e4
[ 2.317362] Call Trace:
[ 2.317362] [<ffffffff813d8b83>] dump_stack+0x63/0x90
[ 2.317362] [<ffffffff8118aa47>] panic+0xd3/0x215
[ 2.317362] [<ffffffff81f5a576>] mount_block_root+0x201/0x294
[ 2.317362] [<ffffffff81f5a66e>] mount_root+0x65/0x68
[ 2.317362] [<ffffffff81f5a7ab>] prepare_namespace+0x13a/0x172
[ 2.317362] [<ffffffff81f5a21b>] kernel_init_freeable+0x1e9/0x212
[ 2.317362] [<ffffffff81807b50>] ? rest_init+0x80/0x80
[ 2.317362] [<ffffffff81807b5e>] kernel_init+0xe/0xe0
[ 2.317362] [<ffffffff8181468f>] ret_from_fork+0x3f/0x70
[ 2.317362] [<ffffffff81807b50>] ? rest_init+0x80/0x80
[ 2.317362] Kernel Offset: disabled
[ 2.317362] –-[ end Kernel panic - not syncing: VFS: Unable to mount root f)
有時候重造 kernel 可能需要
正常狀況, 因為沒有 rootfs!!!
https://lxr.linux.no/linux+v4.4.50/init/main.c
通常 Linux 版本愈新 通常愈複雜, 最好由 Linux 2.4 以前開始 看kernel source
rest_init();
kernel_init
kclai@ubuntu16:~$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:d5:31:79 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fed5:3179/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:22:41:71 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.31/24 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe22:4171/64 scope link
valid_lft forever preferred_lft forever
kclai@ubuntu16:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 enp0s3
10.0.2.0 * 255.255.255.0 U 0 0 0 enp0s3
192.168.1.0 * 255.255.255.0 U 0 0 0 enp0s8
kclai@ubuntu16:~$
:::
start network
kclai@ubuntu16:~$ cat net.sh
#/bin/sh
sudo ifconfig enp0s8 up
sudo ip addr add 192.168.1.31/24 dev enp0s8
sudo service ssh restart
sudo service ssh status
sudo /etc/init.d/samba reload
kclai@ubuntu16:~$
https://elixir.bootlin.com/busybox/1.22.0/source/include/applets.src.h
kclai@ubuntu16:/share/src$ tar jxvf busybox-1.22.0.tar.bz2
Setup busybox
kclai@ubuntu16:/share/src/busybox-1.22.0$ pwd
/share/src/busybox-1.22.0
kclai@ubuntu16:/share/src/busybox-1.22.0$ make menuconfig
x86 先試試
make
make install
運用 ldd
ldd prints the shared objects (shared libraries) required by each
program or shared object specified on the command line.
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/bin$ ldd busybox
linux-vdso.so.1 => (0x00007ffe1f1cf000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6de0694000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6de02ca000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6de099d000)
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/bin$
上課時 再解釋 如何設計的 (回憶 c Language main(int argc, char argv*[]) 與 symbolic Linux/ UNIX link)
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/bin$ ls -al
total 844
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:15 .
drwxrwxr-x 5 kclai kclai 4096 Oct 2 09:15 ..
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ash -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 base64 -> busybox
-rwxr-xr-x 1 kclai kclai 853592 Oct 2 09:15 busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 cat -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 catv -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 chattr -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 chgrp -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 chmod -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 chown -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 conspy -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 cp -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 cpio -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 cttyhack -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 date -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 dd -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 df -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 dmesg -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 dnsdomainname -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 dumpkmap -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 echo -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ed -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 egrep -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 false -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 fdflush -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 fgrep -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 fsync -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 getopt -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 grep -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 gunzip -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 gzip -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 hostname -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 hush -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ionice -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 iostat -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ipcalc -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 kbd_mode -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 kill -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 linux32 -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 linux64 -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ln -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 login -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ls -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 lsattr -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 lzop -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 makemime -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 mkdir -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 mknod -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 mktemp -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 more -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 mount -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 mountpoint -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 mpstat -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 mt -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 mv -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 netstat -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 nice -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 pidof -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ping -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ping6 -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 pipe_progress -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 printenv -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 ps -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 pwd -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 reformime -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 rev -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 rm -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 rmdir -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 rpm -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 run-parts -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 scriptreplay -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 sed -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 setarch -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 setserial -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 sh -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 sleep -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 stat -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 stty -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 su -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 sync -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 tar -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 touch -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 true -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 umount -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 uname -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 usleep -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 vi -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 watch -> busybox
lrwxrwxrwx 1 kclai kclai 7 Oct 2 09:15 zcat -> busybox
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/bin$
需要 shared libraries:
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ ls
bin linuxrc sbin usr
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ mkdir lib
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ cd lib
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/lib$ cp /lib/x86_64-linux-gnu/libm.so.6 .
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/lib$ ls
libm.so.6
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/lib$ cp /lib/x86_64-linux-gnu/libc.so.6 .
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/lib$ cp /lib64/ld-linux-x86-64.so.2 .
kclai@ubuntu16:/share/src/busybox-1.22.0/_install/lib$
/lib64/ld-linux-x86-64.so.2 我 cp 至錯誤路徑, chroot 測才發現!!!
製造路徑
mkdir proc sys etc etc/init.d dev
dev/console, dev/ram
sudo mknod dev/console c 5 1
sudo mknod dev/ram b 1 0
drwxrwxr-x 10 kclai kclai 4096 Oct 2 09:43 .
drwxr-xr-x 35 kclai kclai 4096 Oct 2 09:15 ..
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:33 bin
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:43 dev
drwxrwxr-x 3 kclai kclai 4096 Oct 2 09:43 etc
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:23 lib
lrwxrwxrwx 1 kclai kclai 11 Oct 2 09:15 linuxrc -> bin/busybox
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:40 proc
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:15 sbin
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:40 sys
drwxrwxr-x 4 kclai kclai 4096 Oct 2 09:15 usr
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$
sudo qemu-system-x86_64 -machine pc -kernel ./bzImage -initrd ./initramfs.gz -nographic -m 512 -append "root=/dev/ram rdinit=/sbin/init console=ttyS0 nokaslr"
上面 /init 只是一些 command 怕自己忘而已, 不是真正 init
find - search for files in a directory hierarchy
cpio- copy files to and from archives
10+ cpio command examples in Linux [Cheat Sheet]
mdev (busybox 的 udev) 透過 netlink socket 與 kernel 溝通 (util-linux/mdev.c, util-linux/util-linux/uevent.c)
產生 tmpfs(temporary file system)
可以 放檔案 (RAM 中), 這裡 20m
/ # mkdir tmpmem
/ # mount -t tmpfs -o size=20m tmpfs /tmpmem
/ # mount
rootfs on / type rootfs (rw)
none on /proc type proc (rw,relatime)
none on /sys type sysfs (rw,relatime)
tmpfs on /tmpmem type tmpfs (rw,relatime,size=20480k)
增加功能
mdev 是 busybox 版的 udev- dynamic device management
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
multilines:
https://stackoverflow.com/questions/12168523/how-does-operator-work-in-linux-shell
kclai@ubuntu16:~$ cat ipshow.sh
#!/bin/sh
ip addr show
ip route
kclai@ubuntu16:~$
Remark. ">" or ">>"
> is used to overwrite a file and >> is used to append to a file.
:::
inittab 放置 etc/
設定 rcS 與 /bin/sh
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ ls -al
total 48
drwxrwxr-x 12 kclai kclai 4096 Oct 2 14:03 .
drwxr-xr-x 35 kclai kclai 4096 Oct 2 09:15 ..
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:33 bin
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:43 dev
drwxrwxr-x 3 kclai kclai 4096 Oct 2 14:02 etc
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:23 lib
lrwxrwxrwx 1 kclai kclai 11 Oct 2 09:15 linuxrc -> bin/busybox
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:40 proc
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:15 sbin
drwxrwxr-x 2 kclai kclai 4096 Oct 2 09:40 sys
drwxrwxr-x 2 kclai kclai 4096 Oct 2 14:03 tmp
drwxrwxr-x 4 kclai kclai 4096 Oct 2 09:15 usr
drwxrwxr-x 2 kclai kclai 4096 Oct 2 14:03 var
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$
用 chroot 測一下
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ sudo chroot /share/src/busybox-1.22.0/_install /bin/ash
chroot: failed to run command ‘/bin/ash’: No such file or directory
錯了~~~xxx
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ ldd bin/busybox
linux-vdso.so.1 => (0x00007fffcb9e2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9e4b9db000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9e4b611000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9e4bce4000)
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$
…
/lib64/ld-linux-x86-64.so.2 我 cp 至錯誤路徑!!!
mkdir lib64
因為 沒有 bash
用 ash 代替
完工!! [choot]) 測試
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ sudo chroot . /bin/ash
/ #
/ # ls
bin etc lib64 proc sys usr
dev lib linuxrc sbin tmp var
/ # ls -al
total 52
drwxrwxr-x 13 1000 1000 4096 Oct 3 00:46 .
drwxrwxr-x 13 1000 1000 4096 Oct 3 00:46 ..
drwxrwxr-x 2 1000 1000 4096 Oct 2 01:33 bin
drwxrwxr-x 2 1000 1000 4096 Oct 3 00:23 dev
drwxrwxr-x 3 1000 1000 4096 Oct 2 06:02 etc
drwxrwxr-x 2 1000 1000 4096 Oct 3 00:47 lib
drwxrwxr-x 2 1000 1000 4096 Oct 3 00:47 lib64
lrwxrwxrwx 1 1000 1000 11 Oct 2 01:15 linuxrc -> bin/busybox
drwxrwxr-x 2 1000 1000 4096 Oct 2 01:40 proc
drwxrwxr-x 2 1000 1000 4096 Oct 2 01:15 sbin
drwxrwxr-x 2 1000 1000 4096 Oct 2 01:40 sys
drwxrwxr-x 2 1000 1000 4096 Oct 2 06:03 tmp
drwxrwxr-x 4 1000 1000 4096 Oct 2 01:15 usr
drwxrwxr-x 2 1000 1000 4096 Oct 2 06:03 var
/ #
/ # exit
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$
cpio- copy files to and from archives
10+ cpio command examples in Linux [Cheat Sheet]
Build rootfs
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ find . | cpio -o –format=newc > ../rootfs.img
kclai@ubuntu16:/share/x86$ ls
bzImage rootfs.img.gz
kclai@ubuntu16:/share/x86$
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ find . | cpio –quiet -H newc -o | gzip -9 -n > /share/imagefile.img.gz
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$
觀察 rootfs 大小
du -ah _install
…
0 _install/bin/ipcalc
0 _install/bin/dnsdomainname
840K _install/bin
4.0K _install/var
4.0K _install/dev
3.9M _install/
dd 指令, 備份及回復資料工具
**注意
dd if=/dev/zero of=/tmp/rootfs-file bs=1k count=4096
mkfs.ext2 /tmp/rootfs-file 4096
kclai@ubuntu16:/share/src/busybox-1.22.0$ mkfs.ext2 /tmp/rootfs-file 4096
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: done
Creating filesystem with 4096 1k blocks and 1024 inodes
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
kclai@ubuntu16:/share/src/busybox-1.22.0$
將 檔案 /tmp/rootfs-file mount 成 file system
sudo mount -o loop -t ext2 /tmp/rootfs-file /share/rootfs
kclai@ubuntu16:/share/src/busybox-1.22.0/_install$ sudo cp -R * /share/rootfs
kclai@ubuntu16:/share$ sudo umount /share/rootfs
[sudo] password for kclai:
kclai@ubuntu16:/share$
此時 我們有 沒壓縮 的 rootfs: /tmp/rootfs-file
loop device
losetup - set up and control loop devices
Using the initial RAM disk (initrd)
10+ losetup command examples in Linux [Cheat Sheet]
Study https://lxr.linux.no/linux+v4.5/drivers/char/mem.c
安裝arm-2013.11-33-arm-none-linux-gnueabi toolchain 與 小的測試 rootfs, init 給 QEMU
HW.
剩下 留給讀者 用QEMU 自行測試