まえがき
したがって、最後の点を「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レベルのシステム初期化が使用されます。
-   0-システムのシャットダウン 
      
 
 
-   1-システムをシングルユーザーモードで起動します 
      
 
 
-   2-ネットワークサポートなしでマルチユーザーモードでシステムを起動する 
      
 
 
-   3-ネットワークをサポートするマルチユーザーモードでのシステムブート 
      
 
 
-   4-使用されていません 
      
 
 
-   5-ネットワークサポートとグラフィカルログインを使用したマルチユーザーモードでのシステムブート 
      
 
 
-   6-システムの再起動 
      
 
 
各ランレベルは、/ 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"
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      パラメーターの意味は次のとおりです。
-   ONBOOT = "yes"-システムの起動時にデーモンを起動します 
      
 
 
-   IFACE = "eth0"-eth0インターフェイスのサーバーからIPを取得 
      
 
 
-   SERVICE = "dhcpcd"-起動されたサービス 
      
 
 
-   DHCP_START = ""-起動オプション 
      
 
 
-   DHCP_STOP = "-k"-停止パラメーター(kill) 
      
 
 
ファイル/ 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>
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      -   id-行識別子-1〜4文字の任意の組み合わせ。 同じ識別子を持つ2つの文字列が許可されます。 
      
 
 
-   runlevels-この行が関係するランレベル。 レベルは、例えば235(レベル2、3、および5で動作)のように、セパレーターなしで数字でリストされます 
      
 
 
-   process-指定されたレベルで起動されるプロセス(指定された実行レベルで呼び出されるプログラムの名前) 
      
 
 
-   action-コマンドを実行するための追加条件を定義するアクション。 可能な値 
      
 
 
 
 -   respawn-終了時にプロセスを再起動します 
      
 
 
-   once-指定されたレベルに移動するときにプロセスを1回だけ実行します 
      
 
 
-  待機-プロセスを開始し、initをスタンバイモードに切り替えます 
      
 
 
-   sysinit-実行のどのレベルに移行する前であっても、最初にinitによって実行されるアクション。 この方法でマークされたプロセスは、bootおよびbootwaitとしてマークされたプロセスまで起動します。 
      
 
 
-   boot-プロセスは、実行レベルに関係なく、システムのブート段階で起動されます 
      
 
 
-   bootwaitはbootwaitと同じですが、initがスタンバイモードになっています。 
      
 
 
-   powerwait-停電中に実行されるアクション。  UPSを想定 
      
 
 
-   ctrlaltdel-「3つの魔法のボタン」を押すとアクションが実行されます 
      
 
 
-   off-この要素を無視 
      
 
 
 
 
 
-   respawn-終了時にプロセスを再起動します 
      
さまざまなレベルの実行でアクションを実装するために、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
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      -   UNICODE = "1"-UTF-8でエンコードされたロケールを使用することを示します 
      
 
 
-   KEYMAP = "us"-コンソールレイアウト 
      
 
 
-   FONT = "UniCyr_8x16-キリル文字コンソールフォントを設定します 
      
 
 
デフォルトの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