LFS 学习日记(编译过程中备份、恢复、进入 chroot 编译环境等的脚本或设置 )

为了预防有可能出现的编译错误需要重新编译某些软件包,我在编译过程中每编译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>