制作简单的小Linux系统

来源:互联网 发布:全国地区数据库 sql 编辑:程序博客网 时间:2024/04/29 07:17

制作简单的小Linux系统

    • 制作简单的小Linux系统
      • 前言
      • 制作前的准备
        • 物理设备
        • 制作思路
      • 创建分区和文件系统
      • 挂载boot分区
      • 安装grub
      • 复制内核和initramfs文件
      • 建立grubconf配置文件
      • 挂载根分区
      • 复制bash和相关命令及相关库文件
      • 装载网络模块用于实现网络功能
      • 创建根分区下的一级目录
      • 测试定制的小Linux是否制作成功
      • 挂载新机器并启用网络功能


前言

本篇博文主要通过裁剪现有Linux系统,打造出一个属于你自己的小Linux系统,并让其能够装载网卡驱动,配置IP地址后可以实现网络功能。但在开始制作之前需要先向你说明本次制作前的一些准备工作,以及制作的思路。


制作前的准备

凡事预则立,不预则废,无论工作学习皆是如此。所以在开启本次自制小Linux的实验之前,你需要先做好两大项准备,分别是看的见的物理设备和看不见的制作思路。

物理设备

首先,你要准备一台linux主机和一块磁盘,这块磁盘用于安装和启动我们自制的小Linux,可以是块硬盘,也可以是U盘。对于磁盘空间没过多要求,大于2G就可以。
将准备好的磁盘连接到Linux主机,使用lsblk命令查看连接到主机的设备,确定你的磁盘被加载到了系统中。

root&Centos6: ~#lsblkNAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTsr0     11:0    1  3.7G  0 rom  /media/CentOS_6.9_Finalsdb      8:16   0   16G  0 disk#这块sdb磁盘就是我为本次实验准备的磁盘。sda      8:0    0  200G  0 disk├─sda1   8:1    0 1000M  0 part /boot├─sda2   8:2    0 48.8G  0 part /├─sda3   8:3    0 47.9G  0 part /app├─sda4   8:4    0    1K  0 part└─sda5   8:5    0    2G  0 part [SWAP]

制作思路

有一个清晰且准确的实验流程思路,对于成功完成实验至关重要。下面是我以清单的方式向你说明的大致制作流程,请在实验过程中务必按照此流程操作,以确保实验成功。

  1. 创建分区和文件系统
  2. 挂载boot分区
  3. 安装grub
  4. 复制内核和initramfs文件
  5. 建立grub.conf配置文件
  6. 挂载根分区
  7. 复制bash和相关命令及相关库文件
  8. 创建根分区下的一级目录
  9. 测试定制的小Linux是否制作成功

创建分区和文件系统

使用fdisk命令创建分区,需要至少划分两个分区,用于后面boot和根的挂载。

root&Centos6: ~#fdisk /dev/sdb        ……此处省略部分显示内容Command (m for help): n     #n:新建分区Command action   e   extended   p   primary partition (1-4)p   #p:创建主分区Partition number (1-4): 1  #1:创建第一个主分区First cylinder (1-2088, default 1): #此处回车默认就可Using default value 1Last cylinder, +cylinders or +size{K,M,G} (1-2088, default 2088): +100M#此处输入+100M,代表第一分区的大小是100M,此分区之后会后用来挂载/boot分区。Command (m for help): nCommand action   e   extended   p   primary partition (1-4)pPartition number (1-4): 2First cylinder (15-2088, default 15): #此处回车键Using default value 15Last cylinder, +cylinders or +size{K,M,G} (15-2088, default 2088):#此处回车键Using default value 2088#这是创建的第二个分区,这里没有指定大小,而是直接回车使用默认值,将所有剩余空间全部分给第二分区,之后会用来挂载根分区。Command (m for help): w  #w:保存退出The partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.

使用lsblk命令查看创建好的分区,我们可以看到分区sdb1和sdb2,以及这两个分区的大小。

root&Centos6: ~#lsblkNAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTsr0     11:0    1   3.7G  0 rom  /media/CentOS_6.9_Finalsdb      8:16   0    16G  0 disk├─sdb1   8:17   0 109.8M  0 part└─sdb2   8:18   0  15.9G  0 partsda      8:0    0   200G  0 disk├─sda1   8:1    0  1000M  0 part /boot├─sda2   8:2    0  48.8G  0 part /├─sda3   8:3    0  47.9G  0 part /app├─sda4   8:4    0     1K  0 part└─sda5   8:5    0     2G  0 part [SWAP]

