BusyBox自建根文件系统完善

添加根文件系统动态库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mkdir lib
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib
cp *so* *.a ~/rootfs/lib/ -d

rm ~/rootfs/lib/ld-linux-armhf.so.3
cp ld-linux-armhf.so.3 ~/rootfs/lib/
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a ~/rootfs/lib/ -d

mkdir ~/rootfs/usr/lib
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a ~/rootfs/usr/lib/ -d
cd ~/rootfs
du ./lib ./usr/lib/ -sh

mkdir dev
mkdir proc
mkdir mnt
mkdir sys
mkdir tmp
mkdir root

uboot NFS挂载

1
2
3
root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>
root=/dev/nfs nfsroot=192.168.3.138:/home/xcc/nfs/rootfs,proto=tcp rw ip=192.168.3.110:192.168.3.138:192.168.3.1:255.255.255.0::eth0:off
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.3.138:/home/xcc/nfs/rootfs,proto=tcp rw ip=192.168.3.197:192.168.3.138:192.168.3.1:255.255.255.0::eth0:off'
1
2
3
4
5
6
7
8
9
run loadfdt
run loadimage
bootz 80800000 - 83000000

mkdir -p etc/init.d

nano etc/init.d/rcS

chmod 777 etc/init.d/rcS

内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel

#网络开机自启动设置
ifconfig eth0 up
#udhcpc -i eth0
ifconfig eth0 192.168.1.251 netmask 255.255.255.0
route add default gw 192.168.1.1

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

nano etc/fstab

1
2
3
4
#<file system> <mount point> <type> <options> <dump> <pass> 
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0

nano etc/inittab

1
2
3
4
5
6
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r 7 ::shutdown:/sbin/swapoff -a

nfs install

1
2
3
4
5
6
7
8
9
sudo apt-get install nfs-kernel-server rpcbind
sudo vi /etc/exports
mkdir nfs && chmod 777 nfs
/home/xcc/nfs *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart

sudo vim /etc/default/nfs-kernel-server
降低nfs版本,不然内核不能使用挂载
RPCNFSDCOUNT="-V 2 8"

tftp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sudo apt-get install xinetd -y
sudo apt-get install tftp-hpa tftpd-hpa -y
mkdir tftp && chmod 777 tftp
sudo vi /etc/default/tftpd-hpa
sudo vi /etc/xinetd.d/tftp
server tftp
{
socket_type = dgram
wait = yes
disable = no
user = root
protocol = udp
server = /usr/sbin/in.tftpd
server_args = -s /home/xcc/tftp -c
#log_on_success += PID HOST DURATION
#log_on_failure += HOST
per_source = 11
cps =100 2
flags =IPv4
}

sudo service tftpd-hpa restart
sudo service xinetd restart

自建roofs打包

1
2
cd rootfs/
tar -vcjf rootfs.tar.bz2 *
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/bash

busybox_dir=$HOME/imx6ull/busybox
kernel_dir=$HOME/imx6ull/kernel
gcc_lib_root=/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf

share_dir=$HOME/imx6ull/nfs
rootfs_dir=$share_dir/rootfs

dtb_file=imx6ull-alientek-emmc.dtb
device_ip=192.168.3.109
netmask=255.255.255.0
gw=192.168.3.1
nfs_server_ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`

# env
sudo apt update
sudo apt install cmake gcc wget lsb-core lib32stdc++6 libncurses5-dev build-essential lzop -y

rm $share_dir/* -rf
rm $busybox_dir -rf
rm $kernel_dir -rf
mkdir -p $busybox_dir
mkdir -p $kernel_dir
mkdir -p $rootfs_dir
tar -xvf linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7.tar.bz2 -C $kernel_dir
tar -xvf busybox-1.29.0.tar.bz2 -C $busybox_dir
mv $busybox_dir/busybox-1.29.0/{.,}* $busybox_dir

# build
cpu_logic_cnt=`cat /proc/cpuinfo | grep "processor" | wc -l`
cd $kernel_dir
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$cpu_logic_cnt
if [ $? -ne 0 ]; then
exit;
fi

cd $busybox_dir
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
wget http://chengs.run/upload/2023/09/busybox_config -O .config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$cpu_logic_cnt
if [ $? -ne 0 ]; then
exit;
fi

# rootfs
cd $busybox_dir
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=$rootfs_dir install

cd $rootfs_dir
mkdir lib
mkdir -p usr/lib
mkdir dev
mkdir proc
mkdir mnt
mkdir sys
mkdir tmp
mkdir root
mkdir -p etc/init.d

echo "#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel

#网络开机自启动设置
ifconfig eth0 up
# udhcpc -i eth0
# ifconfig eth0 ${device_ip} netmask ${netmask}
# route add default gw ${gw}

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
" > etc/init.d/rcS

chmod 777 etc/init.d/rcS

echo "#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
" > etc/fstab

echo "#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r 7 ::shutdown:/sbin/swapoff -a
" > etc/inittab

echo "nameserver 8.8.8.8
nameserver ${gw}
" > etc/resolv.conf

# rootfs lib
cd $gcc_lib_root/libc/lib
cp *so* *.a $rootfs_dir/lib/ -d
rm $rootfs_dir/lib/ld-linux-armhf.so.3
cp ld-linux-armhf.so.3 $rootfs_dir/lib/

cd $gcc_lib_root/lib
cp *so* *.a $rootfs_dir/lib/ -d

cd $gcc_lib_root/libc/usr/lib
cp *so* *.a $rootfs_dir/usr/lib/ -d

cd $rootfs_dir
du ./lib ./usr/lib/ -sh

# lib test
echo '''
#include <stdio.h>

int main(int argc, const char* argv[])
{
printf("helloworld\n");
return 0;
}
''' >> main.c

arm-linux-gnueabihf-gcc -o main main.c
mv main $rootfs_dir/root
rm main.c

# zImage dtb
cp $kernel_dir/arch/arm/boot/zImage $share_dir
cp $kernel_dir/arch/arm/boot/dts/$dtb_file $share_dir

echo "
# uboot setting
setenv bootcmd 'nfs 80800000 ${nfs_server_ip}:${share_dir}/zImage;nfs 83000000 ${nfs_server_ip}:${share_dir}/${dtb_file};setenv bootargs console=ttymxc0,115200 root=/dev/nfs nfsroot=${nfs_server_ip}:${rootfs_dir},proto=tcp rw ip=${device_ip}:${nfs_server_ip}:${gw}:${netmask}::eth0:off;bootz 80800000 - 83000000;'
"