-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmake
More file actions
executable file
·137 lines (116 loc) · 3.3 KB
/
make
File metadata and controls
executable file
·137 lines (116 loc) · 3.3 KB
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
#!/bin/bash
set -e
set -x
export ROOTDIR=$(dirname "$(readlink -f "$0")")
PKGSDIR="$ROOTDIR/pkgs"
cd "$ROOTDIR"
export JOBS=$(nproc)
prepareRootfs() {
sudo rm -rf rootfs
mkdir rootfs
mkdir rootfs/{dev,etc,proc,sys,tmp,usr,run,var}
mkdir -p rootfs/usr/{bin,lib,share,include}
ln -s usr/lib rootfs/lib
ln -s usr/bin rootfs/bin
ln -s ./bin rootfs/usr/sbin
ln -s usr/sbin rootfs/sbin
ln -s ./lib rootfs/usr/lib64
ln -s usr/lib64 rootfs/lib64
ln -s ../etc rootfs/usr/etc
mkdir -p rootfs/{root,home,mnt,lib/modules}
chmod 1777 rootfs/tmp rootfs/run
mkdir -m 755 rootfs/dev/pts
mkdir -m 1777 rootfs/dev/shm
mkdir -p rootfs/var/{cache,log,run,spool,mail}
touch rootfs/var/run/utmp rootfs/var/log/wtmp
chmod 664 rootfs/var/run/utmp rootfs/var/log/wtmp
}
setupUsers() {
local users=("$@")
cd rootfs
touch etc/group etc/passwd etc/shadow
sudo chroot . /bin/sh -c "addgroup -g 0 root"
sudo chroot . /bin/sh -c "addgroup -g 10 uucp"
sudo chroot . /bin/sh -c "adduser -g '' -G root -s /bin/sh -h /root -u 0 root -D"
ROOTPSWD="root"
sudo chroot . /bin/sh -c "echo root:$ROOTPSWD | chpasswd -c SHA512"
for user in $users; do
if [[ -z "$user" ]]; then
continue
fi
sudo chroot . /bin/sh -c "addgroup -g 900 $user"
sudo chroot . /bin/sh -c "adduser -g '' -G $user -s /usr/bin/nologin -h / -u 900 $user -D"
done
chmod 644 etc/passwd etc/group
chmod 600 etc/shadow
sudo chown root:root etc/passwd etc/group etc/shadow
cd "$ROOTDIR"
}
createInitramfs() {
cd rootfs
sudo find . | sudo cpio -H newc -o > $ROOTDIR/init.cpio
cd $ROOTDIR
}
INSTALL_ORDER=(
"linux"
"glibc"
"ncurses"
"procps"
"libcap"
"libcap-ng"
"audit"
"libxcrypt"
"libtirpc"
"libnsl"
"kmod"
"zstd"
"xz"
"zlib"
"openssl"
"eudev"
"pam"
"util-linux"
"kbd"
"dhcpcd"
"busybox"
"openrc"
)
main() {
prepareRootfs
local users_to_create=()
for package in "${INSTALL_ORDER[@]}"; do
cd "$ROOTDIR"
source "$PKGSDIR/$package/makepkg"
if [[ -n "$LOCAL_USER" ]]; then
users_to_create+="$LOCAL_USERS"
fi
local name="$NAME"
local version="$VERSION"
if [[ ${#SOURCES[@]} -eq 0 ]]; then
echo "Error: No sources defined for package $name."
echo "There should be at least one source URL defined in the makepkg file that contains the tarball URL with the source code."
exit 1
fi
local tarball_url="${SOURCES[0]}"
local remaining_sources=("${SOURCES[@]:1}")
preparePackageSrcDir "$name" "$version" "$tarball_url" "$remaining_sources"
buildPackageIfNeeded "$name" "$version" "$tarball_url"
installPackage "$name" "$version" "$tarball_url"
echo
done
setupUsers "${users_to_create[@]}"
sudo chown -R root:root rootfs
sudo chown root:utmp rootfs/var/run/utmp rootfs/var/log/wtmp
createInitramfs
echo
init_size=$(du -sh init.cpio | awk '{print $1}')
echo "Initramfs ($init_size) - $ROOTDIR/init.cpio"
kernel_size=$(du -sh bzImage | awk '{print $1}')
echo "Kernel ($kernel_size) - $ROOTDIR/bzImage"
total_size=$(du -cb init.cpio bzImage | grep total | awk '{print $1}')
human_total=$(numfmt --to=iec $total_size)
echo "Total - $human_total"
echo
echo "Run ./boot to test the system using QEMU, or package the kernel, initramfs and a bootloader to create a bootable image."
}
main "$@"