LFS 搭建3 Chroot 以及構(gòu)建額外工具

本文同步發(fā)布于
https://williamgong.github.io/2021/11/27/lfs%E6%90%AD%E5%BB%BA3/

現(xiàn)在開始就要 chroot 了闸昨,同時(shí)現(xiàn)在開始用戶也要從lfsroot海诲。
不過這個(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)

主要是nullconsole

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

這里只安裝msgfmtmsgmerge醇锚,以及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.xzpython-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é)束绽快。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芥丧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坊罢,更是在濱河造成了極大的恐慌续担,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件活孩,死亡現(xiàn)場(chǎng)離奇詭異物遇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)憾儒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門询兴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人起趾,你說我怎么就攤上這事蕉朵。” “怎么了阳掐?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵始衅,是天一觀的道長(zhǎng)冷蚂。 經(jīng)常有香客問我,道長(zhǎng)汛闸,這世上最難降的妖魔是什么蝙茶? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮诸老,結(jié)果婚禮上隆夯,老公的妹妹穿的比我還像新娘咐蝇。我一直安慰自己传轰,他們只是感情好璧微,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布榆综。 她就那樣靜靜地躺著,像睡著了一般转砖。 火紅的嫁衣襯著肌膚如雪局义。 梳的紋絲不亂的頭發(fā)上欢际,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天类茂,我揣著相機(jī)與錄音耍属,去河邊找鬼。 笑死巩检,一個(gè)胖子當(dāng)著我的面吹牛厚骗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兢哭,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼领舰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了迟螺?” 一聲冷哼從身側(cè)響起冲秽,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煮仇,沒想到半個(gè)月后劳跃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谎仲,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浙垫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郑诺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夹姥。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辙诞,靈堂內(nèi)的尸體忽然破棺而出辙售,到底是詐尸還是另有隱情,我是刑警寧澤飞涂,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布旦部,位于F島的核電站祈搜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏士八。R本人自食惡果不足惜容燕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婚度。 院中可真熱鬧蘸秘,春花似錦、人聲如沸蝗茁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哮翘。三九已至颈嚼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忍坷,已是汗流浹背粘舟。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佩研,地道東北人柑肴。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旬薯,于是被迫代替她去往敵國(guó)和親晰骑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容