-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathminirootfs.sh
executable file
·179 lines (153 loc) · 3.98 KB
/
minirootfs.sh
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#!/bin/bash
set -e
cd "$(dirname "${0}")"
if [ $# -ne 1 ]; then
echo "error: usage: ${0} <toolchain_prefix>"
exit 1
fi
if [ "$(id -u)" != "0" ]; then
echo error: must be root, use fakeroot command
exit 1
fi
toolchain=${1}
cc=${toolchain}gcc
if [ -z "$(which $cc)" ]; then
echo error: toolchain not found: $cc
exit 1
fi
stage_dir=/tmp/rootfs-$$
cwd_dir=$(pwd)
sysroot_dir=$($cc --print-sysroot)
ncore=$(nproc)
if [ ! -d "$sysroot_dir" ]; then
echo error: sysroot folder not found: $sysroot_dir
exit 1
fi
cleanup() {
[ ! -d "$stage_dir" ] || rm -rf "$stage_dir" >/dev/null 2>&1
}
trap cleanup INT ERR TERM EXIT
echo -e "\nBuild rootfs structure\n"
mkdir "$stage_dir"
mkdev() {
if [ $# -ne 5 ]; then
return 1
fi
mknod $1 $2 $3 $4 || return 1
chmod $5 $1 || return 1
return 0
}
# basic directories
cd "$stage_dir"
mkdir proc
mkdir sys
mkdir dev
mkdir lib
mkdir usr
mkdir usr/sbin
mkdir var
mkdir var/run
mkdir var/log
mkdir var/lock
mkdir etc
mkdir sbin
mkdir bin
mkdir tmp
mkdir mnt
mkdir mnt/floppy
mkdir mnt/rwfs
mkdir root
mkdir home
# create devices
mkdir dev/pts
mkdir dev/net
mkdir dev/shm
mkdir dev/input
mkdir dev/misc
mkdev dev/tty c 5 0 666
mkdev dev/tty1 c 4 1 666
mkdev dev/tty2 c 4 2 666
mkdev dev/tty3 c 4 3 666
mkdev dev/tty4 c 4 4 666
mkdev dev/ttyS0 c 4 64 666
mkdev dev/console c 5 1 666
mkdev dev/null c 1 3 666
mkdev dev/zero c 1 5 666
mkdev dev/random c 1 8 666
mkdev dev/urandom c 1 9 666
mkdev dev/mem c 1 1 640
mkdev dev/kmem c 1 2 640
mkdev dev/kmsg c 1 11 640
mkdev dev/ram b 1 1 640
mkdev dev/ram0 b 1 0 640
mkdev dev/ram1 b 1 1 640
mkdev dev/ram2 b 1 2 640
mkdev dev/ram3 b 1 3 640
mkdev dev/loop b 7 0 640
mkdev dev/ptmx c 5 2 666
mkdev dev/fb0 c 29 0 640
mkdev dev/watchdog c 10 130 666
mkdev dev/rtc c 254 0 666
mkdev dev/mtd0 c 90 0 640
mkdev dev/mtd1 c 90 2 640
mkdev dev/mtd2 c 90 4 640
mkdev dev/mtd3 c 90 6 640
mkdev dev/mtd4 c 90 8 640
mkdev dev/mtd5 c 90 10 640
mkdev dev/mtd6 c 90 12 640
mkdev dev/mtdblock0 b 31 0 640
mkdev dev/mtdblock1 b 31 1 640
mkdev dev/mtdblock2 b 31 2 640
mkdev dev/mtdblock3 b 31 3 640
mkdev dev/mtdblock4 b 31 4 640
mkdev dev/mtdblock5 b 31 5 640
mkdev dev/mtdblock6 b 31 6 640
mkdev dev/mmcblk0 c 179 0 640
mkdev dev/mmcblk0p1 c 179 1 640
mkdev dev/net/tun c 10 200 660
mkdev dev/i2c-0 c 89 0 660
mkdev dev/i2c-1 c 89 1 660
# setup /proc
ln -s /proc/self/fd/0 stdin
ln -s /proc/self/fd/1 stdout
ln -s /proc/self/fd/2 stderr
ln -s /proc/mounts etc/mtab
ln -s /sbin/init init
# copy libc dynamic libraries
echo -e "\nCopy dynamic libraries\n"
for d in etc bin sbin lib usr/bin usr/sbin usr/lib; do
if [ -d "$sysroot_dir/$d" ]; then
mkdir -p "$stage_dir/$d"
rsync -rlpDS "$sysroot_dir/$d"/ "$stage_dir/$d"/
fi
done
# build busybox
echo -e "\nBuild busybox\n"
busybox_ver=1.36.1
busybox_dir=busybox-${busybox_ver}
busybox_tar=busybox-${busybox_ver}.tar.bz2
[ ! -f "$cwd_dir/$busybox_tar" ] \
&& wget https://busybox.net/downloads/$busybox_tar -O "$cwd_dir/$busybox_tar"
[ ! -d "$cwd_dir/$busybox_dir" ] \
&& tar -C "$cwd_dir" -xvf "$cwd_dir/$busybox_tar"
cd "$cwd_dir/${busybox_dir}"
rsync -a "$cwd_dir"/busybox-${busybox_ver}.config .config
make ARCH=arm CROSS_COMPILE=$toolchain -j$ncore
make ARCH=arm CROSS_COMPILE=$toolchain CONFIG_PREFIX="$stage_dir" install
cd -
# copy skeleton files
echo -e "\nCopy skeleton files\n"
rsync -a "$cwd_dir"/skel/ "$stage_dir"
# clean rootfs
echo -e "\nStrip rootfs\n"
for d in locale gconv; do
find "$stage_dir" -type d -name "$d" | xargs rm -rf
done
find "$stage_dir" -type f \( -name "*.o" -o -name "*.a" \) | xargs rm -rf
find "$stage_dir" -type f -executable |\
xargs -I{} file --separator " " "{}" | grep ARM | awk '{print $1}' |\
xargs -I{} ${toolchain}strip -s "{}"
# create initramfs
echo -e "\nCreate initramfs\n"
find . | cpio --quiet -H newc -o | gzip -9 -n > "$cwd_dir"/initramfs.cpio.gz
echo -e "\nDone\n"