序文
Linuxオペレーティングシステムは、1991.10.5に、そのオープンソースと自由のソースの誕生以来、多くの技術的な雄牛を得るために、各Linux愛好家は、Linuxカーネルやオープンソースのソフトウェアなど、後で学習や研究のための良い環境を提供するかどうか、電源の独自のシェアに貢献しています。Linuxerとして、フリースペースを提供するために前任者に感謝するので、また、Linuxを勉強すると同時に勉強することができます。
この記事は、主に既存のLinuxシステムの調整を通じて、独自のLinuxの小さなシステムを作成するため、ネットワークカードドライバをロードすることができますし、ネットワーク機能を実現するために、IPアドレスを設定します。
第二に、原理
Linuxの小さなシステムを作る、それは再びLinuxのブートプロセスを理解する必要があります:
1、まず第一に、LinuxはPOSTセルフテストを介してする必要があります、ハードウェアデバイスに障害がないことを確認します。
2、複数のブートディスクがある場合は、BIOSでブートディスクを選択する必要があります。
3、MBRのブートローダのブートローダを起動します。
4、カーネルファイルをロード
5、親プロセスのすべてのプロセスの実装では、最も古い祖先の開始
6、ウェルカム画面を印刷
Linuxのブートプロセスでは、他の2つのファイルの助けを借りて、カーネルファイルをロードします:
(1)initrd、これはCentOS5のメモリ・エミュレートされたディスク・デバイスです。
(2) initramfs、CentOS 6のメモリ・エミュレートされたファイルシステム。
起動プロセスでinitが使用される主な操作は何ですか?
etc/inittabこの設定ファイルを呼び出してinitし、/etc/rc.d/rc.sysinitシステム初期化スクリプトを実行しに行きます。
Linuxがウェルカムインターフェースを表示した後、それはシステムが正常に起動したことを意味し、あなたが小さなLinuxシステムを作りたい場合は、一緒にブートプロセスで使用されるすべてのファイルをロードするだけで、あなた自身のシステムを点灯することができ、Linuxはモジュラーオペレーティングシステムであり、多くの機能コンポーネントは、モジュラーツールを介して実装されており、動的なロードおよびアンロードをサポートしています。あなたが特定の機能を実現したい場合は、単に対応するモジュールをロードすると、Linuxオペレーティングシステムの大きなスリムを実現することができます。
ステップ
1、ターゲットディスクパーティション
soft-Linuxという名前のホストに新しいディスクをハングアップし、このディスクは、ホスト上の2番目のディスクであるため、ここでは/dev/sdbであり、それがターゲットホストにマウントされるまでに、そこにこのディスクしかないので、ターゲットホスト上の名前は/dev/sdaでなければなりません、これは混同することはできません。まず、ターゲットディスク上に2つのパーティションを作成し、フォーマットする必要があります。*** 最初のパーティションはブートローダ用に500M、2番目のパーティションはルートファイルシステム用に10Gです。次にマウント操作を行い、/dev/sdb1 を /mnt/boot 以下に、/dev/sdb2 を /mnt/sysroot 以下にマウントします。
[root@nmshuishui ~]# mount /dev/sdb1 /mnt/boot
mount: mount point /mnt/boot does not exist
[root@nmshuishui ~]# mkdir -p /mnt/boot /mnt/sysroot
[root@nmshuishui ~]# mount /dev/sdb1 /mnt/boot
[root@nmshuishui ~]# mount /dev/sdb2 /mnt/sysroot/
[root@nmshuishui ~]#
2、grubをターゲットディスクにマウントします。
システムは起動することができ、起動する必要があるので、最初に行うことは、新しいディスクにgrubブートローダをインストールすることです、grubブートローダをインストールする2つの主要なコマンドがあります、1つはgrub-installで、もう1つはsetupです、ここで***はインストールするgrub-installを使用します。なぜなら
1. grub-installgrubブートフェーズ2をインストールするファイル
2. setupブートローダーの第2段階はインストールされず、MBRへのブート情報のインストールとなる。
2つ目の注意点は、--root-directory=このパスは、ブートディレクトリがある場所であるべきで、/mnt/bootではなく、mntの下にある。
[root@nmshuishui ~]# grub-install --root-directory=/mnt /dev/sdb
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
[root@nmshuishui ~]# cd /mnt/boot/
[root@nmshuishui boot]# ls
grub lost+found
[root@nmshuishui boot]# cd grub/
[root@nmshuishui grub]# ls
device.map e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 reiserfs_stage1_5 stage1 stage2 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5
[root@nmshuishui grub]#
なぜなら:grubをインストールした後、grubディレクトリに入ると、grub.conf設定ファイルがないことがわかります、これはブートローダが健全でないことにつながるので、手動でそこに設定ファイルを書き込む必要がありますが、これはカーネルバージョンを知っている必要があります、あなたがカーネルバージョンを移植したときに、戻って、この手順を追加します。
3、カーネルファイルとinitrdファイルをコピーします。
initは、システム上の他のすべてのプロセスを起動するためのプログラムです。initはすべてのプロセスの親プロセスであり、すべてのプロセスの大親分です。設定ファイルである/etc/inittabを呼び出し、/etc/rc.d/rc.sysinitのシステム初期化スクリプトを実行します。
カーネルファイルとinitrdファイルを/dev/sdb下のブートディレクトリにコピーします。
[root@nmshuishui grub]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz-soft
[root@nmshuishui grub]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs-soft.img
[root@nmshuishui grub]#
4.ターゲットホストのルートファイルシステムを作成します。
1.コマンドラインを使用して、Create File Systemを展開します。
[root@nmshuishui sysroot]# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
mkdir: created directory `/mnt/sysroot/etc'
mkdir: created directory `/mnt/sysroot/etc/rc.d'
mkdir: created directory `/mnt/sysroot/usr'
mkdir: created directory `/mnt/sysroot/var'
mkdir: created directory `/mnt/sysroot/proc'
mkdir: created directory `/mnt/sysroot/sys'
mkdir: created directory `/mnt/sysroot/dev'
mkdir: created directory `/mnt/sysroot/lib'
mkdir: created directory `/mnt/sysroot/lib64'
mkdir: created directory `/mnt/sysroot/bin'
mkdir: created directory `/mnt/sysroot/sbin'
mkdir: created directory `/mnt/sysroot/boot'
mkdir: created directory `/mnt/sysroot/srv'
mkdir: created directory `/mnt/sysroot/mnt'
mkdir: created directory `/mnt/sysroot/media'
mkdir: created directory `/mnt/sysroot/home'
mkdir: created directory `/mnt/sysroot/root'
[root@nmshuishui sysroot]# ls
bin boot dev etc home lib lib64 lost+found media mnt proc root sbin srv sys usr var
[root@nmshuishui sysroot]#
[root@nmshuishui mnt]# sh ~/scripts/cporder.sh
Enter a command: bash
Enter a command: shutdown
Enter a command: reboot
Enter a command: vim
Enter a command: touch
Enter a command: mkdir
Enter a command: rm
Enter a command: ls
Enter a command: cat
Enter a command: less
Enter a command: ifconfig
Enter a command: ip
Enter a command: route
Enter a command: quit
quit
[root@nmshuishui mnt]# sync
[root@nmshuishui mnt]# sync
[root@nmshuishui mnt]# ls
boot sysroot
[root@nmshuishui mnt]# cd sysroot/
[root@nmshuishui sysroot]# ls
bin lib64 sbin usr
[root@nmshuishui sysroot]# cd bin/
[root@nmshuishui bin]# ls
bash cat ls mkdir rm touch
[root@nmshuishui bin]# ln -sv bash sh
`sh' -> `bash'
[root@nmshuishui bin]# sync
[root@nmshuishui bin]#
#!/bin/bash
#
target=/mnt/sysroot
clearCmd() {
if which $cmd &> /dev/null; then
cmdPath=`which --skip-alias $cmd`
else
echo "No such command"
return 5
fi
}
cmdCopy() {
cmdDir=`dirname $1`
[ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
[ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}
libCopy() {
for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
libDir=`dirname $lib`
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
done
}
while true; do
read -p "Enter a command: " cmd
if [ "$cmd" == 'quit' ] ;then
echo "quit"
exit 0
fi
clearCmd $cmd
[ $? -eq 5 ] && continue
cmdCopy $cmdPath
libCopy $cmdPath
done
5.grub用設定ファイルの提供
上記のカーネルファイルとinitrdファイルを移植したら、カーネルのバージョンとinitrdのバージョンに応じてgrub.conf設定ファイルを記述します:
[root@nmshuishui grub]# vim grub.conf
default=0
timeout=5
title nmshuishui soft-Linux
root (hd0,0)
kernel /vmlinuz-soft ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
initrd /initramfs-soft.img
~
quiet はサイレントインストールで、インストールに関する多くの情報を表示しなくなります。後で、selinux をオフにする必要があり、init は /bin/bash を使用して、 init プログラムを探すのをやめるようにカーネルに伝える必要があります。このステップを指定しないと、ブートプロセス中にカーネルパニックが報告され、システムがすべてで init プロセスがないと思い込んでパニックになります。
6、起動テスト
7、特別な注意事項
この実験をvmvare上で行う場合、新しい仮想マシンに新しいディスクを作成する際に「仮想ディスクを単一ファイルとして保存する」を選択しないと、カーネルパニックも発生します。
ネットワーク機能を実装するモジュールのロード
1、ホストコンピュータのネットワークカードのモジュール情報を表示します。
[root@nmshuishui net]# lsmod | grep e1000
e1000 170646 0
[root@nmshuishui net]#
[root@nmshuishui net]# modinfo e1000
filename: /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
version: 7.3.21-k8-NAPI
license: GPL
description: Intel(R) PRO/1000 Network Driver
author: Intel Corporation, <Linux.nics@intel.com>
srcversion: 1D4F1E82BB99EA36D320B1B
alias: pci:v00008086d00002E6Esv*sd*bc*sc*i*
alias: pci:v00008086d000010B5sv*sd*bc*sc*i*
alias: pci:v00008086d00001099sv*sd*bc*sc*i*
alias: pci:v00008086d0000108Asv*sd*bc*sc*i*
alias: pci:v00008086d0000107Csv*sd*bc*sc*i*
ここで、NICモジュールのパスを見つけることができます、ライブラリファイルの下の/dev/sdbにコピーします:
[root@nmshuishui net]# mkdir -pv /mnt/sysroot/lib64/modules
mkdir: created directory `/mnt/sysroot/lib64/modules'
[root@nmshuishui net]# cp /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib64/modules/e1000.ko
3. initプログラム
さて、モジュールが上にコピーされますが、使用することはできませんし、今もプロセスのニーズを満たしていないので、最小のinitプログラムであっても、このinitをしたい場合は、2つのオプション、***、ポートホストシステムがありますが、フォーマットは、より複雑になります。は通常sbinディレクトリにあるので、/dev/sdb2パーティションにinitスクリプトを記述します。
[root@nmshuishui ~]# cd /mnt/sysroot/sbin/
[root@nmshuishui sbin]# vim init
#!/bin/bash
#print Welcome info
echo -e "Welcome to \033[34m nmshuishui soft-Linux\033[0m"
#mount wei wenjian system when the system is running.
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
#mount ethernet driver autl when the system is start.
insmod /lib64/modules/e1000.ko
[ $? -eq 0 ] && echo -e "Load e1000 module succeeded [\033[32m0K\033[0m]"
ifconfig lo .1/8
ifconfig eth0 1.235/16
#mount the /dev/sda2 to make it can be write and read.
mount -n -o remount,rw /dev/sda2 /
#run /bin/bash
/bin/bash
initスクリプトを書いたら、実行できるように実行権限を与える必要があります。このスクリプトはmountコマンドとinsmodコマンドも使うので、これらのコマンドを前のスクリプトに移植する必要があります。私は今、システムブートを実行するためにこのinitスクリプトを使用したいので、***また、/mnt/boot/grub/grub.conf init = /bin/bashにinit = /sbin/initにする必要があり、もはや/bin/bashを置き換えるようにする必要はありません。
4、Linuxの小規模システムのネットワーク機能の実装
上記の手順が完了したら、小さな、プライベートシステムを体験する別のホストに/dev/sdbをフックすることができます。





