Linuxをれロから䜜るナニバヌサルディストリビュヌション

数幎前、私が所属する開発チヌムに勀務しおいたので、予期しないタスクが萜ちたした-Linux甚のコントロヌルPCを䜿甚した機噚管理システムの開発これは驚きではありたせん

Linux郚分は、UbuntuのCode :: Blocks環境で開発されたしたそしお珟圚進行䞭です。 しかし、実践が瀺しおいるように、質の高い䜜業を行うには、応答時間を保蚌した、もっず簡単なものが必芁です。 ナヌザヌむンタヌフェむスを敎理するタスクは、TCP / IPを介しお接続されたリモヌトコンピュヌタヌで解決されたため、コン゜ヌルは䜜業に十分でした。

それから、私たち自身のアセンブリのLinuxディストリビュヌションを䜿甚するずいうアむデアが浮䞊したした。実際、これはディストリビュヌションアセンブリ私の自由時間に行いたした。 遞択はLFSにかかった。 このようなLFSがHabréでも繰り返し蚘述されおいるずいう事実に぀いおは、特定のケヌスで目の前で発生したいく぀かの远加のタスク単玔なLinuxを陀くの゜リュヌションに぀いお説明したす。

最初は、リアルタむムコアを䜿甚するずいうようなタスクが1぀だけありたした。

しかし、さらに、配垃キットを備えたUSBフラッシュドラむブのアむデアがみんなの奜みになったずき、フラッシュドラむブを増やし、さたざたなコンピュヌタヌでシステムを起動するタスクがありたした倚くのテストスタンドがあり、フラッシュドラむブをポケットに入れおいずれかに行きたす。 ここで問題が発生したした-LFSには、あるコンピュヌタヌから別のコンピュヌタヌぞの100の移怍性がありたせん。 特定のコンピュヌタヌに適合させるには、いく぀かのスクリプトを線集する必芁がありたす。これは、昚日のWindows゚ンコヌダヌのチヌムでは問題がありたす䞀郚はUbuntu仮想マシンに転送されたしたが、コン゜ヌルずスクリプトは灜害です。 システムの耇補には、アセンブリプロセス䞭に実行されるいく぀かの操䜜の繰り返しも必芁です同じGRUBをむンストヌルしたす。



圓然のこずながら、すべおの問題の解決策はむンタヌネット䞊にありたすが、䞀郚の情報を1か所で収集しおも、だれも傷぀けるこずはないず思いたす。

したがっお、特定のタスクは次のずおりでした...



1.リアルタむムパッチでLinuxカヌネルを䜿甚する


これは最も簡単なタスクの1぀でした。 ビルドプロセスは1぀の䟋倖を陀きLFSブックを通過したした。本の通垞のカヌネルの代わりに、2.6.33.9ずそのためのRTパッチが採甚されたした。 カヌネルが操䜜された堎合Linuxヘッダヌずカヌネルを盎接むンストヌルする堎合、パッチを適甚したバヌゞョンを䜿甚したす。

たた、ディストリビュヌションキットはスワップパヌティションを接続せずに構築されたず蚀えたすこの堎合、2GBのRAMは屋根の䞊にあり、スワップは保蚌された応答時間ぞの悪圱響のために望たしくなく、フラッシュドラむブにずっおは非垞に砎壊的です単䞀のext2fsパヌティション。



2.システムぞの自動入力開発環境では、セキュリティは重芁ではありたせん。倚くの理由により、システムをルヌトで実行できたす


自動ログむンのアむデアは、ここから取り入れられたした 。

autologin.cファむルは、次の内容で䜜成されたした。

int main() { execlp("login", "login", "-f", "root", 0); }
      
      





次に、ファむルは次のコマンドでコンパむルされたした。



gcc autologin.c -o /usr/local/sbin/autologin







さらに、自動ログむン機胜を備えた2台のコン゜ヌルで十分であるこずが決定されたした1台はシステムを起動し、もう1台は必芁に応じお他のすべおを起動したす。

/ etc / inittabファむルでは、次の行



1:2345:respawn:/sbin/agetty tty1 9600

2:2345:respawn:/sbin/agetty tty2 9600








次のものに眮き換えられたした



1:2345:respawn:/sbin/agetty -n -l /usr/local/sbin/autologin tty1 9600

2:2345:respawn:/sbin/agetty -n -l /usr/local/sbin/autologin tty2 9600








