您的位置:首页 > 运维架构 > Linux

制作简单的小Linux系统

2017-09-02 21:45 337 查看

制作简单的小Linux系统

制作简单的小Linux系统
前言

制作前的准备
物理设备

制作思路

创建分区和文件系统

挂载boot分区

安装grub

复制内核和initramfs文件

建立grubconf配置文件

挂载根分区

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

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

创建根分区下的一级目录

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

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

前言

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

制作前的准备

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

物理设备

首先,你要准备一台linux主机和一块磁盘,这块磁盘用于安装和启动我们自制的小Linux,可以是块硬盘,也可以是U盘。对于磁盘空间没过多要求,大于2G就可以。

将准备好的磁盘连接到Linux主机,使用lsblk命令查看连接到主机的设备,确定你的磁盘被加载到了系统中。

root&Centos6: ~#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0<
129b1
/span>    1  3.7G  0 rom  /media/CentOS_6.9_Final
sdb      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]


制作思路

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

创建分区和文件系统

挂载boot分区

安装grub

复制内核和initramfs文件

建立grub.conf配置文件

挂载根分区

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

创建根分区下的一级目录

测试定制的小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 1
Last cylinder, +cylinders or +size{K,M,G} (1-2088, default 2088): +100M
#此处输入+100M,代表第一分区的大小是100M,此分区之后会后用来挂载/boot分区。
Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (15-2088, default 15): #此处回车键
Using default value 15
Last 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: ~#lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0     11:0    1   3.7G  0 rom  /media/CentOS_6.9_Final
sdb      8:16   0    16G  0 disk
├─sdb1   8:17   0 109.8M  0 part
└─sdb2   8:18   0  15.9G  0 part
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]


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

root&Centos6: ~#mkfs.ext4 /dev/sdb1
root&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+found
root&Centos6: ~#ls /mnt/boot/grub/
#查看安装完grub后在grub目录下生成的文件
device.map     fat_stage1_5  iso9660_stage1_5  minix_stage1_5     stage1  ufs2_stage1_5    xfs_stage1_5
e2fs_stage1_5  ffs_stage1_5  jfs_stage1_5      reiserfs_stage1_5  stage2  vstafs_stage1_5
root&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/bash
copy_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/root
if [ ! -d $destdir ];then
mkdir $destdir
fi
while 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 $cmd
done


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

root&Centos6: ~#bash copycmd.sh
Please 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.so
12 directories, 55 files


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

root&Centos6: ~#bash copycmd.sh
#复制加载网卡模块的命令
Please input a execute command:insmod
Please input a execute command:quit
root&Centos6: ~#ethtool -i eth0
#查看eth0网卡对应的驱动模块名
driver: e1000
version: 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  usr
root&Centos6: ~#cd /mnt/root/
root&Centos6: root#mkdir {etc,dev,proc,sys,boot,home,var,mnt,media,root,tmp,lib}
root&Centos6: root#ls
bin  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# exit
exit
#退出切根后的当前进程
root&Centos6: root#sync
root&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地址


具体操作过程请看下图:



到此制作简单小Linux系统的实验就完成了!虽然功能比较简单,但通过这个实验确实可以提高对内核和启动流程的认识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: