LFS:パワーのダークサイド。 パート3

まえがき



したがって、最後の点を「i」 に付け、最後の記事で英雄的に収集して構成した実行可能ファイルとライブラリのヒープから最終的にLinuxを取得する方法について説明します。



1. Unix System V初期化サブシステム



この初期化サブシステムはLinuxで長い間使用されており、事実上の標準でした。 しかし、時間が経ち、一般的にこのアプローチは時代遅れとは言えません。 GNU / Linuxファミリーシステムの開発動向におけるこの初期化サブシステムは、Red Hat Corporationの腸内で生まれたsystemdに取って代わったことに注意する方がはるかに正確です。 まだ初期化スクリプトを使用しているディストリビューションがあります。 しかし、人気のあるLinuxはすべてほぼ完全にsystemdを使用するようになり、保守的なDebianと娘Ubuntuが最後に降伏しました。



実際、systemdを使用してLFSバリアントのビルドをすぐに開始しなかったことを後悔しています。 単純に、最初の失敗したビルドの試みの後、私は安定した道から逸脱したくありませんでした。 たぶん、私は戻ってこないのと同じように、おそらくこの問題に戻るでしょう。 時間はわかります。 それまでの間、System V initスクリプトの基本原則を検討してください。



システムが起動すると、ブートローダーはブータブルメディアのルートパーティションからLinuxカーネルを読み取ります。 カーネルが初期化された後、制御はinitプロセスに転送され、initプロセスは識別子PID = 1(物理的に/ sbin / initファイルにあります)を受け取ります。 このプロセスは、/ etc / inittabファイルで指定された設定に従って機能します。



デフォルトでは、7レベルのシステム初期化が使用されます。







各ランレベルは、/ etc / rc.d / init.d /ディレクトリにあるLFSの場合の初期化スクリプトに対応しています。 自分で作成する必要はありません。LFSの作成者は、$ LFS / sourceパスにあるLFS-Bootscriptsパッケージに設定に必要なものすべてを含めることでこれを処理しました。 このパッケージのみをインストールして、最小限の設定を行うことができます



2. LFS-Bootscriptsをインストールし、ネットワークを構成します、/ etc / inittab



前の段階でパッケージの組み立てに疲れて、他のものが現れて、マシンの電源を切ったと仮定します。 ここで再び、組み立てられたシステムに入る必要があります。 これを行うには、chrootを実行します



システムとVFSでパーティションをマウントします。



$ su - root # export LFS=/mnt/lfs # mount /dev/sda6 $LFS # mount -v --bind /dev $LFS/dev # 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
      
      





ルートの変更を実行します。



 # chroot "$LFS" /usr/bin/env -i \ > HOME=/root TERM="$TERM" PS1='[\u:\w]\$ ' \ > PATH=/bin:/usr/bin:/sbin:/usr/sbin \ > /bin/bash --login
      
      





ソースディレクトリに行き、必要なパッケージをインストールしましょう



 # cd /source # tar -pxf lfs-bootscripts-20150222.tar.bz2 # cd lfs-bootscripts-20150222 # make install
      
      





特に注意が必要なことは何もありませんでした-スクリプトは正しい方法でインストールされました。



それではセットアップを始めましょう。 Udevルールを生成します。



 # bash /lib/udev/init-net-rules.sh
      
      





さらに、このマニュアルでは、/ etc / udev / rules.d / 70-persistent-net.rulesにあるネットワークインターフェイスの命名規則を確認および編集することができます。 そして、ここで残念が待っていました-生成スクリプトがエラーを生成しました-このファイルを生成できません。



答えは同じガイドにあります:

MACアドレスが手動でネットワークカードに割り当てられている場合や、QemuやXenなどの仮想環境で割り当てられている場合など、アドレスが一貫して割り当てられていないため、ネットワークルールファイルが生成されていない場合があります。 これらの場合、この方法は使用できません。




はい。ただし、「QemuまたはXen」の場合は単なる私のものです。仮想マシン(ご存知のとおり、Qemuコードを使用してVirtualBox)の下に構築しました。 それでは、ネットワークカードに手動で名前を付けるためのルールを作成しましょう。 そして今では、catコマンドを使用してファイルを作成する必要はありません-Vim全体をアセンブルおよび構成しているからです! そしてVimは力です



 # vim /etc/udev/rules.d/70-persistent-net.rules
      
      





ルールのテキストを入力します。



 # net device e1000 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:f8:4c:26", ATTR{dev_id}="0x0", ATTR{type}="1", KERNEL=="eth*", NAME=="eth0"
      
      





このルールは、カーネルが属性として指定したMACアドレスを持つネットワークデバイスを検出すると、それに名前eth0を割り当てます。 端末でコマンドを発行して、ネットワークカードのMACアドレスを確認できます。



 # ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:f8:4c:26 brd ff:ff:ff:ff:ff:ff
      
      





