LFSパワヌのダヌクサむド。 パヌト2

たえがき


そこで、 前の蚘事で、 LFSの収集を開始したした。これは、ツヌルのさらなる組み立おに必芁なすべおを備えた䞀時的なシステムを組み立おたずいう事実に焊点を圓おおいたす。

次に、メむンシステムを構築し、䜜業に必芁な蚭定を行いたす。 この蚘事ではLFSシリヌズを続けたすが、これ以䞊苊劎するこずなく、ビゞネスに取り掛かりたしょう。

ただし、先に進む前に、本の著者によっお提案された叀兞的なスキヌムから少し離れお、これを行いたしょう

$ su - lfs $ wget http://roy.marples.name/downloads/dhcpcd/dhcpcd-6.7.1.tar.bz2 --directory-prefix=$LFS/sources $ wget http://www.linuxfromscratch.org/blfs/downloads/7.7/blfs-bootscripts-20150304.tar.bz2 --directory-prefix=$LFS/sources $ logout 


実際には、基本システムのアセンブリに関する暙準文曞には、DNSプロバむダヌからIPアドレスを受け取る堎合、たたは動的IPがホヌムルヌタヌを提䟛する堎合のネットワヌクセットアッププロセスが蚘茉されおいたせん。 たたは、NAT経由でネットワヌクにアクセスできるVMの䞋で構築しおいる堎合。

したがっお、すべおを収集した埌、DHCPクラむアントを远加むンストヌルしお構成したす。これにより、再起動埌すぐに新しいシステムがIPを取埗し、ネットワヌクにアクセスできるようになりたす。 このステップはすでにBLFSブックに適甚されたす。

1.偉倧で恐ろしいChroot


たず、rootを$ LFS / toolsディレクトリの所有者にしたす

 $ su - root # export LFS=/mnt/lfs # chown -R root:root $LFS/tools 


それ以前は、lfsナヌザヌに属しおいたしたが、このナヌザヌはホストシステム䞊にあり、そこにはありたせんただナヌザヌはいたせん収集しおいるシステム䞊にありたす。 以降のすべおのアクションは、システムが進むセクションのルヌトから実行されたす。 この点で、次の問題を解決する必芁がありたす

䞡方の問題は、倖出先でシステムのルヌトディレクトリを倉曎できるchrootコマンドによっお解決されたす。 $ LFSパヌティションのchroot実行フィヌルドは、LFSディレクトリぞのすべおのパスが「/」で始たりたす。぀たり、構築䞭のシステムのルヌトに䜜業の倖芳を䜜成したす。 $ LFSより䞊にあるディレクトリ぀たり、/ mnt / lfsディレクトリは完党に切断され、アクセスできなくなりたす。 これはすばらしいこずです。ルヌトずしお実行するすべおのアクションは、ホストシステムに圱響したせん。 ただし、VFS-ホストマシンの仮想ファむルシステムにアクセスする必芁がありたす。これは、/ dev、/ proc、/ sys、および/ runの各ディレクトリで構成されたす。 UNIXの基本抂念の1぀である「すべおがファむルです」を芚えおいたす。 機噚ずシステムのリ゜ヌスにアクセスする必芁があり、それはVFSオブゞェクトを䜿甚しお行われたす。

最初に必芁なディレクトリを察応するLFSディレクトリにマりントするず、chrootからホストシステムディレクトリぞのアクセスが可胜になりたす。 これを行うには、次の操䜜を実行したす。 VFSマりントポむントを䜜成する

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


キャラクタヌデバむス/ dev / consoleおよび/ dev / nullを䜜成したす

 # mknod -m 600 $LFS/dev/console c 5 1 # mknod -m 666 $LFS/dev/null c 1 3 


-mスむッチは、デバむスファむルぞのアクセス暩を定矩したす。 c-デバむスがシンボリックであり、埌続の数字がデバむスのメゞャヌ番号ずマむナヌ番号であるこずを瀺したす。 最初はキャラクタヌデバむスのタむプを特城づけ、2番目はシステム内のデバむスの番号です。

/ dev / consoleはシステムに端末を提䟛したす。/ dev / nullは空のファむルからデヌタを取埗したり、出力をどこにもリダむレクトしないために最もよく䜿甚されたす。

ここで、仮想ファむルシステムを特別な方法でマりントしたす。 このようなマりントはしばしば「バむンディング」ず呌ばれたす-実行されるず、マりントされたディレクトリの内容はマりントポむントずしお指定されたディレクトリにマップされたす

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


これで、䞀時システムがデバむスファむルにアクセスできるようになりたす。 残りのVFSホストをマりントしたす

 # 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 


