制作简单的小Linux系统
来源:互联网 发布:全国地区数据库 sql 编辑:程序博客网 时间:2024/04/29 07:17
制作简单的小Linux系统
- 制作简单的小Linux系统
- 前言
- 制作前的准备
- 物理设备
- 制作思路
- 创建分区和文件系统
- 挂载boot分区
- 安装grub
- 复制内核和initramfs文件
- 建立grubconf配置文件
- 挂载根分区
- 复制bash和相关命令及相关库文件
- 装载网络模块用于实现网络功能
- 创建根分区下的一级目录
- 测试定制的小Linux是否制作成功
- 挂载新机器并启用网络功能
- 制作简单的小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]
制作思路
有一个清晰且准确的实验流程思路,对于成功完成实验至关重要。下面是我以清单的方式向你说明的大致制作流程,请在实验过程中务必按照此流程操作,以确保实验成功。
- 创建分区和文件系统
- 挂载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 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地址
具体操作过程请看下图:
到此制作简单小Linux系统的实验就完成了!虽然功能比较简单,但通过这个实验确实可以提高对内核和启动流程的认识。
- 制作简单的小Linux系统
- 基于busybox的Linux小系统制作 (initrd)
- Linux制作简单的NAS
- 对话系统ChatScript入门(Linux版本)——制作简单的中文对话系统
- 使用GRUB2制作简单的系统引导
- 运用UI制作简单的 登陆系统
- jquery制作简单的投票系统
- 打造小的Linux系统
- 几个小的Linux系统
- linux系统的inird文件的制作
- 简单的嵌入式linux根文件系统制作
- linux下制作简单的脚本
- 制作基于软盘的Linux系统
- 制作基于软盘的Linux系统
- Linux系统下Ramdisk的制作过程
- Linux系统启动盘制作关键技术的探讨
- 最小的Linux系统制作过程详解
- 制作DOM 盘上的Linux 系统
- HTTP
- 【nyoj2359】巴什博奕
- linux 文件系统原理系列
- 2018CVTE后台研发工程师内推笔试编程题2
- Zookeeper_0_序
- 制作简单的小Linux系统
- STL(二十一)非变易算法
- [C++] assert用法
- 基于轻量级ORM框架Dapper的扩展说明
- appium+python官方sample code(六)
- [面试题]
- Node与Express开发-路由
- 基于java的sparkSQL从mysql中读取数据
- 【codevs 2833】奇怪的梦境