Linux操作系统已成为当今服务器操作系统的主力了,也有越来越多的同志们对linux感性趣了,当然我也不例外,linux的功能很多很强大,但是对于不同的需求可能不需要那么完整的功能,同时linux很灵活,可以选择性的去定制适合需求的linux操作系统,那么今天我们就来自己定制一个小的linux操作系统来练练手。
自己DIY linux操作系统之前,你需要对linux操作系统有所理解并能熟练的使用,网上有很多关于linux的书籍及视频,可以去学习。
一、准备工作:a.理论基础
b.软硬件平台
1.理论基础
a.linux 的启动流程,这是必须要了解的,因为我们是按照启动流程来模拟定制操作系统的,启动流程分几步:
1.加在BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动的设备
2.读取并执行第一个启动设备内的MBR的boot Loader(grub,spfdisk等程序,很重要)
3.依据boot loader的设置加载Kernel,Kernel会开始检测硬件和加载驱动(内核是可以自己定制的,后面会讲到)
4.在硬件驱动加载成功后,Kernel会主动去调用init进程,而init会获取run-level信息
5.init执行/etc/rc.d/rc.sysinit文件来准备软件执行的操作环境(我们可以选择性的将想要的功能实现添加进这个脚本里)
6.init执行run-level的各个服务的启动(脚本形式)
7.init执行/etc/rc.d/rc.loacl文件(里面包含了一下用户自定义的开机启动项,类似windows)
8.init执行终端机模拟程序mingetty来启动login进程,最后就等待用户启动
启动流程就是这样,但是我们自己定制的操作系统可能没有这么强大所以并不是每个流程都会经过,可以后期随着自己的能力的增强去自己修改
b.要懂得如何去看脚本和编写脚本,这是必须的,不然后续的任务无法完成
2.软硬件平台
a.软件平台:你需要有一个完整的linux镜像,我们要模仿着做官方的操作系统做,我用的是rhel-server-5.4-i386-dvd.iso,网上可以下载的到,当然因为我的硬件有限,我使用的是虚拟机(vm)来完成各项操作
b.因为有了虚拟机,所以不用太考虑硬件的。
二、开始我们的DIY linux之旅至于上述不懂得可以去问问度娘,反正我是很喜欢度娘啦
1.需要新建两个虚拟机,其中一个不需要硬盘,以后作为测试用,另一个是一个完整的Linux 5.4 系统(我的是5.4的),不会安装虚拟机的去自己找找教程,安装完成之后要新添加一块硬盘(大概20个G),作为移植硬盘,移植到那个没有硬盘的虚拟机上做测试,在测试过程中可以使用vm的supend功能,可以省去很多的时间,同时还要注意在Server1上修改Server2硬盘的数据时记得要使用sync指令去同步到硬盘中
做完以上之后的截图下图:1-1,1-2(注Server1是配置机,Server2是验证主机就是开始那个没硬盘的主机)
1-1
1-2
2.Server1启动之后先对那块新硬盘进行分区、格式化和挂载,下面是我的磁盘情况
[root@localhost ~]# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1318 10482412+ 83 Linux
/dev/sda3 1319 1449 1052257+ 82 Linux swap / Solaris
Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
a. 其中/dev/sdb就是我们的那块新硬盘,先分区
使用fdisk /dev/sdb,将硬盘分一个100MB的作为boot分区,一个10G的作为根分区,一个1G的作为swap分区(注:swap的ID号为82,需要修改一下)
分区玩之后就是下面这个样子了 图2-1
保存退出并使用partprobe指令更新一下分区表
b. 格式化分区mkfs指令将/dev/sdb1和/dev/sdb2格式化为ext3文件系统
c. 挂载分区到mnt目录下,我建立了/mnt/boot和/mnt/sysroot
mount /dev/sdb1 /mnt/boot/
mount /dev/sdb2 /mnt/sysroot/
d.安装grub到新硬盘的boot分区下
grub-install --root-directory=/mnt/ /dev/sdb 注:这里一定要是硬盘而不是分区
e.将内核和小的驱动镜像考到新分区的boot目录
[root@localhost ~]# cp /boot/vmlinuz-
[root@localhost ~]# cp /boot/initrd-
f.对于小的驱动镜像我们还要做出一定的修改,不然会出错
[root@localhost ~]# cd /mnt/boot/
[root@localhost boot]# mkdir tmp
[root@localhost boot]# cp initrd-
[root@localhost boot]# cd tmp/
[root@localhost tmp]# zcat initrd-
11832 blocks
[root@localhost tmp]# ll
total 2605
drwx------ 2 root root 1024 Mar 16 15:34 bin
drwx------ 3 root root 1024 Mar 16 15:34 dev
drwx------ 2 root root 1024 Mar 16 15:34 etc
-rwx------ 1 root root 2703 Mar 16 15:34 init
-rw------- 1 root root 2644455 Mar 16 15:32 initrd-
drwx------ 3 root root 1024 Mar 16 15:34 lib
drwx------ 2 root root 1024 Mar 16 15:34 proc
lrwxrwxrwx 1 root root 3 Mar 16 15:34 sbin -> bin
drwx------ 2 root root 1024 Mar 16 15:34 sys
drwx------ 2 root root 1024 Mar 16 15:34 sysroot
[root@localhost tmp]# vim init
将93行禁用掉,这个是有关swap的使用,有可能在新主机上的使用有问题
[root@localhost tmp]# rm init
init initrd-
[root@localhost tmp]# rm initrd-
rm: remove regular file `initrd-
[root@localhost tmp]# find . |cpio -o -H newc --quiet |gzip -9 >initrd.gz
cpio: File ./initrd.gz grew, 2048000 new bytes not copied
[root@localhost tmp]# ll
total 4704
drwx------ 2 root root 1024 Mar 16 15:34 bin
drwx------ 3 root root 1024 Mar 16 15:34 dev
drwx------ 2 root root 1024 Mar 16 15:34 etc
-rwx------ 1 root root 2704 Mar 16 15:39 init
-rw-r--r-- 1 root root 4785507 Mar 16 15:40 initrd.gz
drwx------ 3 root root 1024 Mar 16 15:34 lib
drwx------ 2 root root 1024 Mar 16 15:34 proc
lrwxrwxrwx 1 root root 3 Mar 16 15:34 sbin -> bin
drwx------ 2 root root 1024 Mar 16 15:34 sys
drwx------ 2 root root 1024 Mar 16 15:34 sysroot
[root@localhost tmp]# cp initrd.gz ..
g.重建grub.conf
/****************************grub内容
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (
root (hd0,0)
kernel /vmlinuz-
initrd /initrd-
*************************************************/
上述是原有grub.conf的内容,我们只能用到部分现在不需要的我们可以注释掉,建成之后我们的grub.conf的内容如下:
default=0
timeout=5
#splashimage=(hd0,0)/grub/splash.xpm.gz 该项在后续过程中还可以启用
hiddenmenu
title Red Hat Enterprise Linux Server (
root (hd0,0)
kernel /vmlinuz-
h.移植init进程
首先仿照已有系统的目录结构,在新硬盘的根分区(/mnt/sysroot)下建立相应的目录,这一点很重要(最好是全部目录都建立)
bin,etc,lib,sbin,usr,var等等
[root@localhost sysroot]# cp /sbin/init ./sbin/
当然还要把相关的链接库移植到新的分区init进程需要一下链接库,可以使用ldd来查看需要的链接库,这个指令在后面会经常的用到
如果一个一个的移动会相当的费事,我这里写了一个小的脚本来帮助实现,对以后要使用的功能相当的实用,一下便是脚本的内容
[root@localhost ~]# sh fastmove.sh
Please input a command that you want to move :init
Please input a command that you want to move :
之后有关init的内容变迁移到我们的新系统中了,当然我们还可以把一下常用的指令都移过去,比如:ls、vi、grep、mkdir、cd、rm、useradd、reboot、halt等等
新建inittab文件
新建rc.sysinit
当然这里用到了bash,所以要通过fastmove脚本将其移植到新系统中
做到这里我就可以测试一下是否能够启动我们的新系统
I. 添加关机重启功能
在inittab文件下添加如下条目
l0:0:wait:/etc/rc.d/rc.shutdown
l6:6:wait:/etc/rc.d/rc.reboot
之后在rc.d目录下建立rc.shutdown文件和rc.reboot文件
rc.shutdown文件的内容为
rc.reboot文件的内容为
之后将文件权限加上可执行
chmod a+x /mnt/sysroot/etc/rc.d/rc.reboot
chmod a+x /mnt/sysroot/etc/rc.d/rc.shutdown
J.添加hostname
在rc.sysinit脚本中添加一下代码但是要在Set shell之前
#Set hostname
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [ -z $HOSTNAME ];then
/bin/hostname localhost
else
/bin/hostname $HOSTNAME
fi
添加/mnt/sysroot/etc/sysconfig/network文件,内容如下
NETWORKING=yes
HOSTNAME=cmq.com
K.自定义开机背景图片
这个要用到linux下得gimp软件进行图片处理,图片要求最好是分辨率640x480,16位 图片的扩展名为xpm.gz
我的yum配置好了,使用的yum源是光盘,我事先把光盘挂载到/mnt/cdrom目录下了,可以很方便的安装,我的yum配置文件如下
"/etc/yum.repos.d/rhel-debuginfo.repo"
[rhel-server]
name=Red Hat Enterprise Linux server
baseurl=file:///mnt/cdrom/Server
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
安装gimp
yum install gimp
先使用gimp软件将图片改成上述要求的xpm格式,然后使用gzip工具打包
将文件考入/mnt/boot/grub目录下我的文件名为linux.xpm.gz
最后修改/nmt/boot/grub/grub.conf
splashimage=(hd0,0)/grub/linux.xpm.gz
效果如下
(*^__^*) 嘻嘻……还不错吧
L.添加网络功能
添加网络功能需要加入相关的模块,网卡用的模块有pcnet32,它依赖与mii,开机加载模块需要相应的指令
lsmod | grep -i pcnet
modinfo name查看模块信息 可以看到模块的路径
rmmod name 卸载模块
ismod 查看所有模块
modprobe name 添加模块
insmod name 也可以添加模块
同时还要有网络管理命令来设置网络参数如service,ifconfig,ping,sysctl等,我们可以使用fastmove.sh来将指令移植到我们的新系统中
将模块移植到新的系统中
cp /lib/modules/
cp /lib/modules/
之后修改rc.sysinit文件,在set shell前加入
#Add net
/sbin/sysctl -p &>/dev/null
/sbin/insmod /lib/modules/mii.ko
/sbin/insmod /lib/modules/pcnet32.ko
/sbin/ifconfig eth0 192.168.101.250/24
/sbin/ifconfig lo 127.0.0.1/8
测试
Windows主机ping虚拟机
M.添加ftp服务器
首先确保你的Server1上有vsftpd,如果没有的话可以使用yum安装,我的Server1上有vsftpd程序,下面我们来进行移植
拷贝Server1系统的vsftpd的目录结构及配置文件到我们的新系统中去
[root@localhost ~]# mkdir /mnt/sysroot/etc/vsftpd
[root@localhost ~]# cp /etc/vsftpd/* /mnt/sysroot/etc/vsftpd/
[root@localhost ~]# ll /mnt/sysroot/etc/vsftpd/
total 36
-rw------- 1 root root 120 Mar 16 20:04 ftpusers
-rw------- 1 root root 120 Mar 16 20:04 ftpusers.rpmsave
-rw------- 1 root root 356 Mar 16 20:04 user_list
-rw------- 1 root root 356 Mar 16 20:04 user_list.rpmsave
-rw------- 1 root root 4579 Mar 16 20:04 vsftpd.conf
-rw------- 1 root root 4580 Mar 16 20:04 vsftpd.conf.rpmsave
-rwxr--r-- 1 root root 338 Mar 16 20:04 vsftpd_conf_migrate.sh
[root@localhost ~]#
用fastmove.sh将vsftpd指令拷贝到新的文件系统中
[root@localhost ~]# sh fastmove.sh
Please input a command that you want to move :vsftpd
拷贝相关用户账号passwd,shadow,group等文件到/mnt/sysroot/etc目录下
[root@localhost ~]# cp /etc/passwd /mnt/sysroot/etc/
[root@localhost ~]# cp /etc/group /mnt/sysroot/etc/
[root@localhost ~]# cp /etc/shadow /mnt/sysroot/etc/
拷贝文件/etc/nsswitch.conf 到新系统的相对目录下 /mnt/sysoot/etc
拷贝类库到新系统的相对目录下 cp -df /lib/libnss_compat* /mnt/sysroot/lib/
cp –df /lib/libnss_files* /mnt/sysroot/lib/
修改vsftpd.conf配置文件禁止掉下面两项
#pam_service_name=vsftpd 目前无法开启该功能
#userlist_enable=YES(原因是我们目前没有可用的账户)
建立/mnt/sysroot/var/log/xferlog日志文件或者禁用日志功能,在vsftpd.conf文件中可以修改在39行,可以注释掉
建立mkdir –p /mnt/sysroot/usr/share/empty目录
建立mkdir -p /mnt/sysroot/var/ftp/pub目录
上述的操作是经过错误后的改良版,并非一次成功,所以当遇到错误的时候根据提示修改就是了,没事问度娘
接下来就是测试工作
服务器启动ftp
在windows下以匿名方式登录
测试成功,当然也可以将vsftpd的启动服务加在rc.sysinit文件中,这样就可以不用每次都去启动了,我是成功了,接下来就看你了朋友,需要你有耐心的去调试
N.建立www服务器
经过我的测试,必须的让新系统的文件系统能够可写
所以我在rc.sysinit文件中加入了mount -o rw,remount /
第一步使用fastmove.sh 将httpd和lib移动到新系统中去
在新系统中建立相应的目录结构如/etc/httpd/,/var/log/httpd/并且将原有目录结构中的东西拷贝到新系统中
拷贝文件/etc/mime.types 到相同的目录结构
接下来就是启动了
本文转自 chenming421 51CTO博客,原文链接:http://blog.51cto.com/wnqcmq/1156222