enp03sデバイスのlink / etherパラメーターは、目的のポピーです。 デバイスはホストシステムと呼ばれます(「バトル」バッシュを起動することで一部の環境変数のルートと値を変更しただけですが、ホストシステムに残り、すべてのデバイスにアクセスできることを覚えています)。



これで、ネットワークアクセスを構成できます。 私の場合、VMで構築する場合、仮想NATを介してネットワークに接続するため、DHCPクライアントが必要です。 dhcpcdパッケージを具体的にダウンロードしました。これを収集して、システムにインストールします。



 # tar -pxf dhcpcd-6.7.1.tar.bz2 # cd dhcpcd-6.7.1 # ./configure --libexecdir=/lib/dhcpcd --dbdir=/var/tmp # make # make install # cd .. # rm -rf dhcpcd-6.7.1/
      
      





さらに、dhcpcdが機能するために必要なスクリプトをインストールします。



 # tar -pxf blfs-bootscripts-20150304.tar.bz2 # cd blfs-bootscripts-20150304 # make install-service-dhcpcd
      
      





最後に、構成を作成します。



 # vim /etc/sysconfig/ifconfig.eth0
      
      







コンテンツあり:



 ONBOOT="yes" IFACE="eth0" SERVICE="dhcpcd" DHCP_START="" DHCP_STOP="-k"
      
      





パラメーターの意味は次のとおりです。







ファイル/ etc / hostnameを作成します。このファイルにホスト名を記述します。



 echo "lfs" > /etc/hostname
      
      





これらの操作の後、再起動後にネットワークが立ち上がるという事実に頼ることができます。



それでは、initをセットアップしましょう。



 # vim /etc/inittab
      
      





マニュアルには、次のスクリプトが用意されています。



 # Begin /etc/inittab #      - 3 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 #    Ctrl + Alt + Del -  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
      
      





このファイルの行は、コロンで区切られた4つのフィールドで構成されています。



 <id>:<runlevels>:<action>:<process>
      
      









さまざまなレベルの実行でアクションを実装するために、LFSはスクリプト/etc/rc.d/init.d/rcを提供します。このスクリプトは、起動レベルをパラメーターとして受け取ります。



ダウンロードに失敗した場合にシングルユーザーログインを実行するには、/ sbin / suloginコマンドが呼び出され、このシングルユーザーログインも実行されます。



/ sbin / shutdownプロセスは、システムが停止/再起動すると開始されます



/ sbin / agetty-仮想端末を作成および初期化します。



システムの操作中に実行レベルを変更して、ルートからコマンドを与えることができます



 # init <runlevel>
      
      





トリガーレベルをパラメーターとして指定します。 ほとんどの既知のhaltコマンドはinit 0のエイリアスであり、rebootコマンドはinit 6のエイリアスです。



次のコマンドを発行して、現在の起動レベルを確認できます。



 # runlevel
      
      





または:



 # who -r
      
      





3.ウォッチ、ローカライズ、その他の楽しいこと



システムクロックを正しく動作させるには、構成を作成します



/ etc / sysconfig / clock

 # 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
      
      







ここでは、ハードウェアクロックが世界協定時刻に従って進むことが示されており、GLibcパッケージをセットアップするときにタイムゾーンの修正を既に行っています。



ここで、コンソールフォントを適切に構成する必要があります。 必要なすべてのロケールはGLibcとともにインストールされます。 キリル文字に興味があるので、この形式でコンソール構成ファイルを作成します



/ etc / sysconfig / console

 # Begin /etc/sysconfig/console UNICODE="1" KEYMAP="us" FONT="UniCyr_8x16" # End /etc/sysconfig/console
      
      











デフォルトのbashプロファイルを設定してロケールを設定します



/ etc /プロフィール

 # Begin /etc/profile export LANG=ru_RU.UTF-8 # End /etc/profile
      
      







順序については、キーボード入力を担当するシェルおよびreadlineライブラリで使用されるいくつかのキーボード設定も「バインド」する必要があります。



/ etc / inputrc

 # Begin /etc/inputrc #       set horizontal-scroll-mode Off #  8-   set meta-flag On set input-meta On #   8-  set convert-meta Off #  8-    set output-meta On # ,    set bell-style none #   -   escape- , #    ,    # readline "\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
      
      







この特定の構成には特に注意を払いたくないので、詳細な分析は宿題にします。



次の構成は、システムで使用が許可されているシェルの名前を定義します



/ etc /シェル

 # Begin /etc/shells /bin/sh /bin/bash # End /etc/shells
      
      







この時点で、システムの初期セットアップは終了し、最後のわずかなタッチのみが残ります。



