Linux系統啓動流程(4)製做自定義linux之一

Linux系統啓動流程(4)製做自定義linux之一linux

平時使用的服務器類型的linux系統通常都會裝載各類軟件與服務,而在某些狀況下,並不能一直直接使用公司管理的系統,一是可能會出現故障,二是在處理一些小問題下可能無需如此龐大的linux。因而根據前幾篇所講的linux中的Centos6版本的系統啓動流程,能夠對其仿製一個微型的linux系統,裏面只添加如下須要的工具便可。shell

 

以CentOS6爲模板爲例:bash

一、準備環境:VM的操做服務器

這裏以VM虛擬機模擬,全部直接對安裝了CentOS的虛擬機添加一個新硬盤網絡

須要添加一塊新磁盤ide

 wKioL1ffg3rCFQkOAABRPbcxSdM026.png

注:要製做的虛擬硬盤文件路徑要注意,這裏新硬盤文件名爲 lab2_1.vmdk工具

 

二、檢查硬盤測試

若是是在開機狀態,添加的新硬盤,可使用命令從新掃描ui

[root@mzf ~]# echo "- - -" >> /sys/class/scsi_host/host2/scan


#掃描完成後,使用lsblk命令查看是否有新硬盤spa

[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文件系統。

 

 

三、具體制做步驟:

一、掛載文件系統

#對剛纔建立的分區(/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)

 

二、拷貝當前系統下的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

 

三、使用grub-install命令安裝grub

[root@mzf ~]# grub-install --root-directory=/mnt /dev/sdb

注意:由於當前boot爲獨立分區,那麼其父級目錄爲/mnt

 

四、在生成的/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的文件已經配齊,下面就開始/目錄的操做了

 

五、在/mnt/sysroot掛載點下建立/目錄結構

[root@mzf sysroot]# ls
bin  boot  etc  home  lib  lib64  lost+found  media  mnt  proc  root  sbin  sys  tmp  usr  var

 

六、/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

 

七、拷貝一些必要的命令文件

注:固然每一個命令都有氣對應依賴的庫文件,全部要將其對應庫文件一塊兒拷貝,能夠編寫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 ]; then
    echo "copy $1 $2 $3"; 
  elif [ $# -eq 2 ]; then
    if [ $2 == "not" ]; then
      echo "$1 not is command!";
    elif [ $2 == "shell" ]; then
      echo "$1 is shell builtin!";
    fi
  else
    echo "input $1 is null!";
  fi
}
 
messbox() {
  case $1 in
  cy)  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;
     fi
     local cmdPath=`which ${cmdName} | grep -v '^alias' | grep -o '[^[:space:]]\+'`;
     cmdcp ${cmdPath};
     for i in `ldd ${cmdPath} | grep -o '/.*lib\(64\)\{0,1\}[^[:space:]]\+\>'`; do
          libcp ${i}; 
     done
     cmdName=`inprint`
  done
}
main;


 

 

八、執行此文件,拷貝須要的/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.

注意:這裏只須要拷貝須要的命令便可

 

九、使用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

 

十、這裏重啓機器便可,可是bash命令內部不能提供一些自定義的界面

十一、所以添加網絡服務

(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

 

 

十二、系統啓動時提供歡迎界面,以及網卡設備服務

#手動編寫/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給其添加執行權限

 

1三、修改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

 

 

1四、掛起當前虛擬機,而後新建一個虛擬機,選擇使用此磁盤

wKioL1ffhF_A7HidAABFBzSBvt8926.png 

注意:必定是一個沒有任何硬盤的空虛擬機,否則會有問題,選擇使用已有的硬盤,其路徑必定要選擇對,否則本身都暈了。

 

1五、啓動新建的虛擬機查看其效果

wKioL1ffhGfjOeP5AABCtJbEFng185.png

相關文章
相關標籤/搜索