天天看點

LFS(Linux From Scratch)建構過程全記錄(五):正式建構LFS系統 - 建立建構環境

  前一篇中,我們在tools中安裝了臨時建構工具。本章我們會進入建構環境中,正式的建構lfs系統。

建立建構環境

1. 準備虛拟核心檔案系統

1.1 建立即将用來挂載檔案系統的目錄:

mkdir -pv $LFS/{dev,proc,sys,run}

1.2 建立初始裝置節點:

  LFS文檔的解釋:核心引導系統的時候,依賴于幾個裝置節點,特别是console和null兩個裝置。這些裝置需要建立在硬碟上,這樣在udevd啟動之前他們也仍然有效的,特别在linux使用init=/bin/bash參數啟動的時候。

mknod -m 600 $LFS/dev/console c 5 1

mknod -m 666 $LFS/dev/null c 1 3

1.3 挂載和激活/dev

  将宿主系統中的/dev挂載到$LFS下的dev下:

mount -v --bind /dev $LFS/dev

1.4 挂載虛拟檔案系統

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

  建立shm目錄:

if [ -h $LFS/dev/shm ]; then

mkdir -pv $LFS/$(readlink $LFS/dev/shm)

fi

1.5 進入chroot環境

  現在可以切換到chroot環境下正式建構lfs系統了,關于chroot可以閱讀如下的檔案進行了解:

  https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/

  以root使用者運作如下的指令即可:

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

注意事項:

在這之後的進行中,都是在chroot下進行的,如果出現機器重新開機的情況,需要重新“挂載和激活/dev” 和“挂載虛拟檔案系統”以及“建立shm目錄”

2. 開始建構

2.1 建立lfs檔案系統目錄:

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) ln -sv lib /lib64

ln -sv lib /usr/lib64

ln -sv lib /usr/local/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}

  使用ls檢視一下,會發現和宿主系統的根目錄下的結構類似。

2.2 建立lfs檔案系統目錄:

  有些程式會使用寫死的路徑調用還未安裝的程式,為了滿足這種程式的需要,我們需要建立一些符号連結,在安裝好這寫程式後,會替代這些符号連結。

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

  建立密碼(/etc/passwd)和使用者組(/etc/group)配置檔案

  執行如下建立/etc/passwd:

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

systemd-bus-proxy: x:72:72:systemd Bus Proxy:/:/bin/false

systemd-journal-gateway: x:73:73:systemd Journal Gateway:/:/bin/false

systemd-journal-remote: x:74:74:systemd Journal Remote:/:/bin/false

systemd-journal-upload: x:75:75:systemd Journal Upload:/:/bin/false

systemd-network: x:76:76:systemd Network Management:/:/bin/false

systemd-resolve: x:77:77:systemd Resolver:/:/bin/false

systemd-timesync: x:78:78:systemd Time Synchronization:/:/bin/false

systemd-coredump: x:79:79:systemd Core Dumper:/:/bin/false

nobody: x:99:99:Unprivileged User:/dev/null:/bin/false

EOF

  執行如下建立/etc/group:

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:

systemd-bus-proxy: x:72:

systemd-journal-gateway: x:73:

systemd-journal-remote: x:74:

systemd-journal-upload: x:75:

systemd-network: x:76:

systemd-resolve: x:77:

systemd-timesync: x:78:

systemd-coredump: x:79:

nogroup: x:99:

users: x:999:

EOF

   如上x之前沒有空格,具體指令可以複制lfs文檔中對應章節的指令。

   移除“I have no name!”的提示符:

exec /tools/bin/bash --login +h

   添加日志檔案:

touch /var/log/{btmp,lastlog,wtmp}

chgrp -v utmp /var/log/lastlog

chmod -v 664 /var/log/lastlog

chmod -v 600 /var/log/btmp

/var/log/wtmp會記錄登入登出的動作,/var/log/lastlog會記錄最後一次登陸的資訊,/var/log/btmp記錄的是失敗的登陸嘗試。

  至此建立建構環境的準備工作完成,下一步就是編譯和安裝程式,這個與上一篇的操作類似,為了防止出錯,後續一篇還是會加上這一步的内容。

繼續閱讀