七. 構建臨時系統
1. 通用編譯指南
a. 確認是否正確設置了 LFS
環境變量
echo $LFS
b. 假定你已經正確地設置了宿主系統需求和符號鏈接
c. 對於每個軟件包:
(1). 確保解壓軟件包時你使用的是 lfs 用戶
(2). 除非特別說明,刪除解壓出來的目錄和所有編譯過程中生成的 build
目錄
2. 執行shell腳本,完成臨時系統的構建
cd $LFS/sources chmod +x ch5-build.sh ./ch5-build.sh
3. 改變屬主
以後部分的命令都必須以 root
用戶身份執行而不再是 lfs
用戶。另外,再次確認下 $LFS 變量在 root 用戶環境下也有定義。
當前,$LFS/tools
目錄屬於 lfs
用戶,通過下面的命令將 $LFS/tools
目錄的屬主改為 root
用戶:
su - root export LFS=/mnt/lfs chown -R root:root $LFS/tools
八. 構建LFS系統
1. 准備虛擬內核文件系統
內核會掛載幾個文件系統用於自己和用戶空間程序交換信息。這些文件系統是虛擬的,並不占用實際磁盤空間,
它們的內容會放在內存裡。
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 mknod -m 444 /dev/random c 1 8 mknod -m 444 /dev/urandom c 1 9 mount -v --bind /dev $LFS/dev mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620 mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi
2. 進入 Chroot 環境
從這裡以後,就不再需要 LFS
變量了,因為後面所有工作都將被限定在 LFS 文件系統裡。
chroot "$LFS" /tools/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ /tools/bin/bash --login +h
3. 創建目錄
# 現在准備創建 LFS 文件系統裡的一些目錄結構。使用下面的命令創建一個標准的目錄樹: # 這個目錄樹是基於文件系統目錄結構標准(FHS) mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt} mkdir -pv /{media/{floppy,cdrom},sbin,srv,var} install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -v /usr/libexec mkdir -pv /usr/{,local/}share/man/man{1..8} case $(uname -m) in x86_64) mkdir -v /lib64 ;; esac mkdir -v /var/{log,mail,spool} ln -sv /run /var/run ln -sv /run/lock /var/lock mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}
4. 創建必需的文件和符號鏈接
ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin ln -sv /tools/bin/perl /usr/bin ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la ln -sv bash /bin/sh ln -sv /proc/self/mounts /etc/mtab # root 用戶的實際密碼(這裡的 “x” 只是占位符)將在後面創建。 cat > /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 > /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 exec /tools/bin/bash --login +h touch /var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664 /var/log/lastlog chmod -v 600 /var/log/btmp
5. 執行shell腳本,完成LFS系統的構建
cd /sources chmod +x ch6-build.sh ./ch6-build.sh
master.tar.gz:交叉編譯好的二進制內核、內核模塊、bootloader、GPU(VideoCore)固件
可根據腳本提示可選擇的安裝、升級。
6. 再次清理無用內容
logout chroot $LFS /tools/bin/env -i \ HOME=/root TERM=$TERM PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /tools/bin/bash --login /tools/bin/find /usr/lib -type f -name \*.a \ -exec /tools/bin/strip --strip-debug {} ';' /tools/bin/find /lib /usr/lib -type f -name \*.so* \ -exec /tools/bin/strip --strip-unneeded {} ';' /tools/bin/find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \ -exec /tools/bin/strip --strip-all {} ';'
7. 清理
rm -rf /tmp/* logout chroot "$LFS" /usr/bin/env -i \ HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /bin/bash --login rm -rf /tools rm -f /usr/lib/lib{bfd,opcodes}.a rm -f /usr/lib/libbz2.a rm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.a rm -f /usr/lib/libltdl.a rm -f /usr/lib/libfl.a rm -f /usr/lib/libfl_pic.a rm -f /usr/lib/libz.a
http://xxxxxx/Linuxjc/1190239.html TechArticle