使用mkfs.ext4命令为/dev/sdb1和/dev/sdb2分区创建文件系统

root&Centos6: ~#mkfs.ext4 /dev/sdb1root&Centos6: ~#mkfs.ext4 /dev/sdb2

使用blkid命令检查文件系统是否成功创建。

root&Centos6: ~#blkid*/dev/sdb1: UUID="daf86143-9f02-479b-8023-e83491b075c8" TYPE="ext4"*/dev/sdb2: UUID="ac76751f-4796-4a70-9bfa-7a1d7eaf6b78" TYPE="ext4"#可以查到/dev/sdb2和/dev/sdb1,并且有TYPE="ext4"字样,说明分区创建成功。/dev/sda1: UUID="fe3eec64-c3e4-49e8-ad00-5932afbfbc4e" TYPE="ext4"/dev/sda2: UUID="8c0a2fd8-99c2-4ee1-b7c9-05f51fcf4f7a" TYPE="ext4"/dev/sda3: UUID="99735fe4-96f0-4c2b-8ca8-7235d3857359" TYPE="ext4"/dev/sda5: UUID="a70aa239-9377-4aeb-9d3c-1aa73216d60e" TYPE="swap"

挂载boot分区

注意:挂载点的子目录必须为boot

root&Centos6: ~#mkdir /mnt/boot#创建挂载点root&Centos6: ~#mount /dev/sdb1 /mnt/boot/#将/dev/sdb1挂载到/mnt/boot/目录下root&Centos6: ~#ls /mnt/boot/lost+found

安装grub

安装grub是关乎启动的重要一步,利用grub-install命令可以生成引导启动流程的第1-2阶段。grub安装的时候会默认以boot为根,会自动安装到boot目录下。但当前系统有两个boot目录,/boot和/mnt/boot。所以需要以- -root-directory=/mnt/选项来指定要以/mnt/目录为根安装grub,这样在grub-install命令安装grub时,会自动找到/mnt/下的boot目录进行安装。这也是为什么上一步挂载boot目录时,必须挂载点的子目录为boot的原因。

root&Centos6: ~#grub-install --root-directory=/mnt/ /dev/sdb#将grub安装到/dev/sdb设备上,以/mnt/为根目录。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

确定grub安装成功

root&Centos6: ~#ls /mnt/boot/#查看生成的grub目录grub  lost+foundroot&Centos6: ~#ls /mnt/boot/grub/#查看安装完grub后在grub目录下生成的文件device.map     fat_stage1_5  iso9660_stage1_5  minix_stage1_5     stage1  ufs2_stage1_5    xfs_stage1_5e2fs_stage1_5  ffs_stage1_5  jfs_stage1_5      reiserfs_stage1_5  stage2  vstafs_stage1_5root&Centos6: ~#hexdump -C -n 512 /dev/sdb#确定grub的第一阶段写入到了磁盘的前446字节。如果没有成功安装第一阶段,你看到前446字节都会是0,并且没有GRUB字样。    ……此处省略部分显示内容00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|  00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|000001b0  00 00 00 00 00 00 00 00  9a 38 28 d2 00 00 00 01  |.........8(.....|000001c0  01 00 83 fe 3f 0d 3f 00  00 00 4f 6e 03 00 00 00  |....?.?...On....|000001d0  01 0e 83 fe ff ff 8e 6e  03 00 9a 67 fc 01 00 00  |.......n...g....|000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|00000200

复制内核和initramfs文件

在系统的/boot目录下有关乎启动的三大文件,系统若想启动,这三个文件缺一不可。这三个文件分别是我们这一步要复制到/mnt/boot目录下的vmlinuz-2.6.32-696.el6.x86_64 和 initramfs-2.6.32-696.el6.x86_64.img文件。以及下一步要创建的grub.conf文件。