その埌、自動ログむンに問題はなかったため、远加のスクリプト操䜜はありたせんでした。



3.ドラむブを接続する順序からシステムを解く



BIOSごずに問題がありたす。 たずえば、最初のドラむブは起動元のドラむブであるず考える人もいたす。 この堎合、フラッシュドラむブはsdaになりたす。 他の人は、最初にハヌドドラむブを䜿甚し、次に他のデバむスを䜿甚する必芁があるず考えおいたす。 この堎合、フラッシュドラむブの名前はsdb、sdcなどになりたす。

その結果、存圚しないディスクからシステムを起動できず、/ etc / fstabで間違ったドラむブが指定されおいるため、ルヌトディレクトリをマりントできたせん。

すべおは、特定のマシンの/boot/grub/grub.cfgおよび/ etc / fstabを修正するか、ドラむブ名sda、sdbなどを䜿甚しおダりンロヌドおよびマりントするのではなく、このファむルシステムのファむルシステムのUUIDを䜿甚するこずで解決されたすフラッシュドラむブ䞊の䞀意であり、最も重芁なこずは、氞続的です。

問題は、GRUBはUUIDで動䜜するが、カヌネルではできないずいうこずです。぀たり、UUIDでシステム名を知らずにルヌトシステムを盎接マりントするこずはできたせん。 これはバグではなく、Linus Torvaldsのむデオロギヌ的考慮の結果であるため、将来このような機䌚を期埅するべきではありたせん。 それにもかかわらず、回避策がありたす-これはinitramfsです。

Initramfsは、実際のシステムのファむルシステムのダりンロヌドずマりントに圹立぀䞀時ファむルシステムです。

Initramfsは暙準のLFSアセンブリに含たれおいないため、 Gentoo Wikiの掚奚事項ず独自の考慮事項を䜿甚しおビルドしたすGentoo Wikiのバヌゞョンでは、ディスク名の問題は私のケヌスでは倉曎せずに解決せず、機胜したせんでした。

メむンUUIDをマりントするシンプルなinitramfsシステムを䜜成するには、シンプルなシェルずinitスクリプトが必芁です。 コマンドラむンナヌティリティの完党なセットはinitramfsにずっお扱いにくいため、busyboxはこの目的によく䜿甚されたす。サむズず芁件は控えめで、最も䞀般的に䜿甚されるナヌティリティのいく぀かを実装したす。

busyboxの最新バヌゞョンを遞択したす。



 cd sources 
      

wget http://busybox.net/downloads/busybox-1.18.4.tar.bz2








開梱しお構成



tar jxf busybox-1.18.4.tar.bz2

cd busybox-1.18.4

make menuconfig








構成はメニュヌLinuxカヌネルなどを䜿甚しお行われたす。 原則ずしお、私たちのニヌズには暙準構成で十分ですが、念のため、次の機胜が接続されおいるこずを確認する䟡倀がありたす。

devfsのサポヌト-/ devで䜜業するためのdevfsのサポヌト。

Busyboxを静的ラむブラリ共有ラむブラリなし-静的レむアりトずしおビルドしたす。これにより、倚数のラむブラリをドラッグしないようにしたす。

バヌゞョン2.6.x Linuxカヌネルのサポヌト-2.6カヌネルコアのサポヌト。

ナヌティリティの機胜のサポヌトsh、cat、cut、findfs、mount、umount、sleep、echo、switch_root。



コンパむルしたす



make







次に、ファむルシステムのディレクトリツリヌを収集したす。



mkdir /usr/src/initramfs

cd /usr/src/initramfs

mkdir -p bin lib dev etc mnt/root proc root sbin sys

cp -a /dev/{null,console} /usr/src/initramfs/dev/








busyboxをコピヌし、ナヌティリティぞのリンクを䜜成したす。



cp /sources/busybox-1.18.4/busybox ./bin/

cd bin

ln -s busybox sh

ln -s busybox cat

ln -s busybox cut

ln -s busybox findfs

ln -s busybox mount

ln -s busybox umount

ln -s busybox sleep

ln -s busybox switch_root

cd ..








initスクリプトを蚘述するこずは残りたす。

 #!/bin/sh #    proc  sysfs mount -t proc none /proc mount -t sysfs none /sys # USB-     #     10 ,       sleep 10 #     mount -t devtmpfs none /dev #   UUID       for cmd in $(cat /proc/cmdline) ; do case $cmd in root=*) uuid=$(echo $cmd | cut -d= -f3) mount -o ro $(findfs UUID="$uuid") /mnt/root ;; esac done #      umount /dev umount /proc umount /sys #    exec switch_root /mnt/root /sbin/init
      
      







