九. 系統配置
1. 安裝 LFS-Bootscripts-20150222
軟件包包含一套在 LFS 系統啟動和關閉時的啟動和停止腳本。
cd /sources tar -jxf lfs-bootscripts-20150222.tar.bz2 cd lfs-bootscripts-20150222 make install cd /sources rm -rf lfs-bootscripts-20150222
2. 管理網絡設備
# 運行以下命令,創建網絡設備 Udev 規則 bash /lib/udev/init-net-rules.sh # 查看生成的規則
cat /etc/udev/rules.d/70-persistent-net.rules
3. 配置系統主機名稱
echo "lfs" > /etc/hostname
4. 創建 /etc/hosts
文件

cat > /etc/hosts << "EOF" # Begin /etc/hosts (network card version) 127.0.0.1 localhost # End /etc/hosts (network card version) EOF
5. 配置 Sysvinit
內核初始化期間,第一個運行的程序默認是SysVinit,這個程序讀取/etc/inittab
文件

cat > /etc/inittab << "EOF" # Begin /etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/init.d/rc S l0:0:wait:/etc/rc.d/init.d/rc 0 l1:S1:wait:/etc/rc.d/init.d/rc 1 l2:2:wait:/etc/rc.d/init.d/rc 2 l3:3:wait:/etc/rc.d/init.d/rc 3 l4:4:wait:/etc/rc.d/init.d/rc 4 l5:5:wait:/etc/rc.d/init.d/rc 5 l6:6:wait:/etc/rc.d/init.d/rc 6 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now su:S016:once:/sbin/sulogin 1:2345:respawn:/sbin/agetty --noclear tty1 9600 2:2345:respawn:/sbin/agetty tty2 9600 3:2345:respawn:/sbin/agetty tty3 9600 4:2345:respawn:/sbin/agetty tty4 9600 5:2345:respawn:/sbin/agetty tty5 9600 6:2345:respawn:/sbin/agetty tty6 9600 # End /etc/inittab EOF
6. 配置系統時鍾

cat > /etc/sysconfig/clock << "EOF" # Begin /etc/sysconfig/clock UTC=1 # Set this to any options you might need to give to hwclock, # such as machine hardware clock type for Alphas. CLOCKPARAMS= # End /etc/sysconfig/clock EOF
7. Bash 啟動文件

cat > /etc/profile << "EOF" # Begin /etc/profile export LANG=en_US.UTF-8 # End /etc/profile EOF
8. 創建 /etc/inputrc 文件
inputrc
文件的作用是告知系統應該以怎樣的鍵盤布局處理鍵盤

cat > /etc/inputrc << "EOF" # Begin /etc/inputrc # Modified by Chris Lynn <roryo@roryo.dynup.net> # Allow the command prompt to wrap to the next line set horizontal-scroll-mode Off # Enable 8bit input set meta-flag On set input-meta On # Turns off 8th bit stripping set convert-meta Off # Keep the 8th bit for display set output-meta On # none, visible or audible set bell-style none # All of the following map the escape sequence of the value # contained in the 1st argument to the readline specific functions "\eOd": backward-word "\eOc": forward-word # for linux console "\e[1~": beginning-of-line "\e[4~": end-of-line "\e[5~": beginning-of-history "\e[6~": end-of-history "\e[3~": delete-char "\e[2~": quoted-insert # for xterm "\eOH": beginning-of-line "\eOF": end-of-line # for Konsole "\e[H": beginning-of-line "\e[F": end-of-line # End /etc/inputrc EOF
9. 創建 /etc/shells 文件
shells
文件是當前系統所有可用 shell 的列表文件

cat > /etc/shells << "EOF" # Begin /etc/shells /bin/sh /bin/bash # End /etc/shells EOF
10. LFS官方文檔中還包含了其它可選配置,可按需添加
十. 讓 LFS 系統可引導
1. 創建 /etc/fstab 文件

cat > /etc/fstab << "EOF" # Begin /etc/fstab # file system mount-point type options dump fsck # order /dev/root / auto noatime,nodiratime 1 1 #/dev/xxxx swap swap pri=1 0 0 # End /etc/fstab EOF
2. 掛載 boot 分區
mkdir /mnt/boot mount /dev/sdc1 /mnt/boot
3. Linux-4.7.2
a. 宿主系統下運行下列命令,查看有線、無線網卡型號
lspci | grep -i ethernet
lspci | grep -i wireless
b. 根據型號選擇合適的驅動,安裝配置內核