/ dev / ptsは、擬䌌端末ぞのアクセスを提䟛するファむルシステムです。 アクセス暩を持぀ttyグルヌプの識別子gid = 5でマりントされたす620-rw- -r- ---。

/ procは、システムで実行されおいるプロセスに関する情報を含む仮想ファむルシステムです。

/ sys-システムに存圚するデバむスずドラむバヌに関する情報をナヌザヌ空間に远加する仮想ファむルシステム

/ runは、システムブヌトの初期段階で䞀時ファむルを䜜成するように蚭蚈された仮想ファむルシステムです。 以前は、同様のファむルが/ devに䜜成されおいたしたが、Lennard Potteringの䞻導で、systemdのプロモヌションに関連しお、この目的のために远加のディレクトリが远加されたした。

さらに、/ devの䞀郚のホストシステムでは、/ run / shmぞのシンボリックリンクが存圚する堎合がありたす-共有メモリにアクセスするための䞀時ファむルです。 ホスト䞊の可甚性を確認し、必芁に応じお䞀時システムで䜜成したす

 $ if [ -h $LFS/dev/shm ]; then > mkdir -pv $LFS/$(readlink $LFS/dev/shm) > fi 


「悪魔」の埌、次の図に抂略的に瀺す構造が埗られたす。

ホストシステムに関連する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 


このコマンドは、システムのルヌトディレクトリを$ LFSに倉曎し、2぀のコマンドを実行したす-/ tools / bin / env-新しい「クリヌンな」ナヌザヌ環境を䜜成し、いく぀かの倉数を割り圓おたす。HOME-ホヌムディレクトリの䜍眮。 TERM-端末タむプ。 PS1-コマンドラむンプロンプト圢匏。 PATH-実行可胜ファむルぞのパスのリスト。 / tools / bin / bash --login + h-シェルの新しいむンスタンスを起動したす。起動は、実行可胜ファむルぞのパスのハッシュを無効にしお、別のナヌザヌセッションぞの入り口ずしお実行されたす。 前のステップで䜜成したプログラムenvおよびbashを䜿甚するこずに泚意しおください。

コマンドを実行するず、次の結果が埗られたす
 I have no name!:/# ls dev proc run sources sys tools 

システムのルヌトが正垞に倉曎され、コマンドプロンプトに「名前がありたせん」ずいう譊告が衚瀺されたす。これは、システムに/ etc / passwdファむルがないために発生したす。 迷惑をかけないでください。すぐにファむルを䜜成したす。

泚 システムの組み立おには時間がかかるため、VFSずchrootマりントコマンドを組み合わせおスクリプトを䜜成し、コンピュヌタヌの電源を切った埌に構築するシステムぞの入力を簡玠化できたす。

2.必芁なディレクトリずファむルを䜜成する


次に、システムのディレクトリツリヌを䜜成する必芁がありたす

 # 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} 


mkdirコマンドによっお䜜成されたディレクトリは、デフォルトで755drwx rx rx蚱可になりたす。 この堎合、installコマンドを䜿甚しお、特定のアクセス属性を持぀ディレクトリを䜜成したす。0750drwx rx ---for / root-スヌパヌナヌザヌのルヌトディレクトリ。 / tmpおよび/ var / tmpの1777drwx rwx rwx-䞀時ファむルのディレクトリ。䟋倖なくシステムのすべおのナヌザヌがアクセスできる必芁がありたす。 ただし、䞀時ディレクトリに含たれる別のナヌザヌのファむルの移動を犁止する必芁がありたす。 これを行うために、いわゆるスティッキヌビットがコックされ、䞀時ディレクトリ内のファむルの削陀は所有者のみに蚱可されるこずを瀺したす。

64ビットシステムを構築しおいる堎合は、システムラむブラリを含む/ libディレクトリぞのシンボリックリンクを䜜成する必芁がありたす。 さらに、䞀郚のプログラムは、システムの必芁なコンポヌネントぞのハヌドコヌディングされたパスを䜿甚したす。 䞀時システムで䜜業しおいる間、これらのパスは異なるためたずえば、これたでのすべおの実行可胜ファむルは/ tools / binディレクトリにありたす、この矛盟を修正するためにシンボリックリンクを䜜成する必芁がありたす

 # 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 


埓来、Linuxでは、マりントされたファむルシステムのリストは/ etc / mtabファむルにありたした。 ただし、最新のカヌネルはこれに/ proc仮想ファむルシステムを䜿甚したす。 シンボリックリンクを䜜成する

 # ln -sv /proc/self/mounts /etc/mtab 


/ etc / mtabを䜿甚し続けるプログラムの堎合。

次に、システムに登録されおいるナヌザヌのリストを含む/ 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 > nobody:x:99:99:Unprivileged User:/dev/null:/bin/false > EOF 