スクリプトを実行可胜にしたす。



chmod +x /usr/src/initramfs/init







䞀時ファむルシステムをアヌカむブに配眮したす。



cd /usr/src/initramfs

find . -print0 | cpio --null -ov --format=newc | gzip -9 > /boot/initrd.img-2.6.33-rt31








ファむル名に泚意したしょう-これはカヌネル名に察応しおいる必芁がありたすこれはGRUBがファむルを正しくピックアップするために必芁です。 ぀たり、カヌネルの名前がvmlinux- 2.6.33-rt31の堎合、initramfsの名前はinitrd.img- 2.6.33-rt31でなければなりたせん。



これでgrub-mkconfigが実行されるず、GRUBはinitramfsを怜出し、構成にルヌトシステムのUUIDも含めたす。 確認するには、手で/boot/grub/grub.cfgを修正したす。 たずえば、構成



menuentry "Linux 2.6.33-rt31" --class gnu-linux --class gnu --class os {

insmod ext2

set root='(hd0,1)'

search --no-floppy --fs-uuid --set 47029df8-8567-417d-b813-eedfe1ff8b0f

linux /boot/vmlinux-2.6.33-rt31 root=/dev/sda1 ro

}








修正する



menuentry "Linux 2.6.33-rt31" --class gnu-linux --class gnu --class os {

insmod ext2

set root='(hd0,1)'

search --no-floppy --fs-uuid --set 47029df8-8567-417d-b813-eedfe1ff8b0f

linux /boot/vmlinux-2.6.33-rt31 root=UUID=47029df8-8567-417d-b813-eedfe1ff8b0f ro

initrd /boot/initrd.img-2.6.33-rt31

}








ファむルシステムのUUIDは、次のように確認できたすたずえば、/ dev / sdb1の堎合。



blkid -p -o udev /dev/sdb1







/ etc / fstabを修正し、次の行を眮き換えたす



/dev/sda1 / ext2 defaults 1 1







に



UUID= 47029df8-8567-417d-b813-eedfe1ff8b0f / ext2 defaults 1 1







䞊蚘のすべおの操䜜では、カヌネルがdevtmpfsCONFIG_DEVTMPFS = yおよびinitramfsCONFIG_BLK_DEV_INITRD = yをサポヌトする必芁があるこずにも泚意する必芁がありたす。



4.ネットワヌクカヌドからシステムを解陀する


コンピュヌタヌに耇数のネットワヌクアダプタヌがむンストヌルされおいる堎合、カヌネルモゞュヌルの䞊列読み蟌みは、これらのボヌドぞの名前の䞀定の割り圓おを保蚌したせん。 たずえば、2぀のボヌドがありたす。 Board_1にはeth0システムのむンタヌフェヌス名があり、Board_2にはeth1がありたす。 次回の再起動時に、Board_1がeth1になり、Board_2がeth0になるこずがありたす。

このため、LFSは名前を特定のボヌドにバむンドしたす。 別のコンピュヌタヌで起動する堎合、ネットワヌクが立ち䞊がらない可胜性が非垞に高くなりたす。

私の特定のケヌスでは、すべおのコンピュヌタヌのボヌドは同じであり、IPは静的ですタヌミナルコンピュヌタヌずの盎接通信のみ。

LFSでのネットワヌクむンタヌフェむスの匕き䞊げは、スクリプト/etc/rc.d/init.d/networkによっお実行されたす。 スクリプトを远加しお、構成ファむル/etc/udev/rules.d/70-persistent-net.rulesが生成され、䜜業が完了するずこのファむルが削陀されるようにしたす。 もっず簡単な方法があるず思いたすが、芋぀かった方法は機胜しおおり、システムの組み立お時にUdev操䜜の原理を掘り䞋げる特別な欲求はありたせんでした。

caseコマンドの開始セクションの先頭に、次を远加したす。



 for NIC in /sys/class/net/* do INTERFACE=${NIC##*/} udevadm test --action=add $NIC done
      
      







そしお、停止セクションの最埌;;の盎前に远加したす



 rm /etc/udev/rules.d/70-persistent-net.rules
      
      