cd /sources tar -Jxf linux-4.7.2.tar.xz cd linux-4.7.2 make mrproper make menuconfig #新增 #[*] Networking support ---> #-*- Wireless ---> #<*> cfg80211 - wireless configuration API #[*] cfg80211 wireless extensions compatibility # Device Drivers ---> #[*] Network device support ---> #[*] Ethernet driver support ---> #[*] Atheros devices #<M> Qualcomm Atheros AR816X/AR817x support #[*] Wireless LAN ---> #[*] Atheros/Qualcomm devices #<M> Atheros 802.11n wireless cards support #[*] Atheros ath9k PCI/PCIe bus support #<*> PPP (point-to-point protocol) support #<*> PPP support for async serial ports make make modules_install # 下面的命令假設主機是 x86 架構: cp -v arch/x86/boot/bzImage /mnt/boot/vmlinuz-4.7.2 cp -v System.map /mnt/boot/System.map-4.7.2 cp -v .config /mnt/boot/config-4.7.2 install -d /usr/share/doc/linux-4.7.2 cp -r Documentation/* /usr/share/doc/linux-4.7.2 # 配置 Linux 模塊加載順序 # 如果將 USB 設備(ehci_hcd、ohci_hcd 和 uhci_hcd) 編譯為模塊,則需要此文件。 # 運行以下命令建立 /etc/modprobe.d/usb.conf 文件: install -v -m755 -d /etc/modprobe.d cat > /etc/modprobe.d/usb.conf << "EOF" # Begin /etc/modprobe.d/usb.conf install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true # End /etc/modprobe.d/usb.conf EOF cd /sources rm -rf linux-4.7.2
4. 創建 initrd.img 文件
a. 點擊此下載 mkinitramfs 相關文件,並放到LFS系統對應的位置
b. mkinitramfs 命令依賴於 cpio 包,先安裝

