自制一个小型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.178linux.com/64359

(0)
刘 祥宇刘 祥宇
上一篇 2016-12-21
下一篇 2016-12-21

相关推荐

  • 没有自动ip解决办法

    用虚拟机下载好centos6.9后,本来想查看ip地址,结果发现没有自动获取ip地址,在网上找了很多方法都不行,问题如下: 用命令ifconfig查看ip地址,发现没有,如下 查看eth0如下 解决办法如下: 1、关闭NetworkManager服务 2、关闭NetworkManager开机启动 3、添加 /etc/sysconfig/network-scr…

    2017-07-16
  • 管理systemd

    管理systemd init(系统的第一个进程): CentOS 5: SysV initCentOS 6: UpstartCentOS 7: Systemd Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程 Systemd新特性: 系统引导时实现服务并行启动 按需启动守护进程 系统状态快照 自动化的…

    Linux干货 2016-09-22
  • vim编辑器基本应用

    vi:Visual  Tnterface文本编辑器 vim:vi Improved vi的加强版 文本编辑种类:   行编辑器:sed   全屏编辑器:nano,vi,vim 其他编辑器::   gedit:一个简单的图形编辑器   gvim:一个vim编辑器的图形版本 vim使用格式 +# :打开文件后,直…

    Linux干货 2016-08-11
  • Linux文件类型及颜色标识整理

    Linux系统上的文件类型 -:f; 常规文件 , d:directory, 目录文件; b;block device,块设备文件,支持以'block'为单位进行随机访问; c:character device,字符设备文件,支持以'character'为单位进行线性访问;    &nbs…

    Linux干货 2016-10-16
  • 第七周小练习

    1.创建一个10G分区,并格式为ext4文件系统 (1)要求其block大小为2048,预留空间百分比为2,卷标为MYDATA,默认挂载属性包含acl (2)挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳 fdisk /dev/sdb n p 1 +10G w mke2fs -t&nbs…

    Linux干货 2017-01-05
  • 基于Cobbler实现多版本系统批量部署

    前言 运维自动化在生产环境中占据着举足轻重的地位,尤其是面对几百台,几千台甚至几万台的服务器时,仅仅是安装操作系统,如果不通过自动化来完成,根本是不可想象的。记得前面我们探究了基于PXE实现系统全自动安装,但PXE同时只能提供单一操作系统的批量部署,面对生产环境中不同服务器的需求,该如何实现批量部署多版本的操作系统呢?Cobbler便可以的满足这一实际需求,…

    Linux干货 2015-07-09