4.カーネルアセンブリ



皮肉なことに、カーネルの構築はすべての作業の一部です。 / sourcesディレクトリに移動し、ソースを展開します(もう一度)。



 # cd /sources # tar -pxf linux-3.19.tar.bz2 # cd linux-3.19
      
      





ソースツリーをチェックして、カーネルをコンパイルする準備をします。



 # make mrproper
      
      





カーネルアセンブリ構成を生成する必要があります。



 # make menuconfig
      
      





これにより、多くの人が耳にしたことのないコンフィグレータが起動します。



必要な構成について言えること。 まず、LFSアセンブリマニュアルでは、次のオプションのインストールを確認することを推奨しています。







/ devでの仮想ファイルシステムdevtmpfsのマウントのサポート-カーネルブートの初期段階でメモリにデバイスファイルを動的に作成し、/ devをマウントします。



それ以外はすべて、ハードウェア構成とカーネルに含める機能に依存します。 たとえば、完全なNTFSサポートのみを追加し、残りはデフォルトで残しました。



configを.configとして保存し、コンフィギュレーターを終了してカーネルを組み立てます



 # make
      
      





カーネルモジュールをインストールします。



 # make modules_install
      
      





アセンブルされたカーネルを/ bootディレクトリにコピーし、名前を変更します。



 # cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-3.19-lfs-7.7
      
      





マップファイルと、アセンブルされたカーネルの構成を保存します。



 # cp -v System.map /boot/System.map-3.19 # cp -v .config /boot/config-3.19
      
      





ドキュメントをインストールします。



 # install -d /usr/share/doc/linux-3.19 # cp -r Documentation/* /usr/share/doc/linux-3.19
      
      





モジュールのオプションのロード、たとえばUSBサポート用の構成を作成します。



 # install -v -m755 -d /etc/modprobe.d # vim /etc/modprobe.d/usb.conf
      
      





/etc/modprobe.d/usb.conf

 # 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
      
      





私たちは自分自身に取り組みます:

 # cd .. # rm -rf linux-3.19/
      
      







5.ファイルシステムをマウントし、ブートローダーを構成する



マウント構成/ etc / fstabを作成します。 私にはこのように見えました:



/ etc / fstab

 /dev/sda6 / ext4 defaults 1 1 /dev/sda2 swap swap pri=1 0 0 proc /proc proc nosuid,noexec,nodev 0 0 sysfs /sys sysfs nosuid,noexec,nodev 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /run tmpfs defaults 0 0 devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
      
      







/ dev / sda2および/ dev / sda6は、それぞれLFSシステムのスワップおよびルートパーティションです。



HDD(Arch Linux)に既にインストールされているシステムからLFSを収集したため、最初のブートでは、ハードドライブに既にインストールされているGrub2ブートローダーを使用することを好みました。 構成するには、構成を使用してカスタムブートメニュー項目を作成しました。



組み立てられたシステムを終了します。



 # loguot
      
      





そして、ホストシステムでファイルを編集します。



/etc/grub.d/40_custom

 #!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. menuentry "GNU/Linux, Linux 3.19-lfs-7.7" { insmod=ext2 set root=(hd0,6) linux /boot/vmlinuz-3.19-lfs-7.7 root=/dev/sda6 ro }
      
      





その後、ブートローダーの設定を再生成します:



 # grub-mkconfig -o /boot/grub/grub.cfg
      
      





そして...リブート:



 # systemctl reboot
      
      





すべてが正常であり、間違えていなければ、OS選択メニューが表示されます。







LFSシステムの最後のアイテムを選択してください...







はい! ダウンロードが開始され、ネットワークインターフェイスがどのように上昇するかを確認できます。IPおよび...ログイン画面が表示されるのを待ちます:







ルートとしてログインします。







そして、正しいロケール設定を示すものを実行します:



 # vim
      
      









ロシア語はそれがあるべき場所です。 ネットワークを確認します。



 # ping ya.ru
      
      





そして、pingがどのように進行するかを観察します。







じゃあ



目標が達成された今....結論の代わりに



Linuxを「ゼロから」(ゼロから)構築することを試みました。 そして成功しました。 最小限の作業システムがあり、それを使ってさらに何でもできます-実際のハードウェアに転送して、ホームシステムに変えてみてください。 パッケージマネージャーなしでホームシステムを維持することは非常に難しいため、賞賛して忘れることができます。



楽しみのためにやっただけで、新しい知識が得られ、全体的に満足しました。



PS:構築しシステムはここからダウンロードできます 。 参照による-VirtualBoxのディスクイメージ。 ログインオプションは次のとおりです。



ログイン:root

パスワード:123456



ログイン:maisvendoo

passwd:maisvendoo



All Articles