一、前言

  Linux操作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为我们后来人提供了一个良好的学习和研究环境。

  本文主要通过裁剪现有Linux系统,根据自己的需要,打造一个属于自己的Linux小系统,让其能够具备Linux的一些常用小功能。

二、原理

启动流程介绍:

制作Linux小系统之前,我们有必要再了解一下Linux的启动流程:

1、首先Linux要通过POST自检,检查硬件设备有没有故障

2、如果有多块启动盘的话,需要在BIOS中选择启动磁盘

3、启动MBR中的bootloader引导程序

4、加载内核文件

5、执行所有进程的父进程、老祖宗init

6、打印欢迎界面

在Linux的启动流程中,加载内核文件时还需要借助别外两个文件:

1)initrd,是CentOS5上用内存模拟的磁盘设备

2)initramfs,是CentOS6上用内存模拟的文件系统

在启程的流程中,init主要是用来做哪些操作的呢?

init通过调用/etc/inittab这个配置文件,然后再去执行/etc/rc.d/rc.sysinit的系统初始化脚本

好啦,原理我们已经知道了,接下来我们来看看具体的思路吧(〃'▽'〃)

三、思路

1、我们要在一个现有的Linux系统上加一块硬盘/dev/sdb,在硬盘上分两个分区,一个是/boot,一个是/,并将其格式化。当然,我们需要明确的概念是,我们现在加的这个硬盘在现有的Linux系统中是/dev/sdb,但是,当我们把东西全部设置好时,我们就需要把这个硬盘拔除,放在我们的新系统上,此时,他就是/dev/sda啦。

2、在/dev/sdb这个硬盘上,我们要将其打造成一个独立的Linux系统,里面的所有文件是需要我们一个一个拷贝进去的。而且,作为一个将来要当/dev/sda的硬盘,里面一定要有grub文件诺~所以我们要安装grub文件。

3、同时,作为一个能独立运行的Linux系统,内核是一定不能少的!所以,我们要把内核文件和initramfs文件也一起拷到我们的/dev/sdb上。

4、现在我们系统已经初具规模了,接下来就是需要程序了0.0关于程序的拷贝我们可以通过一个脚本来实现。具体的脚本在下文中会给大家说到。

以上步骤完成,我们的自制Linux就完成啦~我们的思路就是这么回事,接下来,我们就开始吧( ̄▽ ̄)~*

四、操作步骤

本次实验我们以centos6.9为例~

1、目标磁盘分区

首先,我们在宿主机上添加一块大小为20G的硬盘:

