自制一個小型Linux(附帶網絡功能)

  我們這次講述一下Linux啟動的啟動流程以及制作一個附帶網絡功能的mini linux

一、敘述

  在制作一個小型的Linux之前,首先你得明白Linux系統的啟動過程,我們用一張圖來進行說明 

wKiom1cY9_ihUml-AAIdfYZBqdU149.png

二、為什么要制作這么一個小型的系統?

  答案很簡單,就是為了更好的了解Linux,當然這個沒有必要了解的太深,或許你看到這個并不影響你使用并且操作一個Linux,這個也是一個興趣。
  我們的操作系統的組成無非就是以硬件作為支撐,然后由內核來調度從而對應用程序實現系統調用,但是這個系統調用接口畢竟還是很難銜接的,也沒有其它的功能,就有了公用庫,程序所需要的功能都可以由他來實現,不過直接在系統調用接口上寫一個程序也是可以的,說到內核,那我們就要說一內核都有什么功能,內核的功能分別是:內存管理、進程管理、網絡協議管理、驅動程序、安全管理、文件系統等。

三、怎么制作

  我們是用CentOS 6為基礎來制作一個Linux,我們首先在虛擬機上添加一塊虛擬磁盤,添加完成其實就完成了一半,我們在系統的/mnt目錄上建立兩個目錄,一個是boot,另一個是;sysroot

[root@CentOS6 ~]# mkdir /mnt/{boot,sysroot}

1、制作步驟

  由于磁盤是新添加的,我們使用fdisk分為兩個分區,分別掛載到剛才/mnt/boot和/mnt/sysroot中。

[root@CentOS6 ~]# fdisk /dev/sdb

  使用fdisk建立磁盤分區完成之后,我們把磁盤進行格式化為ext4的分區,掛載到boot和sysroot目錄中。

# mkfs.ext4 /dev/sdb1 # mkfs.ext4 /dev/sdb2 # mount /dev/sdb1 /mnt/boot # mount /dev/sdb2 /mnt/sysroot

  之后我們在新磁盤上安裝grub

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

  從/boot分區中復制 vmlinuz-VERSIONinitramfs-VERSION兩個文件,一個是內核文件,另一個是內核所加載的驅動程序(里面含有模擬的根),復制完成后重新命令為vmlinuz和initramfs.img

[root@CentOS6 ~]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz [root@CentOS6 ~]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img

  之后我們在/mnt/boot/grub的目錄中新建一個文件叫grub.conf,內容格式如下:

[root@CentOS6 ~]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS 6.4     root (hd0,0)     kernel /vmlinuz ro requiet root=/dev/sda2 selinux=0 init=/bin/bash    initrd /initramfs.img     chroot /mnt/sysroot

  之后創建目錄在/mnt/sysroot上(必須有,不然啟動不了)

[root@CentOS6 ~]# mkdir -pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

  用腳本復制相關的命令和庫文件,復制完成之后啟動看看,如果出錯,請更改,以上的步驟如果你成功,可以添加網絡功能了。復制命令腳本如下:

#!/bin/bash 
# Author:liu 
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 "Please input command: " cmd
    [[ "$cmd" == "quit" ]] && echo "quit" && exit 0
    clearCmd $cmd [ $? -eq 5 ] && continue  
    cmdCopy $cmdPath  
    libCopy $cmdPath
done

  將宿主機暫停,然后創建新的虛擬機將虛擬磁盤添加進新的虛擬機中。

%L)LL3I}JPH6I2ZIDV$RNQL.png 

  以上步驟成功,開始添加我們的網絡功能吧!

2、將虛擬機添加網絡功能

  首先我們先更改一下grub.conf(注意:是在/mnt/boot目錄下),將原來的init=/bin/bash更改為init=/sbin/init