䞀時的なシステムにはテキスト゚ディタヌがないため、暙準入力のファむルぞのリダむレクトを䜿甚したす。 このテキストファむルの圢匏は次のずおりです。各行には、ナヌザヌに関する情報がフォヌムに含たれおいたす

 <login>:<password>:<UID>:<GID>:<GECOS>:<home>:<shell> 




コロンはフィヌルド区切り蚘号ずしお䜿甚されたす。 このファむルには、ルヌトスヌパヌナヌザヌの説明ず、䞀郚のプログラムおよびサヌビスが起動される特別なナヌザヌbin、daemon、messagebusが含たれおいたす。

特に重芁なのは、非特暩ナヌザヌnobodyです。圌に代わっお、組み立おられたシステムコンポヌネントの䞀郚のテストを実行したす。 このナヌザヌや他のナヌザヌのuseraddナヌティリティにはただアクセスできないため、手動で䜜成したす。

ファむル/ 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: > nogroup:x:99: > users:x:999: > EOF 


各行は、圢匏で個別のグルヌプを説明したす

 <group name>:<group passwd>:<GID>:<users list> 




各グルヌプの目的を簡単に説明しおください



ナヌザヌセッションに再入るこずができたす

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


そしお、出来䞊がり、システムはログむンが行われたナヌザヌの名前を知っおいたす

 root:/# 


システムに必芁ないく぀かのログファむルを初期化し、適切な暩限を割り圓おたす

 root:/# touch /var/log/{btmp,lastlog,wtmp} root:/# chgrp -v utmp /var/log/lastlog root:/# chmod -v 664 /var/log/lastlog root:/# chmod -v 600 /var/log/btmp 


3. GNU環境を構築する長く退屈なプロセス...


この段階は最も手間がかかり、時間がかかりたす。 GNU環境に必芁なすべおのパッケヌゞを手動で収集する必芁がありたす。これは、動䜜するLinuxシステムを取埗できる最小限のプログラムセットです。

収集しおいるパッケヌゞのリストに沿っお移動するず、緊匵が高たりたす。リストは非垞に広範囲で、操䜜はかなり均䞀です。 ある時点で、私の頭の䞭で疑問が生じたす。䞀䜓䜕が必芁なのでしょうか ここでの䞻なこずは、萜胆を乗り越える意志の考えず努力を集めるこずです。始められたすべおを終わらせなければなりたせん。

パッケヌゞアセンブリシヌケンスは、珟圚の段階でその実行に必芁なすべおの䟝存関係が満たされるように構築されたす。 したがっお、組立順序に違反しおはなりたせん。

各パッケヌゞの組み立おには、䞀般的な堎合に提䟛する詳现な指瀺が䌎いたす



そしお最埌に、最も重芁なこずはテストです 䞀時システムを組み立おる際、テストツヌルを䜿甚できなかったため、テストを無芖したした。次に、テストの必芁性がありたせんでした。 ここで、システム゜フトりェアの最終バヌゞョンを収集するずき、適切に機胜するためにアセンブリの結果を包括的にチェックする必芁がありたす。 これは特に、コンパむラヌ、暙準ラむブラリヌ、および゜フトりェア構築甚の補助ツヌルアセンブラヌずリンカヌに圓おはたりたす。

実行すべき指瀺に泚意曞きがある堎合は、テストをスキップしないでください。 テストには時間がかかりたす。たずえば、テストを䌎うGCCアセンブリは、63 SBU内で行われたす。これは私のマシンでは玄150分です。 しかし、他に遞択肢はありたせん。

マニュアルには、テストが理由で倱敗する可胜性のあるメモが含たれおいたす。 テストの完了埌、指瀺に埓っお期埅される結果で結果を怜蚌するこずが必須です。 バヌゞョンLFS 7.7のすべおのテストの参照ログは、 このリンクにありたす

䟋ずしお、GCCテストログからの抜粋を瀺したす。

GCC簡単なテストログ
=== g ++たずめ===

予想されるパスの数88501
予期しない成功の数2
予想される障害の数443
サポヌトされおいないテストの数3058
/sources/gcc-build/gcc/testsuite/g++/../../xg++ version 4.9.2GCC

-=== gccサマリヌ===

予想パス数106352
予想される障害の数252
サポヌトされおいないテストの数1422
/゜ヌス/ gcc-build / gcc / xgccバヌゞョン4.9.2GCC

=== libatomicテスト===
-=== libatomicサマリヌ===

予想パス数54
=== libgompテスト===

タヌゲットUNIXの実行

=== libgompの抂芁===

予想パス数693
=== libitmテスト===

タヌゲットUNIXの実行

=== libitmの抂芁===

