Linux还是亲生的好,实战自制Linux操作系统


实战自制Linux操作系统


本文主要通过裁剪现有Linux系统,打造一个属于自己的Linux小系统,让其能够装载网卡驱动,并配置IP地址,实现网络功能。

自制linux系统

步骤概述:

1、新建一个硬盘
2、在该新硬盘上新建两个分区,一个当boot分区,一个当/分区
3、格式化并且挂载两个分区
4、安装grub至目标磁盘
5、为grub提供配置文件
6、复制内核文件和initrd文件
7、创建目标主机根文件系统
8、移植bash命令和其库文件到根文件系统
9、装载模块,实现网络功能
10、启动测试

特别提醒

如果在vmvare上做此实验,在新建虚拟机创建新磁盘的时候,一定要选“Store virtual disk as a single file”,否则,也会出现内核恐慌kennel panic。

wKioL1fXXb7CIt1PAABHjngGLbU781.png

步骤演示详解过程:

1、新建一个硬盘

2、在该新硬盘上新建两个分区,一个当boot分区,一个当/分区

首先,我们要在目标磁盘上分两个区,并进行格式化。第一个分区100M,用来装引导程序;第二个分区19G,用来装根文件系统。然后再进行挂载操作,将/dev/sdb1挂载到/mnt/boot下,将/dev/sdb2挂载到/mnt/root下。