root&Centos6: ~#cp /boot/vmlinuz-2.6.32-696.el6.x86_64   /mnt/boot/#这个文件就是大名鼎鼎的Linux内核文件,要将它复制到/mnt/boot/下。root&Centos6: ~#cp /boot/initramfs-2.6.32-696.el6.x86_64.img /mnt/boot/#此文件是在系统启动后用于挂载根的,也很重要,要将它复制到/mnt/boot/下。root&Centos6: ~#ls /mnt/boot/grub  initramfs-2.6.32-696.el6.x86_64.img  lost+found  vmlinuz-2.6.32-696.el6.x86_64

建立grub.conf配置文件

grub.conf配置文件要创建在/mnt/boot/grub/目录下,并要在文件里写入基本的启动配置,以确保系统可以有序启动。

root&Centos6: ~# vim /mnt/boot/grub/grub.conf   default=0    #指定默认启动菜单   timeout=5    #启动菜单出现后5秒进入系统   title custom linux   #启动项名称   root (hd0,0)   #以第一块硬盘的第一个分取,作为启动的根分区   kernel /vmlinuz-2.6.32-696.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash   #kernel /vmlinuz-2.6.32-696.el6.x86_64 :把boot作为根,加载根下的内核文件   #root=/dev/sda2 :真正根所在的分区   #selinux=0 :关闭SELinux   #init=/bin/bash :以/bin/bash作为启动后运行的第一个程序   initrd /initramfs-2.6.32-696.el6.x86_64.img   加载伪文件系统ramdisk

挂载根分区

root&Centos6: ~#mkdir /mnt/root#创建挂载点root&Centos6: ~#mount /dev/sdb2 /mnt/root#挂载/dev/sdb2 到/mnt/root目录下root&Centos6: ~#ls /mnt/root/lost+found

复制bash和相关命令及相关库文件

经过了前面的操作后自制小Linux的框架就已经基本搭建好了,接下来要做的就是丰富它的功能了。Linux的哲学思想是一切皆文件,所以只要把现有系统相应功能的二进制文件和库文件复制到/mnt/root目录下,自制的Linux就可以使用了。
要实现这个功能比较复杂繁琐,这就要用到我们Linux的shell脚本了,这个脚本已经写好,作用是拷贝命令,你可以直接复制编辑后使用。
下面是脚本的内容:

root&Centos6: ~#cat copycmd.sh#!/bin/bashcopy_cmd(){        local cmd_destdir=$destdir$(dirname $(which $1))        if [ ! -d $cmd_destdir ] ;then           mkdir -pv $cmd_destdir        fi         cp -v $(which $1) $cmd_destdir}copy_libfile(){       ldd $(which $1)|grep -oE "/.* " | while read libfile        do            local lib_destdir=$destdir$(dirname $libfile)            local lib_destfile=$destdir$libfile            if [ -e $lib_destfile ];then                    continue            elif [ -d $lib_destdir ] ;then                 cp -v $libfile $lib_destdir            else                 mkdir -pv $lib_destdir                 cp -v $libfile $lib_destdir           fi        done}destdir=/mnt/rootif [ ! -d $destdir ];then    mkdir $destdirfiwhile true ;do    echo -ne "\033[34mPlease input a execute command:\033[0m"    read cmd    if [ "$cmd" == quit ];then        exit    fi    which $cmd &>/dev/null ||{ echo $cmd not exist;continue; }    copy_cmd $cmd    copy_libfile $cmddone

使用bash命令执行上边贴出的 copycmd.sh脚本,将你需要在自制Linux中使用的命令复制到/mnt/root目录下,复制完成后敲quit退出脚本。需要复制的命令根据你的需求决定,但bash是必须要复制的,因为在编辑grub.conf文件时,已将它写为系统要启动运行的第一个程序,所以没这个程序系统将无法启动。其它命令便可根据需要自行复制了,下边是执行脚本的过程。

