blog

プライベートなカスタマイズ:自分だけの小さなLinuxシステムを構築する

この記事では、NICドライバをロードし、ネットワーク機能のためにIPアドレスを設定できるように、既存のLinuxシステムを調整することによって、あなた自身の小さなLinuxシステムを構築することに焦点...

Jul 9, 2014 · 12 min. read
シェア

序文

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]# 
2.bashコマンドとそのライブラリをルートファイルシステムに移植します。
[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]# 
2、ネットワークカードの詳細を表示
[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をフックすることができます。

Read next

DevOpsを解明する:DevOpsを導入する5つの方法

CAに代わって、市場調査会社のVanson Bourneが世界中の1,300人の上級IT意思決定者を対象に調査を実施し、DevOpsの見方と活用方法を明らかにしました。日本では、回答者の99%がすでにDevOpsを利用しているか、利用する予定があると回答しました。

Jul 8, 2014 · 3 min read