default=0 
timeout=5
    title CentOS 6.4    
    root (hd0,0)     
    kernel /vmlinuz ro requiet root=/dev/sda2 selinux=0 init=/sbin/init    
    initrd /initramfs.img   
    chroot /mnt/sysroot

  然后我們在/mnt/sysroot/sbin目錄寫一個腳本,名字叫做init,寫作格式如下:

[root@CentOS6 ~]# vim /mnt/sysroot/sbin/init 
#!/bin/bash 
# 
mount -n -t proc proc /proc 
mount -n -t sysfs sysfs /sys mount -n -o remount,rw /dev/sda2 
[[ $? -eq 0 ]] && echo "The / is success" 
insmod /lib64/e1000.ko ifconfig eth0 172.16.42.29/16 
ifconfig lo 127.0.0.1/8 /bin/bash

  找到宿主機網絡模塊e1000.ko所在的位置并拷貝到/mnt/sysroot/lib64目錄下(注意:在虛擬機中網卡的模塊叫做e1000可以用dmsg命令查看你的網卡的模塊名稱是什么)。

[root@CentOS6 ~]# dmesg | grep -i eth0 
[root@CentOS6 ~]# modinfo -n e1000 
/lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
[root@CentOS6 ~]# cp /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib64/

  保存并退出之后我們繼續利用復制命令腳本把相關命令復制進去(例如:ifconfig,nsmod,rmmod,reboot,ping等) 之后我們再一次啟動。 

7KM)9@N~ZL]25UT1MLR7~B0.png

 
  如果成功了,那我恭喜你。

原創文章,作者:劉 祥宇,如若轉載,請注明出處:http://www.www58058.com/64359

(0)
劉 祥宇劉 祥宇
上一篇 2016-12-21 09:52
下一篇 2016-12-21 11:27

相關推薦

  • lvm邏輯卷管理

    lvm邏輯卷管理: 允許對卷進行方便操作的抽象層,包括重新設定文件系統的大小 允許在多個物理設備間重新組織文件系統,將設備指定為物理卷 用一個或者多個物理卷來創建一個卷組 物理卷是用固定大小的物理區域(Physical Extent,PE)來定義的 在物理卷上創建的邏輯卷是由物理區域(PE)組成 可以在邏輯卷上創建文件系統 創建: 創建物理卷: pvcrea…

    Linux干貨 2016-09-01
  • systemd和systemctl

    systemd和systemctl(centos7)     Systemd是一種新的linux系統服務管理器。它替換了init系統,能夠管理系統啟動過程和一些系統服務,一旦啟動起來,就將監管整個系統。在centos7系統中,PID 1被systemd所使用了:如下,在centos6中: init─┬─NetworkManager &nb…

    Linux干貨 2016-10-09
  • N25第一周學習總結

    第一周學習總結 按照課程要求,本周完成2天的課時,總計8課時。 因為是剛開課,馬哥為我們介紹了上課環境,課程體系,還有一些計算機基礎理論。內容主要是:          計算機的工作機制        &nbs…

    Linux干貨 2016-12-04
  • linux網絡管理 一

    什么是網絡?         是指將具有獨立功能的計算機和周邊設備,通過通信線路連接起來,在網絡軟件的支持下,實現資源的共享和數據的整個系統。 網絡的特征:         速度      …

    2017-03-16
  • 網絡管理命令

    linux網絡屬性     ifconfig命令家族:ifconfig,route,netstat ifconfig命令:接口及地址查看和管理     ifconfig [interface]:     ifconfig -a:顯示所有接口…

    Linux干貨 2016-09-13
  • 馬哥教育21期網絡班—第8周課程+練習—-成長進行時–不退步

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 網橋:一種網路裝置,負責網路橋接,將網絡的多個網段在數據鏈路層連接起來。 集線器:將多條以太網線或光纖集合連接在同一段物理介質下的裝置。工作在物理層。 二層交換機:工作在數據鏈路層,交換機內部的CPU會在每個端口成功連接時,通過將MAC地址和端口對應,形成一張MAC表。在今后的通…

    Linux干貨 2016-08-24
欧美性久久久久