-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsetup.sh
More file actions
executable file
·179 lines (144 loc) · 3.89 KB
/
setup.sh
File metadata and controls
executable file
·179 lines (144 loc) · 3.89 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
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 -euo pipefail
# TODO: check if user has prerequisites https://www.linuxfromscratch.org/lfs/view/stable/partintro/generalinstructions.html
usage() {
echo "Usage: $0 [OPTIONS]" 1>&2;
echo -ne "Options:\n -c Cleanup \$LFS partition before starting script\n"
echo -ne " -s Skip installation of sources\n"
}
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
CLEANUP=false
SKIP_INSTALL_PACKAGES=false
while getopts ":cs" opt; do
case ${opt} in
c )
CLEANUP=true
# Do something here when option -c is passed
;;
s )
SKIP_INSTALL_PACKAGES=true
;;
\? )
echo "Invalid option: $OPTARG" 1>&2
usage
exit 1
;;
: )
echo "Option -$OPTARG requires an argument" 1>&2
usage
exit 1
;;
esac
done
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
HOME=$(eval echo ~$SUDO_USER)
LFS=/mnt/lfs
LFS_FILE=$HOME/lfs_disk
LFS_USER=lfs
LFS_PASSWORD=pass
cleanup() {
rm -rf $LFS/* $LFS/.*
}
create_fake_partition() {
if [ ! -f "$LFS_FILE" ]; then
echo creating partition, do not interupt
dd if=/dev/zero of=$LFS_FILE bs=1G count=20
mkfs.ext4 $LFS_FILE
chown $SUDO_USER:$SUDO_USER $LFS_FILE
echo "Creating fake partition...done"
fi
}
mount_fake_partition() {
mkdir -pv $LFS
if mountpoint $LFS; then
echo partition already mounted
else
mount -v -t ext4 $LFS_FILE $LFS
echo "Mounting fake partition...done"
fi
}
setup_md5sums() {
cd $LFS/sources
wget https://www.linuxfromscratch.org/lfs/view/stable-systemd/md5sums
cd $LFS/sources
md5sum -c md5sums
cd $LFS
echo "Setting up md5sums...done"
}
install_packages() {
echo "Installing packages..."
echo "$SKIP_INSTALL_PACKAGES"
cp ./package-list.txt $LFS
if [ "$SKIP_INSTALL_PACKAGES" == "false" ]; then
rm -rf $LFS/sources
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
cd $LFS
wget --input-file=package-list.txt --continue --directory-prefix=$LFS/sources || echo "Download failed"
echo "Downloading packages...done"
setup_md5sums
chown root:root $LFS/sources/*
fi
}
construct_final_lfs() {
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
for i in bin lib sbin; do
ln -sv usr/$i $LFS/$i
done
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac
mkdir -pv $LFS/tools
}
create_lfs_user() {
groupadd $LFS_USER || true
useradd -s /bin/bash -g $LFS_USER -m -k /dev/null $LFS_USER || true
echo $LFS_USER:$LFS_PASSWORD | chpasswd
# I added the -R option, maybe it's not necessary
chown -vR $LFS_USER $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -v $LFS_USER $LFS/lib64 ;;
esac
}
setup_env() {
echo test
cat > /home/$LFS_USER/.bash_profile << EOF
exec env -i HOME=/home/$LFS_USER TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > /home/$LFS_USER/.bashrc << EOF
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:\$PATH; fi
PATH=\$LFS/tools/bin:\$PATH
CONFIG_SITE=\$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
echo "Setting up environment...done"
}
if [ $CLEANUP == true ]; then
cleanup
fi
create_fake_partition
mount_fake_partition
install_packages
construct_final_lfs
create_lfs_user
setup_env
cp -v $SCRIPT_DIR/build_cross_toolchain.sh $LFS
cp -v $SCRIPT_DIR/build_temp_tools.sh $LFS
cp -v $SCRIPT_DIR/prepare_chroot.sh $LFS
cp -v $SCRIPT_DIR/chroot_build_dirs.sh $LFS
cp -v $SCRIPT_DIR/build_chroot_additional_tools.sh $LFS
cp -v $SCRIPT_DIR/build_sys_software.sh $LFS
cp -v $SCRIPT_DIR/backup.sh $LFS
cp -v $SCRIPT_DIR/setup_systemv.sh $LFS
echo -ne "\n\n\nNow run the following commands:\n"
echo "su - $LFS_USER"
echo "$LFS/build_cross_toolchain.sh"