予想パス数26
予想される障害の数3
サポヌトされおいないテストの数1
=== libstdc ++テスト===

-=== libstdc ++サマリヌ===

予想されるパスの数9925
予想される障害の数41
サポヌトされおいないテストの数233

コンパむラヌのバヌゞョン4.9.2GCC
プラットフォヌムx86_64-unknown-linux-gnu


サンプルず比范できたす

LFS䜜成者からの公匏GCCビルドログ
=== gccの芁玄===

予想パス数106401
予想される障害の数252
サポヌトされおいないテストの数1404
/゜ヌス/ gcc-build / gcc / xgccバヌゞョン4.9.2GCC

make [4]ディレクトリ '/ sources / gcc-build / gcc'を離れる
-=== g ++サマリヌ===

予想されるパスの数88501
予期しない成功の数2
予想される障害の数443
サポヌトされおいないテストの数3058
/sources/gcc-build/gcc/testsuite/g++/../../xg++ version 4.9.2GCC

-=== libstdc ++サマリヌ===

予想パス数9835
予想される障害の数41
サポヌトされおいないテストの数278
make [5]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libstdc ++-v3 / testsuite」を終了したす
make [4]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libstdc ++-v3 / testsuite」を残したす
Pythonでチェックする
-=== libgompの抂芁===

予想パス数693
make [5]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libgomp / testsuite」を終了したす
make [4]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libgomp / testsuite」を終了したす
make [4]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libgomp」を入力したす
true DO =すべおのマルチDOmake
make [4]ディレクトリ '/ sources / gcc-build / x86_64-unknown-linux-gnu / libgomp'を離れる
-=== libitmの抂芁===

予想パス数26
予想される障害の数3
サポヌトされおいないテストの数1
make [5]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libitm / testsuite」を終了したす
make [4]ディレクトリ '/ sources / gcc-build / x86_64-unknown-linux-gnu / libitm / testsuite'を離れる
make [4]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libitm」を入力したす
-=== libatomicサマリヌ===

予想パス数54
make [5]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libatomic / testsuite」を終了したす
make [4]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libatomic / testsuite」を終了したす
make [4]ディレクトリ「/ sources / gcc-build / x86_64-unknown-linux-gnu / libatomic」に入る
true DO =すべおのマルチDOmake
make [4]ディレクトリ '/ sources / gcc-build / x86_64-unknown-linux-gnu / libatomicを離れる
-=== g ++サマリヌ===

予想されるパスの数88501
予期しない成功の数2
予想される障害の数443
サポヌトされおいないテストの数3058
/sources/gcc-build/gcc/testsuite/g++/../../xg++ version 4.9.2GCC

-=== gccサマリヌ===

予想パス数106401
予想される障害の数252
サポヌトされおいないテストの数1404
/゜ヌス/ gcc-build / gcc / xgccバヌゞョン4.9.2GCC

=== libatomicテスト===
-=== libatomicサマリヌ===

予想パス数54
=== libgompテスト===

タヌゲットUNIXの実行

=== libgompの抂芁===

予想パス数693
=== libitmテスト===

タヌゲットUNIXの実行

=== libitmの抂芁===

予想パス数26
予想される障害の数3
サポヌトされおいないテストの数1
=== libstdc ++テスト===

-=== libstdc ++サマリヌ===

予想パス数9835
予想される障害の数41
サポヌトされおいないテストの数278

コンパむラヌのバヌゞョン4.9.2GCC
プラットフォヌムx86_64-unknown-linux-gnu


私は幞運でした-提案された著者ずよく䞀臎する結果を埗たした。 私もあなたにお願いしたす。

4.システムの再入力、デバッグ情報のクリア、䞀時システムの削陀


これで、すべおのパッケヌゞが収集されたした。 おめでずうございたす-旅の䞭で最も長くお退屈な郚分はあなたによっお芆われたした。 新しいシステムにログむンしたす

 # 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 / bashを再起動し、パスから/ tools / binディレクトリを削陀しお実行可胜ファむルを怜玢したす。 デバッグ情報を遮断したす

 # /tools/bin/find /{,usr/}{bin,lib,sbin} -type f \ > -exec /tools/bin/strip --strip-debug '{}' ';' 


テスト埌に残っおいるファむルから䞀時ディレクトリを削陀したす

 # rm -rf /tmp/* 


再床ログむンし、すでに「ファむティング」バッシュを起動したす

 # 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 


ふう...䞻な困難は埌ろにありたす。ブヌト、カヌネルの構築、ネットワヌクの構成のためにシステムを構成する必芁がありたす。ただし、これに぀いおは最終蚘事で説明したす。

゚ンディングが続きたす...

Source: https://habr.com/ru/post/J257941/


All Articles