eth0s/02-lfs-base
2018-12-01 00:12:45 +08:00

194 lines
4.8 KiB
Bash
Executable file

#!/bin/bash
LFS=/mnt/lfs
lfs_dirs() {
mkdir -pv $LFS/{dev,proc,sys,run}
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3
mkdir -pv $LFS/{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv $LFS/{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 $LFS/root
install -dv -m 1777 $LFS/tmp $LFS/var/tmp
mkdir -pv $LFS/usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv $LFS/usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v $LFS/usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v $LFS/usr/libexec
mkdir -pv $LFS/usr/{,local/}share/man/man{1..8}
case $(uname -m) in
x86_64) mkdir -v $LFS/lib64 ;;
esac
mkdir -v $LFS/var/{log,mail,spool}
ln -sv /run $LFS/var/run
ln -sv /run/lock $LFS/var/lock
mkdir -pv $LFS/var/{opt,cache,lib/{color,misc,locate},local}
ln -sv /tools/bin/{bash,cat,dd,echo,ln,pwd,rm,stty} $LFS/bin
ln -sv /tools/bin/{env,install,perl} $LFS/usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} $LFS/usr/lib
ln -sv /tools/lib/libstdc++.{a,so{,.6}} $LFS/usr/lib
for lib in blkid lzma mount uuid
do
ln -sv /tools/lib/lib$lib.so* $LFS/usr/lib
done
ln -svf /tools/include/blkid $LFS/usr/include
ln -svf /tools/include/libmount $LFS/usr/include
ln -svf /tools/include/uuid $LFS/usr/include
install -vdm755 $LFS/usr/lib/pkgconfig
for pc in blkid mount uuid
do
sed 's@tools@usr@g' /tools/lib/pkgconfig/${pc}.pc \
> $LFS/usr/lib/pkgconfig/${pc}.pc
done
ln -sv bash $LFS/bin/sh
ln -sv /proc/self/mounts $LFS/etc/mtab
cat > $LFS/etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF
cat > $LFS/etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
nogroup:x:99:
users:x:999:
EOF
touch $LFS/var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp $LFS/var/log/lastlog
chmod -v 664 $LFS/var/log/lastlog
chmod -v 600 $LFS/var/log/btmp
mkdir -p $LFS/etc/pkg $LFS/var/lib/pkg $LFS/var/lib/pkg/sources $LFS/usr/pkgscripts
touch $LFS/var/lib/pkg/db
[ -d toolchain/src ] && cp -Rv toolchain/src/* $LFS/var/lib/pkg/sources
}
mount_pseudo() {
mount --bind /dev $LFS/dev
mount -t devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -t proc proc $LFS/proc
mount -t sysfs sysfs $LFS/sys
mount -t tmpfs tmpfs $LFS/run
if [ -h $LFS/dev/shm ]; then
mkdir -p $LFS/$(readlink $LFS/dev/shm)
fi
}
umount_pseudo() {
umount $LFS/dev/pts
umount $LFS/dev
umount $LFS/run
umount $LFS/proc
umount $LFS/sys
}
runchroot() {
pushd $LFS &>/dev/null
mount_pseudo
cp -L /etc/resolv.conf $LFS/etc/
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash $@
retval=$?
umount_pseudo
popd &>/dev/null
return $retval
}
runinchroot() {
pushd $LFS &>/dev/null
mount_pseudo
cp -L /etc/resolv.conf $LFS/etc/
chroot "$LFS" /tools/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash $@
retval=$?
umount_pseudo
popd &>/dev/null
return $retval
}
interrupted() {
die "Abort by user."
}
die() {
[ "$@" ] && printerror $@
umount_pseudo
exit 1
}
printerror() {
echo -e "ERROR: $@"
}
trap "interrupted" SIGHUP SIGINT SIGQUIT SIGTERM
PKGS="linux-api-headers man-pages glibc zlib file readline m4 bc binutils gmp mpfr mpc shadow gcc bzip2
pkg-config ncurses attr acl libcap sed psmisc iana-etc bison flex grep bash libtool gdbm gperf expat inetutils perl perl-xml-parser
intltool autoconf automake xz kmod gettext libelf libffi openssl python3 ninja meson procps-ng e2fsprogs coreutils check diffutils
gawk findutils groff grub less gzip iproute2 kbd libpipeline make patch sysklogd sysvinit eudev util-linux man-db tar texinfo vim
cpio mkinitramfs linux lfs-bootscripts lfs-files libtasn1 p11-kit make-ca wget"
EXTRA_PKGS="dhcpcd libnl wpa_supplicant"
if [ ! -f $LFS/var/lib/pkg/db ]; then
lfs_dirs
fi
cp lfs/pkgscripts/* $LFS/usr/pkgscripts/
cp lfs/functions $LFS/var/lib/pkg/
cp lfs/pkg.conf $LFS/etc/pkg/
for i in $PKGS; do
if [[ $(grep "^$i " $LFS/var/lib/pkg/db) ]]; then
echo "--- $i skipped ---"
else
echo "*** $i ***"
runinchroot /usr/pkgscripts/$i || die "$i build error!"
fi
done
for i in $EXTRA_PKGS; do
if [[ $(grep "^$i " $LFS/var/lib/pkg/db) ]]; then
echo "--- $i skipped ---"
else
echo "*** $i ***"
runchroot /usr/pkgscripts/$i || die "$i build error!"
fi
done
exit 0