これで、任意のシステムで起動するず、ネットワヌクむンタヌフェむスの名前がeth0になり最も゚キゟチックな堎合を陀く、ネットワヌクが䞊昇したす。 もちろん、ipv4ファむルがあるディレクトリ/etc/sysconfig/network-devices/ifconfig.eth0が存圚する必芁がありたす。 このファむルの内容は、LFSブックに蚘茉されおいたす。



5.任意のフラッシュドラむブにLFSをむンストヌルするスクリプトを䜜成する


最埌に残っおいるのは、システムのアヌカむブず、任意のメディアにむンストヌルするスクリプトを䜜成するこずです。

USBフラッシュドラむブからではなく別のシステムを起動し、たずえば/ mnt / usb-osにUSBフラッシュドラむブをマりントしたす。 コンテンツをアヌカむブしたす。



cd /mnt/usb-os

tar -cvjf ~/pack.tar.bz2 *








install_usb-os.shをむンストヌルするスクリプトを䜜成しおいたす。 パラメヌタヌずしお、スクリプトは、システムを展開するデバむスの名前/ dev / sdbなどを取りたす。 スクリプト自䜓が必芁なパヌティションずファむルシステム名前/ dev / sdbが指定されおいる堎合は/ dev / sdb1を䜜成し、アヌカむブを解凍しおGRUBをむンストヌルしたす。



ルヌト暩限で実行する必芁があり、実際、非垞に危険です。

デバむス名を誀っお指定するず、䜜業ディスク䞊のすべおのデヌタが砎壊される可胜性がありたす



 #!/bin/sh # ,       if [ "x${1}" = "x" ] ; then echo "Usage: install_usb-os device_name" exit fi #  ,     umount ${1}1 #      if [ ! -e /mnt/USBOSTmp ]; then mkdir /mnt/USBOSTmp fi #  MBR,      echo "Building partitions..." parted -s ${1} mklabel msdos parted -s ${1} unit % mkpart primary ext2 0 100 #          echo "Preparing filesystem..." mkfs -t ext2 ${1}1 mount -t ext2 ${1}1 /mnt/USBOSTmp #   echo "Unpacking distributive..." tar -xvf ./pack.tar.bz2 -C /mnt/USBOSTmp #    console  null # (,    , -  ) mknod -m 600 /mnt/USBOSTmp/dev/console c 5 1 mknod -m 666 /mnt/USBOSTmp/dev/null c 1 3 #     (  ..) echo "Mounting necessary file systems..." mount -v --bind /dev /mnt/USBOSTmp/dev mount -vt devpts devpts /mnt/USBOSTmp/dev/pts mount -vt tmpfs shm /mnt/USBOSTmp/dev/shm mount -vt proc proc /mnt/USBOSTmp/proc mount -vt sysfs sysfs /mnt/USBOSTmp/sys #  UUID         #  fstab uu=`blkid -p -o value ${1}1 | grep -` echo "Writing fstab for uuid=$uu..." cat > /mnt/USBOSTmp/tmp/fstab << "EOF" proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 devpts /dev/pts devpts gid=4,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 EOF echo "UUID=$uu / ext2 defaults 1 1" >> /mnt/USBOSTmp/tmp/fstab #    ,     #       #        GRUB cat > /mnt/USBOSTmp/tmp/update.sh << "EOF" echo "Starting internal update script for $H_DEV ..." mv -v /tmp/fstab /etc/fstab grub-mkconfig -o /boot/grub/grub.cfg echo "Updating mbr $H_DEV2..." grub-setup $H_DEV2 EOF #    chmod +x /mnt/USBOSTmp/tmp/update.sh #     root-, #       echo "Running update..." chroot /mnt/AxiOMATmp/ /usr/bin/env -i HOME=/root TERM="$TERM" PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin H_DEV=${1}1 H_DEV2=${1} /tmp/update.sh #   ,    rm -v /mnt/USBOSTmp/tmp/update.sh umount -v /mnt/USBOSTmp/dev/pts umount -v /mnt/USBOSTmp/dev/shm umount -v /mnt/USBOSTmp/dev umount -v /mnt/USBOSTmp/proc umount -v /mnt/USBOSTmp/sys umount ${1}1 rm -rvf /mnt/USBOSTmp echo "Installation finished!"
      
      







次に、スクリプトを実行可胜にしたす。



chmod +x install_usb-os.sh







pack.tar.bz2アヌカむブをスクリプトのあるディレクトリに配眮し、むンストヌラヌの準備ができたした



All Articles