为了预防有可能出现的编译错误需要重新编译某些软件包,我在编译过程中每编译1个或几个软件包就进行备份。为了方便备份和恢复的方便,分别编写了 baklfs.sh, reslfs.sh 脚本。为了方便第六章开始的进入 chroot 环境编译,把书上的 chroot 脚本写成脚本文件 chlfsroot 。然后把这3个脚本放入默认用户的家目录下面的文件夹里。设置为700权限。这3个脚本都必须是 root 才能执行。再在/usr/sbin/里分别建了到这3个文件的符号链接(预防以后如重装系统时无意删除了这些自写脚本)。
1、备份脚本 baklfs.sh
<code>
#!/bin/bash
# backup under building LFS system regularly
if [ $# -lt 1 ] ; then
echo "This script needs the backuped file name, e.g., lfs.6glibc.tar.bz2 "
exit 1
fi
# unmount $LFS/dev and some virtual kernel file system
LFS='/mnt/lfs'
cd
echo "I am in $PWD , begin unmount $LFS/dev and some virtual kernel file system..."
umount $LFS/sys
umount $LFS/proc
umount $LFS/dev/shm
umount $LFS/dev/pts
umount $LFS/dev
echo "umount $LFS/dev and some virtual kernel file system ok."
# backuping
tar -cpjf $LFS/backup/$1 --exclude=$LFS/backup --exclude=$LFS/lost+found --exclude=$LFS/tmp/* --exclude=$LFS/sources --exclude=$LFS/tools --exclude=$LFS/var/tmp/* $LFS
echo "backup under building LFS: $( du -h $LFS/backup/$1 ) ok"
# mount $LFS/dev and some virtual kernel file system again
mount --bind /dev $LFS/dev
mount -t devpts devpts $LFS/dev/pts
mount -t tmpfs shm $LFS/dev/shm
mount -t proc proc $LFS/proc
mount -t sysfs sysfs $LFS/sys
echo "mount $LFS/dev and some virtual kernel file system again ok."
exit 0
</code>
2、恢复脚本 reslfs.sh
<code>
#!/bin/bash
# restore under building LFS system
LFS='/mnt/lfs'
if [ $# -lt 1 ] ; then
echo "This script needs the file name to be restored, e.g., lfs.6glibc.tar.bz2. exit. "
exit 1
fi
if [ ! -e $LFS/backup/$1 ] ; then
echo "wrong file name to be restored, e.g., lfs.6glibc.tar.bz2. exit. "
exit 1
fi
# unmount $LFS/dev and some virtual kernel file system
cd
echo "I am in $PWD , begin unmount $LFS/dev and some virtual kernel file system..."
umount $LFS/sys
umount $LFS/proc
umount $LFS/dev/shm
umount $LFS/dev/pts
umount $LFS/dev
echo "umount $LFS/dev and some virtual kernel file system ok."
# delete the old LFS files
echo "delete old LFS files..."
rm -frv $LFS/boot $LFS/etc $LFS/lib $LFS/media $LFS/opt $LFS/root $LFS/sys $LFS/var $LFS/bin $LFS/dev $LFS/home $LFS/mnt $LFS/proc $LFS/sbin $LFS/srv $LFS/tmp $LFS/usr
echo "restore under building LFS: $( du -h $LFS/backup/$1 ) ..."
tar -xjvf $LFS/backup/$1 -C /
# mount $LFS/dev and some virtual kernel file system again
mount --bind /dev $LFS/dev
mount -t devpts devpts $LFS/dev/pts
mount -t tmpfs shm $LFS/dev/shm
mount -t proc proc $LFS/proc
mount -t sysfs sysfs $LFS/sys
echo "mount $LFS/dev and some virtual kernel file system again ok."
exit 0
</code>
3、进入 chroot 脚本 chlfsroot ( sudo -E chlfsroot 执行,不加-E 就不能保留原来的环境变量 $LFS;加 MAKEFLAGS='-j 2' 是启用并行编译,即 parallel make)
<code>
#!/bin/bash
chroot "$LFS" /tools/bin/env -i MAKEFLAGS='-j 2' \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
exit 0
</code>
4、除了书中要求的一些环境变量的设置,其它一些方便 LFS 编译的设置的自动化改进
1)、设置在 /etc/rc.local 中,自动挂载 LFS 相关的文件(或虚拟内核文件)系统:
<code>
# For building Chapter 6 of LFS BOOK 6.6
LFS='/mnt/lfs'
mount -v -t ext3 /dev/sda11 $LFS
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
</code>
2)、设置在 /etc/profile 中的 $LFS 环境变量:
<code>
export LFS='/mnt/lfs'
</code>