cd /sources tar -jxf cpio-2.12.tar.bz2 cd cpio-2.12 ./configure --prefix=/usr \ --bindir=/bin \ --enable-mt \ --with-rmt=/usr/libexec/rmt && make && makeinfo --html -o doc/html doc/cpio.texi && makeinfo --html --no-split -o doc/cpio.html doc/cpio.texi && makeinfo --plaintext -o doc/cpio.txt doc/cpio.texi make install && install -v -m755 -d /usr/share/doc/cpio-2.12/html && install -v -m644 doc/html/* \ /usr/share/doc/cpio-2.12/html && install -v -m644 doc/cpio.{html,txt} \ /usr/share/doc/cpio-2.12 cd /sources rm -rf cpio-2.12
c. 執行如下命令,重新生成 initrd
cp /sbin/udevadm /bin/
chmod 777 /usr/sbin/mkinitramfs
/usr/sbin/mkinitramfs --force
d. 移動 initrd.img-4.7.2.xz 到 boot 分區下
mv /boot/initrd.img-4.7.2.xz /mnt/boot/
5. 用 GRUB 設置引導過程

# 將GRUB文件安裝到 /mnt/boot/grub,並修改MBR扇區 grub-install --root-directory=/mnt /dev/sdc # 創建GRUB配置文件 cat > /mnt/boot/grub/grub.cfg << "EOF" # Begin /boot/grub/grub.cfg set default=0 set timeout=5 menuentry "linux-4.7.2-lfs-7.10" { set kver=4.7.2 set boot_uuid=<boot分區uuid> set root_uuid=<root分區uuid> search.fs_uuid ${boot_uuid} root linux /vmlinuz-${kver} root=uuid/${root_uuid} initrd /initrd.img-${kver}.xz } EOF
十一. 最后
1. 創建 /etc/lfs-release
文件

cat > /etc/lsb-release << "EOF" DISTRIB_ID="Linux From Scratch" DISTRIB_RELEASE="7.10" DISTRIB_CODENAME="kevin" DISTRIB_DESCRIPTION="Linux From Scratch" EOF
2. 安裝 OpenSSH

# openssh依賴於openssl庫,先安裝openssl cd /sources tar -zxf openssl-1.0.2h.tar.gz cd openssl-1.0.2h ./config --prefix=/usr \ --openssldir=/etc/ssl \ --libdir=lib \ shared \ zlib-dynamic && make depend && make make MANDIR=/usr/share/man MANSUFFIX=ssl install && install -dv -m755 /usr/share/doc/openssl-1.0.2h && cp -vfr doc/* /usr/share/doc/openssl-1.0.2h cd /sources rm -rf openssl-1.0.2h # 安裝openssh cd /sources tar -zxf openssh-7.3p1.tar.gz cd openssh-7.3p1 install -v -m700 -d /var/lib/sshd && chown -v root:sys /var/lib/sshd && groupadd -g 50 sshd && useradd -c 'sshd PrivSep' \ -d /var/lib/sshd \ -g sshd \ -s /bin/false \ -u 50 sshd ./configure --prefix=/usr \ --sysconfdir=/etc/ssh \ --with-md5-passwords \ --with-privsep-path=/var/lib/sshd && make make install && install -v -m755 contrib/ssh-copy-id /usr/bin && install -v -m644 contrib/ssh-copy-id.1 \ /usr/share/man/man1 && install -v -m755 -d /usr/share/doc/openssh-7.3p1 && install -v -m644 INSTALL LICENCE OVERVIEW README* \ /usr/share/doc/openssh-7.3p1 cd /sources rm -rf openssh-7.3p1 # 系統啟動時開啟ssh服務 cd /sources tar -Jxf blfs-bootscripts-20160902.tar.xz cd blfs-bootscripts-20160902 make install-sshd cd /sources rm -rf blfs-bootscripts-20160902
3. 安裝 dhcpcd

cd /sources tar -Jxf dhcpcd-6.11.3.tar.xz cd dhcpcd-6.11.3 ./configure --libexecdir=/lib/dhcpcd \ --dbdir=/var/lib/dhcpcd && make make install cd /sources rm -rf dhcpcd-6.11.3
4. 安裝 wpa_supplicant

# wpa_supplicant依賴於libnl-3庫,先安裝libnl-3 cd /sources tar -zxf libnl-3.2.28.tar.gz cd libnl-3.2.28 ./configure --prefix=/usr \ --sysconfdir=/etc \ --disable-static && make make install cd /sources rm -rf libnl-3.2.28 # 安裝wpa_supplicant cd /sources tar -zxf wpa_supplicant-2.5.tar.gz cd wpa_supplicant-2.5 cat > wpa_supplicant/.config << "EOF" CONFIG_BACKEND=file CONFIG_CTRL_IFACE=y CONFIG_DEBUG_FILE=y CONFIG_DEBUG_SYSLOG=y CONFIG_DEBUG_SYSLOG_FACILITY=LOG_DAEMON CONFIG_DRIVER_NL80211=y CONFIG_DRIVER_WEXT=y CONFIG_DRIVER_WIRED=y CONFIG_EAP_GTC=y CONFIG_EAP_LEAP=y CONFIG_EAP_MD5=y CONFIG_EAP_MSCHAPV2=y CONFIG_EAP_OTP=y CONFIG_EAP_PEAP=y CONFIG_EAP_TLS=y CONFIG_EAP_TTLS=y CONFIG_IEEE8021X_EAPOL=y CONFIG_IPV6=y CONFIG_LIBNL32=y CONFIG_PEERKEY=y CONFIG_PKCS12=y CONFIG_READLINE=y CONFIG_SMARTCARD=y CONFIG_WPS=y CFLAGS += -I/usr/include/libnl3 EOF cd wpa_supplicant && make BINDIR=/sbin LIBDIR=/lib install -v -m755 wpa_{cli,passphrase,supplicant} /sbin/ && install -v -m644 doc/docbook/wpa_supplicant.conf.5 /usr/share/man/man5/ && install -v -m644 doc/docbook/wpa_{cli,passphrase,supplicant}.8 /usr/share/man/man8/ cd /sources rm -rf wpa_supplicant-2.5
5. 網絡配置:復制到命令行執行前,記得把中文注釋去掉,否則會出錯

# 有線網絡配置 cat > /etc/sysconfig/ifconfig.eth0 << "EOF" ONBOOT="no" IFACE="eth0" # 靜態IP SERVICE="ipv4-static" IP="192.168.1.2" # 網關 GATEWAY="192.168.1.1" # 子網掩碼 PREFIX="24" # 廣播域 BROADCAST="192.168.1.255" # 動態IP #SERVICE="dhcpcd" # -b background 后台運行 # -q quite 消息仍被記錄,但是只有告警或錯誤的信息被打印 #DHCP_START="-b -q" # -k release 退出前釋放租期 #DHCP_STOP="-k" EOF # 無線網絡配置 cat > /etc/sysconfig/ifconfig.wlan0 << "EOF" ONBOOT="no" IFACE="wlan0" SERVICE="wpa" # Additional arguments to wpa_supplicant WPA_ARGS="" # 動態IP WPA_SERVICE="dhcpcd" DHCP_START="-b -q" DHCP_STOP="-k" # 靜態IP #WPA_SERVICE="ipv4-static" #IP="192.168.1.2" #GATEWAY="192.168.1.1" #PREFIX="24" #BROADCAST="192.168.1.255" EOF # WIFI配置 cat > /etc/sysconfig/wpa_supplicant-wlan0.conf << "EOF" network={ ssid="WiFi-name1" psk="WiFi-password1" priority=5 } EOF
6. 卸載文件系統
logout umount -v $LFS/dev/pts umount -v $LFS/dev umount -v $LFS/run umount -v $LFS/proc umount -v $LFS/sys umount -v /mnt/boot
# 刪除 boot 和 sources 文件夾 rm -rf $LFS/boot rm -rf $LFS/sources umount -v $LFS
7. 重啟電腦,引導從U盤啟動電腦
8. 默認登錄用戶名:root 密碼:1
9. 連接無線網絡命令
wpa_supplicant -B -i wlan0 -c /etc/sysconfig/wpa_supplicant-wlan0.conf
dhcpcd wlan0
十二. 如何將LFS系統做成鏡像
1. 需要一台裝有Linux系統的PC機
2. 利用 gparted 格式化並重新划分U盤:
/dev/sdc1 100M EXT4 boot分區
/dev/sdc2 900M EXT4 LFS系統分區
3. 執行 sudo fdisk -u -l /dev/sdc 命令,查看硬件的分區情況,start和end中數字的單位是512字節
4. 利用dd命令將U盤做成鏡像:
dd if=/dev/sdc of=lfs-7.10-linux-4.7.2.img bs=512 count=[fdisk命令中最大的end數+1]