root&Centos6: ~#bash copycmd.shPlease input a execute command:bash#bash复制成功后的显示应当是下面这样的,如果不同请检查脚本。mkdir: created directory `/mnt/root/bin'`/bin/bash' -> `/mnt/root/bin/bash'mkdir: created directory `/mnt/root/lib64'`/lib64/libtinfo.so.5' -> `/mnt/root/lib64/libtinfo.so.5'`/lib64/libdl.so.2' -> `/mnt/root/lib64/libdl.so.2'`/lib64/libc.so.6' -> `/mnt/root/lib64/libc.so.6'`/lib64/ld-linux-x86-64.so.2' -> `/mnt/root/lib64/ld-linux-x86-64.so.2'Please input a execute command:ls`/bin/ls' -> `/mnt/root/bin/ls'……此处省略部分显示内容Please input a execute command:ifconfig……此处省略部分显示内容Please input a execute command:ping`/bin/ping' -> `/mnt/root/bin/ping'`/lib64/libidn.so.11' -> `/mnt/root/lib64/libidn.so.11'Please input a execute command:hostname`/bin/hostname' -> `/mnt/root/bin/hostname'Please input a execute command:cat`/bin/cat' -> `/mnt/root/bin/cat'Please input a execute command:vi`/bin/vi' -> `/mnt/root/bin/vi'Please input a execute command:vim……此处省略部分显示内容Please input a execute command:mount……此处省略部分显示内容Please input a execute command:umount`/bin/umount' -> `/mnt/root/bin/umount'Please input a execute command:reboot……此处省略部分显示内容Please input a execute command:shutdown……此处省略部分显示内容Please input a execute command:quit

查看目录树,确定命令都已复制成功

root&Centos6: ~#tree /mnt//mnt/├── boot│   ├── grub│   │   ├── device.map│   │   ├── e2fs_stage1_5……此处省略部分显示内容│   │   ├── vstafs_stage1_5│   │   └── xfs_stage1_5│   ├── initramfs-2.6.32-696.el6.x86_64.img│   ├── lost+found│   └── vmlinuz-2.6.32-696.el6.x86_64└── root    ├── bin    │   ├── bash    │   ├── cat   ……此处省略部分显示内容    │   ├── umount    │   └── vi    ├── lib64    │   ├── ld-linux-x86-64.so.2    │   ├── libacl.so.1   ……此处省略部分显示内容    │   ├── libutil.so.1    │   └── libuuid.so.1    ├── sbin……此处省略部分显示内容            ├── libgpm.so.2            └── perl5                └── CORE                    └── libperl.so12 directories, 55 files

装载网络模块,用于实现网络功能

root&Centos6: ~#bash copycmd.sh#复制加载网卡模块的命令Please input a execute command:insmodPlease input a execute command:quitroot&Centos6: ~#ethtool -i eth0#查看eth0网卡对应的驱动模块名driver: e1000version: 7.3.21-k8-NAPI ……此处省略部分显示内容root&Centos6: ~#modinfo -n e1000#显示模块对应路径,找出对应的模块文件/lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko

复制网卡模块文件到/mnt/root/lib64/目录下

root&Centos6: ~#cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/root/lib64/root&Centos6: ~#ls /mnt/root/lib64/e1000.ko/mnt/root/lib64/e1000.ko

创建根分区下的一级目录

root&Centos6: ~#ls /mnt/root/bin  lib64  lost+found  sbin  usrroot&Centos6: ~#cd /mnt/root/root&Centos6: root#mkdir {etc,dev,proc,sys,boot,home,var,mnt,media,root,tmp,lib}root&Centos6: root#lsbin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  proc  root  sbin  sys  tmp  usr  var

测试定制的小Linux是否制作成功

使用chroot命令切根,成功则这个定制的小Linux制作成功,如果不成功请检查脚本,排除问题后删除/mnt/root/下文件,重新复制一遍命令。

root&Centos6: root#chroot /mnt/root/bash-4.1#  #成功切根后的命令提示符bash-4.1#bash-4.1# exitexit#退出切根后的当前进程root&Centos6: root#syncroot&Centos6: root#sync#将内存中的文件写入硬盘,同步文件

挂载新机器并启用网络功能

将磁盘挂载到新主机上,使用带有自制Linux的磁盘进行启动,实现网络功能。

bash-4.1# insmod /liib64/e1000.ko#加载网卡模块bash-4.1# ifconfig -a#查看是否成功加载网卡模块bash-4.1# ifcongig eth0 172.18.22.22#设置临时IP地址

具体操作过程请看下图:

bash

到此制作简单小Linux系统的实验就完成了!虽然功能比较简单,但通过这个实验确实可以提高对内核和启动流程的认识。