本文同步發(fā)布于
https://williamgong.github.io/2021/11/27/lfs%E6%90%AD%E5%BB%BA3/
現(xiàn)在開始就要 chroot 了闸昨,同時(shí)現(xiàn)在開始用戶也要從lfs
到root
海诲。
不過這個(gè)順序相比 9.0 差別太大了吧……
那么,現(xiàn)在就su
吧。
記得設(shè)置$LFS
:
export LFS=/mnt/lfs
改變 LFS 系統(tǒng)目錄的所有者
畢竟一個(gè)正常的系統(tǒng)其系統(tǒng)文件所有者不可能是lfs
chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -R root:root $LFS/lib64 ;;
esac
準(zhǔn)備虛擬內(nèi)核文件系統(tǒng)
首先需要建立 dev,proc,sys,run 目錄
mkdir -pv $LFS/{dev,proc,sys,run}
創(chuàng)建初始設(shè)備節(jié)點(diǎn)
主要是null
和console
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3
掛載 /dev
mount -v --bind /dev $LFS/dev
掛載虛擬內(nèi)核文件系統(tǒng)
mount -v --bind /dev/pts $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
此外怖竭,還要?jiǎng)?chuàng)建一些目錄
if [ -h $LFS/dev/shm ]; then
mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi
Chroot
chroot "$LFS" /usr/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/usr/bin:/usr/sbin \
/bin/bash --login +h
這時(shí)的 bash 會(huì)顯示 I have no name,因?yàn)闆]有/etc/passwd
,這是正常的,雖然有點(diǎn)丑 :D
退出時(shí)進(jìn)入 Chroot 的操作
如果只是退出而不關(guān)機(jī)/重啟的話迫卢,直接運(yùn)行上面的命令就行,不然就要重新掛載這些文件系統(tǒng)冶共。
不過建議每次 chroot 前都檢查一次乾蛤。
創(chuàng)建目錄
現(xiàn)在再創(chuàng)建一些還需要的目錄
mkdir -pv /{boot,home,mnt,opt,srv}
其實(shí)有一些目錄已經(jīng)創(chuàng)建了,但這里為了防止遺漏手冊(cè)還是加上了這些目錄捅僵。
現(xiàn)在創(chuàng)建子目錄
mkdir -pv /etc/{opt,sysconfig}
mkdir -pv /lib/firmware
mkdir -pv /media/{floppy,cdrom}
mkdir -pv /usr/{,local/}{include,src}
mkdir -pv /usr/local/{bin,lib,sbin}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
mkdir -pv /var/{cache,local,log,mail,opt,spool}
mkdir -pv /var/lib/{color,misc,locate}
ln -sfv /run /var/run
ln -sfv /run/lock /var/lock
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
以上目錄結(jié)構(gòu)全部基于 FHS家卖,但只加了必要的目錄。
創(chuàng)建必要的文件和符號(hào)鏈接
先加上從/etc/mtab
到/proc
的符號(hào)鏈接
ln -sv /proc/self/mounts /etc/mtab
然后是創(chuàng)建一個(gè)最簡(jiǎn)單的/etc/hosts
cat > /etc/hosts << EOF
127.0.0.1 localhost $(hostname)
::1 localhost
EOF
其實(shí)這里的
$(hostname)
在其他發(fā)行版里是需要手動(dòng)改的
創(chuàng)建/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:/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
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/bin/false
systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF
可以看出這里加上了 systemd 需要的用戶命咐。
創(chuàng)建/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:
kvm:x:61:
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:
uuidd:x:80:
systemd-oom:x:81:81:
wheel:x:97:
nogroup:x:99:
users:x:999:
EOF
這里用戶組的標(biāo)準(zhǔn)可以看作 LFS 自己的標(biāo)準(zhǔn)了,其中用戶組可以根據(jù)需要自行修改谐岁。
現(xiàn)在需要?jiǎng)?chuàng)建一個(gè)之后的測(cè)試中需要用到的用戶醋奠,不過是臨時(shí)的,最后會(huì)刪除伊佃。
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
echo "tester:x:101:" >> /etc/group
install -o tester -d /home/tester
現(xiàn)在窜司,賦予 bash 以名字(無故中二 XD):
exec /bin/bash --login +h
還要?jiǎng)?chuàng)建一些日志文件,雖然都是空的:
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
至此航揉,初步配置完成塞祈,現(xiàn)在該安裝額外工具了。
構(gòu)建額外工具
你沒理解錯(cuò)帅涂,以下部分全部都以root
用戶編譯议薪。
GCC-11.2.0 中的 Libstdc++ - 第二遍
在前面第二遍編譯 gcc 時(shí),并沒有編譯它媳友,因?yàn)樗荒苡盟拗鳈C(jī)工具鏈編譯斯议。
tar -xvf gcc-11.2.0.tar.xz
cd gcc-11.2.0
創(chuàng)建一個(gè)符號(hào)鏈接
ln -s gthr-posix.h libgcc/gthr-default.h
建立build
目錄
mkdir build
cd build
configure
../libstdc++-v3/configure \
CXXFLAGS="-g -O2 -D_GNU_SOURCE" \
--prefix=/usr \
--disable-multilib \
--disable-nls \
--host=$(uname -m)-lfs-linux-gnu \
--disable-libstdcxx-pch
編譯和安裝
make
make install
Gettext-0.21
這里只安裝msgfmt
,msgmerge
醇锚,以及xgettext
這三個(gè)程序
tar -xvf gettext-0.21.tar.xz
cd gettext-0.21
./configure --disable-shared
make
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin
Bison-3.7.6
tar -xvf bison-3.7.6.tar.xz
cd bison-3.7.6
configure
./configure --prefix=/usr \
--docdir=/usr/share/doc/bison-3.7.6
編譯和安裝
make
make install
Perl-5.34.0
此處要加一個(gè) patch
tar -xvf perl-5.34.0.tar.xz
cp perl-5.34.0-upstream_fixes-1.patch perl-5.34.0/
cd perl-5.34.0
patch -Np1 -i perl-5.34.0-upstream_fixes-1.patch
configure
sh Configure -des \
-Dprefix=/usr \
-Dvendorprefix=/usr \
-Dprivlib=/usr/lib/perl5/5.34/core_perl \
-Darchlib=/usr/lib/perl5/5.34/core_perl \
-Dsitelib=/usr/lib/perl5/5.34/site_perl \
-Dsitearch=/usr/lib/perl5/5.34/site_perl \
-Dvendorlib=/usr/lib/perl5/5.34/vendor_perl \
-Dvendorarch=/usr/lib/perl5/5.34/vendor_perl
編譯和安裝
make
make install
Python-3.9.6
這里有兩個(gè) python 包哼御,Python-3.9.6.tar.xz
和python-3.9.6-docs-html.tar.bz2
坯临。
解壓前面那個(gè),后面的那個(gè)包因?yàn)闆]安裝bzip2
無法解壓恋昼。
注意區(qū)分大小寫看靠。
tar -xvf Python-3.9.6.tar.xz
cd Python-3.9.6
configure
./configure --prefix=/usr \
--enable-shared \
--without-ensurepip
編譯和安裝
make
make install
這里有部分模塊是無法編譯的,但 make 還是會(huì)報(bào)錯(cuò)(還是 fatal error)液肌,這里只要最外面的 make 執(zhí)行成功即可挟炬。
Texinfo-6.8
tar -xvf texinfo-6.8.tar.xz
cd texinfo-6.8
在編譯之前,需要修復(fù)在使用 Glibc-2.34 或更新版本時(shí)編譯會(huì)出現(xiàn)的問題
sed -e 's/__attribute_nonnull__/__nonnull/' \
-i gnulib/lib/malloc/dynarray-skeleton.c
之后
./configure --prefix=/usr
make
make install
Util-linux-2.37.2
tar -xvf util-linux-2.37.2.tar.xz
cd util-linux-2.37.2
根據(jù) FHS 的建議矩屁,使用/var/lib/hwclock
:
mkdir -pv /var/lib/hwclock
configure
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \
--libdir=/usr/lib \
--docdir=/usr/share/doc/util-linux-2.37.2 \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-static \
--without-python \
runstatedir=/run
編譯和安裝
make
make install
至此辟宗,額外的工具就構(gòu)建完成了。
清理
首先清理文檔
rm -rf /usr/share/{info,man,doc}/*
之后是libtool
的*.la
文件
find /usr/{lib,libexec} -name \*.la -delete
最后刪除/tools
吝秕,現(xiàn)在已經(jīng)不需要了
rm -rf /tools
備份
這是可選的泊脐,但小心一點(diǎn)總沒錯(cuò)。
以下操作在 chroot 外進(jìn)行烁峭,且使用root
用戶容客。
exit
備份需要至少 1G 空間。
先解除內(nèi)核虛擬文件系統(tǒng)的掛載:
umount $LFS/dev{/pts,}
umount $LFS/{sys,proc,run}
按照手冊(cè)默認(rèn)路徑约郁,備份于/root
cd $LFS
tar -cJpf $HOME/lfs-temp-tools-11.0-systemd.tar.xz .
還原
需要還原時(shí)缩挑,運(yùn)行
cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-11.0-systemd.tar.xz
運(yùn)行前務(wù)必檢查$LFS
是否正確設(shè)置!
不然你宿主系統(tǒng)就 gg 了鬓梅,
rm -rf /*
了解一下供置。
至此,構(gòu)建臨時(shí)系統(tǒng)部分結(jié)束绽快。