sdb                   8:16   0    20G  0 disk 
├─sdb1                8:17   0 109.8M  0 part
└─sdb2                8:18   0  19.9G  0 part
[root@localhost ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xdd8058c2

  Device Boot     Start         End      Blocks  Id  System
/dev/sdb1               1          14      112423+  83  Linux
/dev/sdb2              15        2610    20852370   83  Linux

3、格式化并且挂载两个分区

注意,其中boot分区的挂载目录一定是boot名字的目录

[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# mkfs.ext4 /dev/sdb2
[root@localhost ~]# mkdir -p /mnt/{root,boot}
[root@localhost ~]# ll /mnt/
total 8
drwxr-xr-x 2 root root 4096 Jul 25 08:52 boot
drwxr-xr-x 2 root root 4096 Jul 25 08:52 root
[root@localhost ~]# mount /dev/sdb1 /mnt/boot/
[root@localhost ~]# mount /dev/sdb2 /mnt/root/
[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1             103M  1.6M   96M   2% /mnt/boot
/dev/sdb2              20G   44M   19G   1% /mnt/root

4、安装grub至目标磁盘

一个系统能启动,就需要引导,所以我们首先要安装一个grub引导程序到我们的新磁盘上,安装grub引导程序主要有两个命令,一个是grub-install,另一个是setup,这里最好使用grub-install来安装。因为:

①grub-install会安装grub引导第二阶段的文件 
②setup不会安装第二阶段的引导程序,是安装引导信息到MBR
//第二个需要注意的地方就是--root-directory=后面接的路径应该是boot目录所在的地方,而不是/mnt/boot,因为boot目录在mnt下;目标磁盘是/dev/sdb
[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]# ll
total 13
drwxr-xr-x 2 root root  1024 Jul 25 08:58 grub
drwx------ 2 root root 12288 Jul 25 08:51 lost+found

安装完grub后,进入grub目录,会发现没有grub.conf配置文件,这样就导致我们的引导程序是不健全的,所以我们需要手动写一个配置文件在里边。

5、为grub提供配置文件

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

default=0
timeout=5
title CentOS to ZhangHe Soft-Linux
root (hd0,0)
kernel /vmlinz-soft ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
initrd /initramfs-soft.img

quiet是静默安装,不再显示安装时的一大堆信息。后面要把selinux关掉,而且init要使用/bin/bash,告诉内核不要再去找init程序了。如果不指定这一步,在启动过程中就会报kernel panic(内核恐慌),以为系统就它一个了,没有init进程,恐慌的不行。

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

init是系统中用来产生其它所有进程的程序。它以守护进程的方式存在,其进程号为1,init是所有进程的父进程,老祖宗,所以不移植是不行的。它通过调用/etc/inittab这个配置文件,然后再去执行/etc/rc.d/rc.sysinit的系统初始化脚本。 
将内核文件和initrd文件复制到/dev/sdb下的boot目录中。

[root@localhost grub]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz-soft
[root@localhost grub]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs-soft.img

7、创建目标主机根文件系统

使用命令行展开创建文件系统

[root@localhost grub]# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
mkdir:
created directory `/mnt/sysroot'
mkdir:
created directory `/mnt/sysroot/etc'
mkdir:
created directory `/mnt/sysroot/etc/rc.d'
mkdir:
created directory `/mnt/sysroot/usr'
mkdir:
created directory `/mnt/sysroot/var'
mkdir:
created directory `/mnt/sysroot/proc'
mkdir:
created directory `/mnt/sysroot/sys'
mkdir:
created directory `/mnt/sysroot/dev'
mkdir:
created directory `/mnt/sysroot/lib'
mkdir:
created directory `/mnt/sysroot/lib64'
mkdir:
created directory `/mnt/sysroot/bin'
mkdir:
created directory `/mnt/sysroot/sbin'
mkdir:
created directory `/mnt/sysroot/boot'
mkdir:
created directory `/mnt/sysroot/srv'
mkdir:
created directory `/mnt/sysroot/mnt'
mkdir:
created directory `/mnt/sysroot/media'
mkdir:
created directory `/mnt/sysroot/home'
mkdir:
created directory `/mnt/sysroot/root'
[root@localhost mnt]# ls root/
bin  boot dev etc home lib lib64 lost+found media mnt proc root sbin srv sys usr var

8、移植bash命令和其库文件到根文件系统

[root@localhost scripts]# bash cporder.sh 
Enter a command: bash
Enter a command: shutdown
Enter a command: vim
Enter a command: reboot
Enter a command: touch
Enter a command: mkdir
Enter a command: ls
Enter a command: rm
Enter a command: cat
Enter a command: less
Enter a command: tree
Enter a command: ifconfig
Enter a command: ip
Enter a command: route
Enter a command: ping
Enter a command: quit
quit

附:命令移植脚本

#!/bin/bash  
#  
target=/mnt/root  
clearCmd() {  
if which $cmd &> /dev/null; then  
cmdPath=`which --skip-alias $cmd`  
else  
echo "No such command"  
return 5  
fi  
}  
cmdCopy() {  
cmdDir=`dirname $1`  
[ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}  
[ -f ${target}${1} ] || cp $1 ${target}${cmdDir}  
}  
libCopy() {  
for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do  
libDir=`dirname $lib`  
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}  
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}  
done  
}  
while true; do  
read -p "Enter a command: " cmd  
if [ "$cmd" == 'quit' ] ;then  
echo "quit"  
exit 0  
fi  
clearCmd $cmd  
[ $? -eq 5 ] && continue  
cmdCopy $cmdPath  
libCopy $cmdPath  
done  

9、装载模块,实现网络功能

Linux是一个模块化的操作系统,好多功能组件都是通过模块化的工具来实现的,而且支持动态装载和卸载,我们要是想实现某种功能,只需加载相应的模块即可,就可以实现我们的Linux操作系统大瘦身了。


1、查看宿主机的网卡模块信息

[root@localhost ~]# lsmod | grep e1000
e1000                 134863  0

2、查看网卡的详细信息

[root@localhost ~]# modinfo e1000
filename:       /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
version:        7.3.21-k8-NAPI
license:        GPL
description:    Intel(R) PRO/1000 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*
//这里查询到了网卡模块的路径,把它复制到/dev/sdb的库文件下:
[root@localhost ~]# mkdir /mnt/root/lib64/modules
[root@localhost ~]# cp /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/root/lib64/modules/e1000.ko

3、init程序 
现在虽然是模块复制过去了,但是还不能用,而且现在也不满足我们的流程需要,因为连最起码的init程序都没有,如果我们想要这个init,有两个选择,第一,移植宿主系统的,但是格式会复杂一些;所以我们还是先自己动手写脚本吧,把脚本当作init来用,能够让小系统跑起来。init一般在sbin目录下,所以我们要在/dev/sdb2这个分区上编写一个init脚本。

[root@localhost ~]# cd /mnt/root/sbin
[root@localhost sbin]# cd /mnt/root/sbin/
#!/bin/bash
#print Welcome info
echo -e "Welcome to \033[34m nmshuishui soft-Linux\033[0m"
#mount wei wenjian system when the system is running.
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
#mount ethernet driver autl when the system is start.
insmod /lib64/modules/e1000.ko
[ $? -eq 0 ] && echo -e "Load e1000 module succeeded                    [\033[32m0K\033[0m]"
ifconfig lo 172.0.0.1/8
ifconfig eth0 172.16.251.235/16
#mount the /dev/sda2 to make it can be write and read.
mount -n -o remount,rw /dev/sda2 /
#run /bin/bash
/bin/bash

写完这个init脚本后,我们要把我们要给其一个执行权限,让其能够被执行;此脚本中还用到mount,insmod这些命令,所以要用上一个脚本把这些命令移植过去。最后还需要把/mnt/boot/grub/grub.conf中的init=/bin/bash换成init=/sbin/init,因为我现在要用这个init脚本来执行系统启动了,再也不需让/bin/bash来替换了。

10、启动测试

上面的步骤完成后,就可以把/dev/sdb挂到另一台主机上体验我们的私人订制小系统了。

wKioL1fXXdDhCCPuAACVa6zac2Y467.gif


到此,一个迷你版的Linux诞生了,可以装在自己移动U盘等设备上面,这里不做过多解释

本文出自 “家住海边喜欢浪” 博客,请务必保留此出处http://zhang789.blog.51cto.com/11045979/1852205

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
Kickstart+PXE自动部署 目录: 无人值守安装简介 实战:PXE批量部署linux操作系统 前言 部署dhcp服务 HTTP服务 TFTP服务 复制PXE启动时需要的文件 修改引导启动菜单 配置kickstart自动安装文件(ks.cfg) 装机测试 无人值守安装简介 无人值守安装(Unattended Setup)指软件安装时无需任何用户干预,直接按默认或通过应答文件设置安装,这对于无特殊需求的用户或企业大批量部署安装操作系统及软件时非常方便。无人值守安装也称为静默安装,在安装过程中可以静默安
一、CentOS 6 的启动流程 第一步:加电自检(POST) 主要检查硬件设备是否存在并能正常运行,如:CPU、内存、硬盘、风扇、输入输出设备等。自检功能主要是通过BIOS来实现的,BIOS程序是装载在一个硬件芯片CMOS上的,加电过程就是给CMOS通电,然后启动BIOS程序,BIOS程序会根据CMOS上面的一些配置信息区读取其他的硬件设备信息并检测其是否存在并能正常运行,之后进行硬件设备的初始化。 第二步:选择启动顺序,加载MBR 按照BIOS中设置的Boot Sequence查找Boot Loade
前几天我博客记录了zabbix安装《 Ubuntu系统LNMP环境下安装配置zabbix3.04 》这里我们给大家分享一下zabbix-proxy安装配置。阿里云zabbix-service ,公司内网zabbix-proxy 下面开始: zabbix-proxy 服务器配置 1 、配置 zabbix 源 #wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1+trusty
WEB 服务器的架设 , 在 linux 有一个很著名的架构叫 lamp : linux+apache+mysql+php,就知道apache的分量了。 在搭建 apache 服务钱需要做 DNS 服务器 DNS的搭建 http://wt7315.blog.51cto.com/10319657/1852795 http的详解 http://wt7315.blog.51cto.com/10319657/1837595 apache 后台进程: httpd 脚本: /etc/rc.d/init.d/httpd
1、路由配置 路由是互联网络的核心,没有路由的网络如同一座孤岛,掌握路由的配置是IT人员的必备技能。 例如:现在有三台主机需要通信,其中A和B在同一网段,C在另一网段,这两个网段有三个路由相隔,如何实现他们之间的通信呢? 主机A:IP=192.168.1.100/24 主机B:IP=192.168.1.63/24 主机C:IP=10.2.110.100/16 R1的接口0:IP=192.168.1.1/24,接口1:IP=110.1.24.10/24 R2的接口0:IP=110.1.24.20/24,接口

linux下使用quagga配置ospf协议 - 2016-09-12 18:09:22

环境:三台redhat6.5(VM虚拟机) 一、ospf协议 OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由。是对链路状态路由协议的一种实现,隶属内部网关协议(IGP),故运作于自治系统内部。 PS:这里不过多讲解ospf协议,可在网上自行查找学习 二、配置 首先下载安装软件包,其他yum源以及网络配置就不再介绍了,三

远程桌面排错(已解决) - 2016-09-12 18:09:20

最近遇到了一个比较棘手的问题,用户远程桌面无法连接,我的博文中之前也写到了一篇远程桌面排错,但是这次的和之前的大不相同 = = 原因排查步骤 1)首先当然是查看报错,这个是我自己机器上截图的,报错信息都一样 2)首先查看服务器是否开启了远程访问 3)查看目标是否可以ping通 4)查看服务是否正常启动 5)如果要正常远程到目标必须可以telnet到目标的远程端口,默认为3389,这个端口不通,我们之前已经将防火墙关闭了 6)本机上telnet 127.0.0.1 3389,这么做的话可以排除外界因素的干扰
随着php脚本语言使用的普及,目前webserice服务大部分都在用nginx+(php-fpm)的结构,了解了其工作过程后才可以在各个方面想办法做调整优化和故障排查,从以下几点总结一下这种模型。 一、nginx 和 php-fpm 的关系和分工 nginx 是 web 服务器, php-fpm 是一个 PHPFastCGI 进程管理器,两者遵循 fastcgi 的协议进行通信, nginx 负责静态类似 html 文件的处理, php-fpm 负责 php 脚本语言的执行,这么设计的目的是为了解耦前端
数据库的运维中,经常会遇到delete drop truncate的操作,那么如何去把握它们的用法和区别呢? 比如当数据库空间爆满,已经增长到存储空间单个存储文件的最大值 32G 。你需要通过一些办法释放掉表空间或者扩容表空间来解决问题。 一般当系统中大量使用分区表,而针对分区表清除数据,是不会释放表空间的,必须把分区 drop 掉,才会释放空间。 下面我们具体了解一下这三个命令: 一、delete 1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在re
最近有一个服务器升级的项目,得知用户需求是03服务器上的文件、DNS、DHCP要迁移到Server 2012上,文件服务器最重要的当然是保留权限的设置,DHCP和DNS服务器实现迁移相对来说很简单 于是我便模拟了以下环境先进行测试,项目完成之后再做总结 = = 环境介绍 DC 192.168.124.250 Migration 192.168.124.251(Server 2012 R2 Datacenter,将03的服务器迁移到此服务器) FDDS 192.168.124.252(Server 2003