Linux系统启动流程(4)制作自定义linux之一
Linux系統啟動流程(4)制作自定義linux之一
平時使用的服務器類型的linux系統一般都會裝載各種軟件與服務,而在某些情況下,并不能一直直接使用公司管理的系統,一是可能會出現故障,二是在處理一些小問題下可能無需如此龐大的linux。于是根據前幾篇所講的linux中的Centos6版本的系統啟動流程,可以對其仿制一個微型的linux系統,里面只添加以下需要的工具即可。
?
以CentOS6為模板為例:
1、準備環境:VM的操作
這里以VM虛擬機模擬,所有直接對安裝了CentOS的虛擬機添加一個新硬盤
需要添加一塊新磁盤
?
注:要制作的虛擬硬盤文件路徑要注意,這里新硬盤文件名為 lab2_1.vmdk
?
2、檢查硬盤
如果是在開機狀態,添加的新硬盤,可以使用命令重新掃描
[root@mzf?~]#?echo?"-?-?-"?>>?/sys/class/scsi_host/host2/scan
#掃描完成后,使用lsblk命令查看是否有新硬盤
[root@mzf?~]#?lsblk NAME???MAJ:MIN?RM???SIZE?RO?TYPE?MOUNTPOINT sr0?????11:0????1???3.7G??0?rom?? sda??????8:0????0????20G??0?disk? ├─sda1???8:1????0???200M??0?part?/boot ├─sda2???8:2????0????10G??0?part?/ ├─sda3???8:3????0?????2G??0?part? ├─sda4???8:4????0?????1K??0?part? └─sda5???8:5????0???7.8G??0?part?/testdir sdb??????8:16???0????20G??0?disk
說明:這里顯示了sdb,為剛剛添加的第二塊硬盤,下面需要對此進行新建分區。
#可以使用fdisk命令來創建兩個分區(boot分區、根分區)
[root@mzf?~]#?fdisk??-l?/dev/sdb??|??grep?'^/dev/sdb[0-9]' /dev/sdb1???????????????1??????????17??????136521???83??Linux /dev/sdb2??????????????18??????????83??????530145???83??Linux注意:兩個分區的大小分別為/dev/sdb1:128M,/dev/sdb2:512M即可。
#查看剛才創建的分區大小,使用lsblk命令
[root@mzf?~]#?lsblk?/dev/sdb NAME???MAJ:MIN?RM???SIZE?RO?TYPE?MOUNTPOINT sdb??????8:16???0????20G??0?disk? ├─sdb1???8:17???0?133.3M??0?part? └─sdb2???8:18???0?517.7M??0?part
解析:這里的大小顯示誤差不會印象,下面為此創建文件系統。
#使用mke2fs命令來創建ext4文件系統
for?dev?in?`fdisk?-l?/dev/sdb?|?grep?-o?'^/dev/sdb[0-9]\>'`;?do?mke2fs?-t?ext4?${dev}?&>?/dev/null;??done
#創建完成后可以通過blkid來查看當前塊設備及類型
[root@mzf?~]#?blkid?/dev/sdb[0-9] /dev/sdb1:?UUID="ba63b06d-ebc4-434f-9651-a357b274f30b"?TYPE="ext4"? /dev/sdb2:?UUID="f5f15759-e8de-4e4b-bde8-3910d3e91228"?TYPE="ext4"
解析:此時兩個分區以及建立了ext4文件系統。
?
?
3、具體制作步驟:
1、掛載文件系統
#對剛才創建的分區(/dev/sdb{1,2})進行掛載 [root@mzf?~]#?mkdir?/mnt/boot?&&?mount?/dev/sdb1?/mnt/boot [root@mzf?~]#?mkdir?/mnt/sysroot?&&?mount?/dev/sdb2?/mnt/sysroot#查看其是否已經掛載
[root@mzf?~]#?mount?|?grep?'^/dev/sdb[0-9]' /dev/sdb1?on?/mnt/boot?type?ext4?(rw) /dev/sdb2?on?/mnt/sysroot?type?ext4?(rw)?
2、拷貝當前系統下的vmlinuz和initramfs.img文件
[root@mzf?~]#?cp?/boot/vmlinuz-2.6.32-642.el6.x86_64?/mnt/boot/vmlinuz [root@mzf?~]#?cp?/boot/initramfs-2.6.32-642.el6.x86_64.img?/mnt/boot/initramfs.img?
3、使用grub-install命令安裝grub
[root@mzf?~]#?grub-install?--root-directory=/mnt?/dev/sdb注意:因為當前boot為獨立分區,那么其父級目錄為/mnt
?
4、在生成的/mnt/boot/grub目錄下添加grub.conf文件
[root@mzf?~]#?cat?/mnt/boot/grub/grub.conf? default=0 timeout=3 title?Mini?Linux root?(hd0,0) kernel?/vmlinuz?or?root=/dev/sda2?selinux=0?init=/bin/bash initrd?/initramfs.img解析:這里需要設置內核參數selinux=0,然后將對應的kernel和initrd執行剛才拷貝的新問問文件路徑及文件名。
#再次確定/mnt/boot下的文件
[root@mzf?~]#?ls?-R?/mnt/boot/ /mnt/boot/: grub??initramfs.img??lost+found??vmlinuz/mnt/boot/grub: device.map?????fat_stage1_5??grub.conf?????jfs_stage1_5????reiserfs_stage1_5??stage2?????????vstafs_stage1_5 e2fs_stage1_5??ffs_stage1_5??iso9660_stage1_5??minix_stage1_5??stage1???????????ufs2_stage1_5??xfs_stage1_5/mnt/boot/lost+found:說明:這里boot下和boot/grub的文件已經配齊,下面就開始/目錄的操作了
?
5、在/mnt/sysroot掛載點下創建/目錄結構
[root@mzf?sysroot]#?ls bin??boot??etc??home??lib??lib64??lost+found??media??mnt??proc??root??sbin??sys??tmp??usr??var?
6、在/mnt/sysroot/etc目錄下提供fstab文件系統掛載配置
[root@mzf?sysroot]#?cat?/mnt/sysroot/etc/fstab? /dev/sda1???/boot????ext4??defaults??1?1 /dev/sda2???/????????ext4??defaults??1?2?
7、拷貝一些必要的命令文件
注:當然每個命令都有氣對應依賴的庫文件,所有要將其對應庫文件一起拷貝,可以編寫bash腳步來實現:下面為編寫的腳本:
[root@mzf?sysroot]#?cat?/testdir/copycmd.sh? #!/bin/bash # readonly?destPath="/mnt/sysroot";libcp()?{libDir=`echo?$1?|?grep?-o?'^.*/\<'`[?!?-d?${destPath}${libDir}?]?&&?mkdir?-p?${destPath}${libDir};cp?$1?${destPath}${libDir}?&>?/dev/null;[?$??-eq?0?]?&&?echo?"copy?lib?$1?finished."?||?echo?"copy?lib?$1?error."; }??cmdcp()?{cmdDir=`echo?$1?|?grep?-o?'^.*/\<'`[?!?-d?${destPath}${cmdDir}?]?&&?mkdir?-p?${destPath}${cmdDir};cp?$1?${destPath}${cmdDir}?&>?/dev/null;[?$??-eq?0?]?&&?echo?"copy?cmd?$1?finished."?||?echo?"copy?cmd?$1?error."; }outprint()?{if?[?$#?-eq?3?];?thenecho?"copy?$1?$2?$3";?elif?[?$#?-eq?2?];?thenif?[?$2?==?"not"?];?thenecho?"$1?not?is?command!";elif?[?$2?==?"shell"?];?thenecho?"$1?is?shell?builtin!";fielseecho?"input?$1?is?null!";fi }messbox()?{case?$1?incy)??outprint?"cmd"?"$2"?"ok";?;;cn)??outprint?"cmd"?"$2"?"error"?;;e)???outprint?"cmd"?"$2"?"exits";?;;n)???outprint??"$2"?"not";?;;s)???outprint??"$2"??"shell";?;;ly)??outprint?"lib"?"$2"?"ok";?;;ln)??outprint?"lib"?"$2"?"error";?;;null)??outprint?"cmd";?;;*)??echo?"wei?zhi?error.";?;;esac }copyFile()?{pathDir=${1%/*};fileName=${1##*/};[?!?-d?${destPath}${parentDir}?]?&&?mkdir?-p?${destPath}${parentDir};cp?$1?${destPath}${parentDir}?&>?/dev/null;[?$??-eq?0?]?&&?messbox?"cy"?"${fileName}"?||?messbox?"cn"?"${fileName}"; }inprint()?{read?-p?"please?input?add?cmd:"?cmdName;echo?"${cmdName}"; }main()?{cmdName=`inprint`;while?[[?-z?${cmdName}?]]?||?[?${cmdName}?!=?'quit'?];?do[[?-z?${cmdName}?]]?&&?messbox?"null"?&&?cmdName=`inprint`??&&??continue;if?!?`which?${cmdName}?&>?/dev/null`;?then!?`type?${cmdName}?&>?/dev/null`?&&?messbox??"n"?"${cmdName}"?||?messbox?"s"?"${cmdName}";cmdName=`inprint`;continue;filocal?cmdPath=`which?${cmdName}?|?grep?-v?'^alias'?|?grep?-o?'[^[:space:]]\+'`;cmdcp?${cmdPath};for?i?in?`ldd?${cmdPath}?|?grep?-o?'/.*lib\(64\)\{0,1\}[^[:space:]]\+\>'`;?dolibcp?${i};?donecmdName=`inprint`done } main;?
?
8、執行此文件,拷貝需要的/bin/bash、/bin/mount等命令
[root@mzf?sysroot]#?/testdir/copycmd.sh? please?input?add?cmd:bash??? copy?cmd?/bin/bash?finished. copy?lib?/lib64/libtinfo.so.5?finished. copy?lib?/lib64/libdl.so.2?finished. copy?lib?/lib64/libc.so.6?finished. copy?lib?/lib64/ld-linux-x86-64.so.2?finished. please?input?add?cmd:ifconfig copy?cmd?/sbin/ifconfig?finished. copy?lib?/lib64/libselinux.so.1?finished. copy?lib?/lib64/libc.so.6?finished. copy?lib?/lib64/libdl.so.2?finished. copy?lib?/lib64/ld-linux-x86-64.so.2?finished. please?input?add?cmd:ip copy?cmd?/sbin/ip?finished. copy?lib?/lib64/libresolv.so.2?finished. copy?lib?/lib64/libdl.so.2?finished. copy?lib?/lib64/libc.so.6?finished. copy?lib?/lib64/ld-linux-x86-64.so.2?finished. please?input?add?cmd:insmod copy?cmd?/sbin/insmod?finished. copy?lib?/lib64/libc.so.6?finished. copy?lib?/lib64/ld-linux-x86-64.so.2?finished. please?input?add?cmd:echo copy?cmd?/bin/echo?finished. copy?lib?/lib64/libc.so.6?finished. copy?lib?/lib64/ld-linux-x86-64.so.2?finished.注意:這里只需要拷貝需要的命令即可
?
9、使用chroot切入/mnt/sysroot目錄,能進入說明bash命令生效
[root@mzf?sysroot]#?chroot?/mnt/sysroot/ bash-4.1#?ls bin??boot??etchome??lib??lib64??lost+found??media??mnt??procroot??sbin??sys??tmp??usr??var bash-4.1#?exit exit?
10、這里重啟機器即可,但是bash命令內部不能提供一些自定義的界面
11、因此添加網絡服務
(1)添加對應的網卡模塊驅動
#查看當前系統網卡使用的模塊驅動
[root@mzf?sysroot]#?dmesg?|?grep?eth0 e1000?0000:02:01.0:?eth0:?(PCI:66MHz:32-bit)?00:0c:29:a3:5d:d7 e1000?0000:02:01.0:?eth0:?Intel(R)?PRO/1000?Network?Connection udev:?renamed?network?interface?eth0?to?eth解析:從上面可以指定,eth0網卡使用的e1000網卡驅動。
#查看e1000網卡驅動文件的全路徑
[root@mzf?sysroot]#?modinfo?-n?e1000 /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko#使用depmod命令查看此e1000網卡模塊文件是否依賴其它驅動
[root@mzf?sysroot]#?depmod?`modinfo?-n?e1000`提示:沒有顯示任何信息,說明沒有對其它任何模塊有依賴,因此只需要拷貝此文件即可
#拷貝e1000.ko網卡模塊文件
[root@mzf?sysroot]#?cp?`modinfo?-n?e1000`?/mnt/sysroot/lib64/modules/(2)使用腳本拷貝insmod模塊加載命令
[root@mzf?sysroot]#?/testdir/copycmd.sh? please?input?add?cmd:insmod copy?cmd?/sbin/insmod?finished. copy?lib?/lib64/libc.so.6?finished. copy?lib?/lib64/ld-linux-x86-64.so.2?finished. please?input?add?cmd:quit?
?
12、系統啟動時提供歡迎界面,以及網卡設備服務
#手動編寫/mnt/sysroot/sbin/init腳步文件
[root@mzf?~]#?cat?/mnt/sysroot/sbin/init? #!/bin/bash # echo??-e?"\t?Welcome?to?\e[31m?Meng?Linux?\e[0m" /sbin/insmod??/lib64/modules/e1000.ko? [?$??-eq?0?]?&&??echo??-e?"inet?e1000?load??\e[32m?[?ok?]\e[0m"??||??echo??-e?"inet?e1000?load??\e[32m?[?faileur?]\e[0m"?? /sbin/ifconfig?lo?127.0.0.1/8 [?$??-eq?0?]?&&?echo?"lo?ip?set?ok"?||??echo?"lo?ip?set?eroor" /sbin/ifconfig??eth0??10.1.250.250/16 [?$??-eq?0?]?&&?echo?"eth0?ip?set?ok"?||?echo?"eth0?ip?set?erro" mount?-n?-o?remount,rw??/dev/sda2 /bin/bash注意:編寫完成后一定要使用chmod ?+x ?/mnt/sysroot/sbin/init給其添加執行權限
?
13、修改grub.conf文件下的init啟動腳本路徑將init=/bin/bash改為init=/sbin/init,內容如下:
[root@mzf?sysroot]#?cat?/mnt/boot/grub/grub.conf? default=0 timeout=3 title?Mini?Linux root?(hd0,0) kernel?/vmlinuz?ro?root=/dev/sda2?selinux=0?init=/sbin/init initrd?/initramfs.img?
?
14、掛起當前虛擬機,然后新建一個虛擬機,選擇使用此磁盤
?
注意:一定是一個沒有任何硬盤的空虛擬機,不然會有問題,選擇使用已有的硬盤,其路徑一定要選擇對,不然自己都暈了。
?
15、啟動新建的虛擬機查看其效果
?
?
?
?
轉載于:https://blog.51cto.com/mengzhaofu/1854043
總結
以上是生活随笔為你收集整理的Linux系统启动流程(4)制作自定义linux之一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++语言里的near和far是什么
- 下一篇: linux自学_shell脚本for详解