制作简单的小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分区
注意:挂载点的子目录必须为bootroot&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系统的实验就完成了!虽然功能比较简单,但通过这个实验确实可以提高对内核和启动流程的认识。
相关文章推荐
- linux系统制作简单流程
- 制作简单的linux系统
- s5pv210 linux3.8.3内核移植之三:简单根文件系统制作
- 对话系统ChatScript入门(Linux版本)——制作简单的中文对话系统
- 如何制作最简单和最小的Linux系统
- 对话系统ChatScript入门(Linux版本)——制作简单的中文对话系统
- 制作一个简单的linux系统
- Linux 系统启动流程及 Grub 简单应用
- 双系统配置与简单的linux系统修复(boot分区,root密码等)
- Linux常用文件系统的制作命令
- 17制作U盘启动盘安装Linux系统_Fedora17
- 制作Linux发行版U盘运行系统
- Linux下的motion detection(最简单的办公室监控系统)
- linux文件系统的权限简单介绍
- nodejs教程之制作一个简单的文章发布系统
- linux 制作U盘启动,和定制系统
- 玩转开发板--最简单的根文件系统树的制作-1
- Linux系统自动安装(上)——制作kickstart脚本
- 向U盘中安装Linux系统的经验(不是制作安装盘)
- 基于S3C2440的Linux内核移植和yaffs2文件系统制作