添加完成后,点击确定,然后我们打开宿主机。 通过fdisk来给我们的/dev/sdb进行分区:

 [root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x4fde4cd0.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u'). Command (m for help): n
Command action
e extended
p primary partition (-)
p
Partition number (-):
First cylinder (-, default ):
Using default value
Last cylinder, +cylinders or +size{K,M,G} (-, default ): +100M Command (m for help): n
Command action
e extended
p primary partition (-)
p
Partition number (-):
First cylinder (-, default ):
Using default value
Last cylinder, +cylinders or +size{K,M,G} (-, default ):
Using default value
#查看分区
Command (m for help): p Disk /dev/sdb: 21.5 GB, bytes
heads, sectors/track, cylinders
Units = cylinders of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x4fde4cd0 Device Boot Start End Blocks Id System
/dev/sdb1 + Linux
/dev/sdb2 Linux
#保存并退出
Command (m for help): w
The partition table has been altered!

接下来,我们对/dev/sdb的分区进行格式化:

 [root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# mkfs.ext4 /dev/sdb2

格式化完成后,我们创建一个文件夹。进行挂载:

 [root@localhost ~]# mkdir -p /mnt/boot
[root@localhost ~]# mount /dev/sdb1 /mnt/boot/

  注意:新建的文件夹必须是/mnt/boot

2、安装grub至目标磁盘

我们直接用grub-install --root-directory=/mnt命令来安装。用这个命令会安装grub引导第二阶段的文件。

 [root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb
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
[root@localhost ~]# cd /mnt/boot
[root@localhost boot]# ls
grub lost+found
[root@localhost boot]# cd grub/
[root@localhost grub]# ls
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@localhost ~]# hexdump -C -n  /dev/sdb
eb |.H..............|
|................|
*
|................|
ff fa f6 c2 |... ............|
b2 ea 7c c0 8e d8 8e d0 bc |u....Y|........|
fb a0 7c 3c ff c2 f6 c2 |. ..@|<.t...R...|
b4 bb aa cd 5a fb |tT.A..U..ZRrI..U|
aa a0 7c c0 e1 |.uC.A|..u....t7f|
8b 4c be 7c c6 ff 8b 1e 7c c7 |.L...|.D..f..D|.|
000000a0 c7 5c c7 |....D...f.\..D..|
000000b0 c0 0c b4 cd |pf1..D.f.D..B..r|
000000c0 bb eb 7d b4 cd 0a f6 c2 0f |...p.}....s.....|
000000d0 f0 e9 8d be 7c c6 ff c0 |........|.D..f1.|
000000e0 f0 d2 ca c1 e2 e8 |..@f.D.........|
000000f0 f4 c0 d0 c0 e8 |..@.D.......f..|
a1 7c d2 f7 0a d2 |f.D|f1.f..T.f1.|
f7 0b 0c 3b 7d 3c 8a |f.t..T..D.;D.}<.|
0d c0 e2 8a 4c 0a fe c1 d1 8a 6c 0c 5a |T.....L......l.Z|
8a 0b bb 8e c3 db b8 cd |.t...p........r|
2a 8c c3 8e 7c 1e b9 8e db f6 |*....H|`.......|
ff fc f3 a5 1f ff 7c be 7f 7d e8 |.....a.&B|..}.@|
eb 0e be 7d e8 eb be 8e 7d e8 |.....}......}.|
be 7d e8 2a eb fe |...}.*...GRUB .G|
6f 6d 6b |eom.Hard Disk.Re|
6f bb b4 0e cd |ad. Error.......|
000001a0 ac 3c f4 c3 |..<.u...........|
000001b0 d0 4c de 4f |.........L.O....|
000001c0 fe 3f 0d 3f 4f 6e |....?.?...On....|
000001d0 0e fe ff ff 8e 6e 5d 7c |.......n..$]|...|
000001e0 |................|
000001f0 aa |..............U.|

安装成功。

3、复制内核文件和initrd文件

将内核文件和initrd文件复制到/dev/sdb下的boot目录中:

 [root@localhost ~]# cp /boot/vmlinuz-2.6.-.el6.x86_64 /mnt/boot/
[root@localhost ~]# cp /boot/initramfs-2.6.-.el6.x86_64.img /mnt/boot/

4、建立grub.conf文件

上面我们已经移植了内核和initrd文件,我们可以根据其版本来编写grub.conf文件:

 [root@localhost ~]# vim /mnt/boot/grub/grub.conf
default=
timeout=
title linux owner
kernel /vmlinuz-2.6.-.el6.x86_64 root=UUID=1feac471-08c5-4b5b-aaff-bb6a1da60e26 selinux= init=/bin/bash
initrd /initramfs-2.6.-.el6.x86_64.img

注意,我们要把selinux给关掉,同时设定一下init,告诉内核不要再去找这个程序了,不然开机的时候会出现错误的~

5、创建一级目录并复制文件

至此,我们就缺目录和文件了~

创建开机后的一级目录,同时把/dev/sdb2挂载至/mnt/sysroot,使该目录作为根目录:

 [root@localhost ~]# mkdir /mnt/sysroot
[root@localhost ~]# mkdir -pv /mnt/sysroot/{etc,tmp,var,usr,sys,proc,opt,home,root,dev,mnt,media}
mkdir: created directory `/mnt/sysroot/etc'
mkdir: created directory `/mnt/sysroot/tmp'
mkdir: created directory `/mnt/sysroot/var'
mkdir: created directory `/mnt/sysroot/usr'
mkdir: created directory `/mnt/sysroot/sys'
mkdir: created directory `/mnt/sysroot/proc'
mkdir: created directory `/mnt/sysroot/opt'
mkdir: created directory `/mnt/sysroot/home'
mkdir: created directory `/mnt/sysroot/root'
mkdir: created directory `/mnt/sysroot/dev'
mkdir: created directory `/mnt/sysroot/mnt'
mkdir: created directory `/mnt/sysroot/media'

  复制文件,复制文件我们通过脚本执行,复制我们平时常用的命令即可,小编这里复制了ls,ifconfig,bash,reboot,rm,modprobe,mount,ip,mkdir,touch,cat,vi,less,shutdown,insmod。我们可以用tree查看一下这些命令的复制情况:

 [root@localhost sysroot]# tree /mnt/sysroot/
/mnt/sysroot/
├── bin
│ ├── bash
│ ├── cat
│ ├── ls
│ ├── mkdir
│ ├── mount
│ ├── rm
│ └── touch
├── dev
├── etc
├── home
├── lib64
│ ├── ld-linux-x86-.so.
│ ├── libacl.so.
│ ├── libattr.so.
│ ├── libaudit.so.
│ ├── libblkid.so.
│ ├── libcap.so.
│ ├── libcrypt.so.
│ ├── libc.so.
│ ├── libdbus-.so.
│ ├── libdl.so.
│ ├── libfreebl3.so
│ ├── libgcc_s.so.
│ ├── libm.so.
│ ├── libnih-dbus.so.
│ ├── libnih.so.
│ ├── libnsl.so.
│ ├── libpcre.so.
│ ├── libpthread.so.
│ ├── libresolv.so.
│ ├── librt.so.
│ ├── libselinux.so.
│ ├── libsepol.so.
│ ├── libtinfo.so.
│ ├── libutil.so.
│ └── libuuid.so.
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── sbin
│ ├── ifconfig
│ ├── insmod
│ ├── ip
│ ├── modprobe
│ ├── reboot
│ └── shutdown
├── sys
├── tmp
├── usr
│ ├── bin
│ │ ├── less
│ │ └── vim
│ └── lib64
│ ├── libgpm.so.
│ └── perl5
│ └── CORE
│ └── libperl.so
└── var directories, files

  很明显我们都复制成功了~

附:复制命令的脚本源代码

 #!/bin/base
#----------------------------------
#Filename:copycmd.sh
#Revision:1.0
#Date:--
#Author:Keer
#Email:@qq.com
#Website:http://www.cnblogs.com/keerya/
#Description:复制命令到指定目录
#---------------------------------- #定义变量
destdir=/mnt/sysroot
SETCOLOR_FAILURE="echo -en \\033[1;35;5m"
SETCOLOR_NORMAL="echo -en \\033[0m" echo_jiantou() {
echo -en \\[40G
$SETCOLOR_FAILURE
} echo_copy() {
echo -en \\[80G
$SETCOLOR_FAILURE
echo -n $"复制完成!"
$SETCOLOR_NORMAL
} #定义函数
#复制命令
copy_cmd(){
# 定义变量
local cmd_path=`which --skip-alias $cmd`
local cmd_dir=`dirname $cmd_path`
local cmd_destdir=$destdir$cmd_dir
if [ ! -d $cmd_destdir ] ;then
mkdir -pv $cmd_destdir &> /dev/null
fi
cp $cmd_path $cmd_destdir &> /dev/null
echo -e "\t$cmd_path `echo_jiantou` \t $cmd_destdir `echo_copy` "
}
#复制库文件 判断库文件是否存在,若存在,跳过该次循环;如不存在,判断库文件所在目录是否存在,若存在,复制库文件;若不存在,则新建目录并复制库文件 copy_libfile(){
local cmd_path=`which --skip-alias $cmd`
local lib_list=`ldd $cmd_path |egrep -o "/.* " `
for i in $lib_list ;do
local lib_dir=$destdir$i
local lib_destdir=$destdir`dirname $i`
echo -e "\t$i `echo_jiantou` \t $lib_destdir `echo_copy` "
if [ -e $lib_dir ];then
continue
elif [ -d $lib_destdir ];then
cp $i $lib_destdir
else
mkdir -pv $lib_destdir &> /dev/null
cp $i $lib_destdir
fi
done
}
#若/mnt/sysroot不存在,则创建
if [ ! d $destdir ];then
mkdir $destdir
fi #死循环,清空屏幕
while true ; do
tput clear
#正式:
cat <<-EOF
**********************************************************************
*** 命令复制脚本 ***
*** 请输入一个命令 ***
*** 按q或quit退出脚本 ***
**********************************************************************
EOF read -p "Please input a execute command:" cmd
if [ "$cmd" == 'q' -o "$cmd" == 'quit' ];then
unset cmd destdir
break
fi
# 判断输入的命令是否存在
if [ -n "$cmd" ];then
which --skip-alias "$cmd" &> /dev/null
if [ $? -eq ];then
copy_cmd $cmd
copy_libfile $cmd
else
echo "$cmd is not exist"
fi
else
echo "Please enter at leastone command"
fi
echo -e "Please enter \\033[31;1menter\\033[0m and we continue"
read input done

6、复制网卡驱动

我们基本工作已经完成了,如果想使这个虚拟机带有网卡功能,我们就必须把网卡驱动拷过来,具体操作如下:

1)查询网卡详细信息:

 [root@localhost sysroot]# modinfo e1000
filename: /lib/modules/2.6.-.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
version: 7.3.-k8-NAPI
license: GPL
description: Intel(R) PRO/ Network Driver
author: Intel Corporation, <linux.nics@intel.com>
srcversion: A911791C4EFC2A93BCFCF6A
alias: pci:v00008086d00002E6Esv*sd*bc*sc*i*
alias: pci:v00008086d000010B5sv*sd*bc*sc*i*
alias: pci:v00008086d00001099sv*sd*bc*sc*i*
alias: pci:v00008086d0000108Asv*sd*bc*sc*i*
alias: pci:v00008086d0000107Csv*sd*bc*sc*i*
alias: pci:v00008086d0000107Bsv*sd*bc*sc*i*
……

2)把网卡模块的路径复制到/mnt/sysroot的库文件下:

 [root@localhost sysroot]# cp /lib/modules/2.6.-.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib64/

以上,我们的操作全部完成。现在我们就可以关机,然后把/dev/sdb这个硬盘拆下来,放到新的虚拟机上运行了~

五、测试开机

我们创建一个新的虚拟机,启动的时候会带一个硬盘,我们不用它的,删掉再把我们自己定义的硬盘加进去:

此时,我们做好的硬盘已经加进去了。我们可以试试能不能启动了,如果虚拟机可以正常开启,就说明我们的实验成功~

六、实现网络功能

由于图片可能会看不清楚,现把代码标出如下:

 #手动添加网卡驱动
insmod /lib64/e1000.ko #查看ip
ip a #添加IP地址
ifconfig eth0 192.168.252.62/ up #查看ip
ip a

  由于复制命令的时候忘记复制ping了……所以我们用另一台机器来ping一下这个ip地址:

可以ping通~

至此,我们已经完成了私人订制Linux的全部操作,同时我们的自制Linux也可以联网啦~

所有实验圆满成功!撒花✿✿ヽ(°▽°)ノ✿

私人订制——属于你自己的Linux的更多相关文章

  1. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  2. Linux 系统裁剪

     一.前言 Linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为 ...

  3. 私人定制自己的linux小系统

     私人定制自己的linux小系统 一.前言    linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个linux爱好者都为其贡献了自己的一份力,不管是在 ...

  4. 为自己打造Linux小系统

     一.前言 Linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为 ...

  5. 做一个自己的最小Linux系统

     一.前言 Linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为 ...

  6. 「Linux」制作一个Linux系统

    一.前言 Linux操作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为我们 ...

  7. 实现ARM——Linux的自动登录

    在使用Linux系统嵌入式开发时,往往需要设备绕过Linux的登录系统使其自动启动,比如我们常用的SSH客户端等.网上确实有很多方法,不知道是因为我们的ARM9板子是私人订制的缘故还是什么原因,试了很 ...

  8. Linux 内核概述 - Linux Kernel

    Linux 内核学习笔记整理. Unix unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠. 1973 年,在用 ...

  9. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

随机推荐

  1. JMeter网站测试分析

     WEB类型: User Driver:以用户量作为衡量系统性能的主要指标的系统,典型如IM系统.企业 内部业务系统: TPS-Driver:以tps作为衡量系统性能的主要指标的系统,典型的如消息系统 ...

  2. JavaJavaScript小问题系列之JSON解析

    1.错误消息及截图 这个很搞笑也很纠结,今天一开发妹子,发现一个问题: 服务端返回字符串"{\"phone\":\"15000000000\"}&qu ...

  3. java之http协议

                                 HTTP协议 自从入坑以来,只要是跟web打交道,总是免不了这个HTTP协议,这是什么鬼,让我们一探究竟.(不周之处还请赐教!!!) 既然是协 ...

  4. IDE UltraEdit 图文激活+安装教程

    IDE UltraEdit 安装+激活图文.. ---------------- ---------------- ---------------- ---------------- -------- ...

  5. opencv VideoCapture使用示例

    在centos7下验证VideoCapture功能. 1 opencv处理视频时要使用ffmpeg,这里使用添加源的方式安装,分为3步 1.1 先安装EPEL Release,使用其他的repo源,所 ...

  6. JAVA实用案例之验证码开发

    验证码在很多地方都会遇到,实现的方法和形式也有很多,主要的目的就是为了安全,防止一些恶意的攻击等.说实话那么多年竟然没注意过这东西,原理很简单,贴出来给大家做个参考. 1.简单介绍 一般稍微有些经验的 ...

  7. java常见加密方式介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt260 本篇内容简要介绍BASE64.MD5.SHA.HMAC几种加密算法.  ...

  8. 一种解决url的get请求参数传值乱码问题的方式

    做项目的时候发现url get请求传中文字符出现乱码问题,百度了一下,最后用一种比较容易理解的方式解决了.分享给大家! 经过百度,网友提到:url get方式提交的参数编码,只支持iso8859-1编 ...

  9. 【★】SPF(Dijkstra)算法完美教程

  10. c++ Lambda函数学习

    或许,Lambda 表达式算得上是 C++ 11 新增特性中最激动人心的一个.这个全新的特性听起来很深奥,但却是很多其他语言早已提供(比如 C#)或者即将提供(比如 Java)的.简而言之,Lambd ...