动手制作简易功能Linux

简介:


Linux操作系统已成为当今服务器操作系统的主力了,也有越来越多的同志们对linux感性趣了,当然我也不例外,linux的功能很多很强大,但是对于不同的需求可能不需要那么完整的功能,同时linux很灵活,可以选择性的去定制适合需求的linux操作系统,那么今天我们就来自己定制一个小的linux操作系统来练练手。

自己DIY linux操作系统之前,你需要对linux操作系统有所理解并能熟练的使用,网上有很多关于linux的书籍及视频,可以去学习。

一、准备工作:a.理论基础

              b.软硬件平台

1.理论基础

a.linux 的启动流程,这是必须要了解的,因为我们是按照启动流程来模拟定制操作系统的,启动流程分几步:

1.加在BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动的设备

2.读取并执行第一个启动设备内的MBRboot Loadergrubspfdisk等程序,很重要)

3.依据boot loader的设置加载KernelKernel会开始检测硬件和加载驱动(内核是可以自己定制的,后面会讲到)

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的),不会安装虚拟机的去自己找找教程,安装完成之后要新添加一块硬盘(大概20G),作为移植硬盘,移植到那个没有硬盘的虚拟机上做测试,在测试过程中可以使用vmsupend功能,可以省去很多的时间,同时还要注意在Server1上修改Server2硬盘的数据时记得要使用sync指令去同步到硬盘中

       做完以上之后的截图下图:1-11-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分区(注:swapID号为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- 2.6.18 -164.el5 /mnt/boot/

[root@localhost ~]# cp /boot/initrd- 2.6.18 -164.el5.img /mnt/boot/

          f.对于小的驱动镜像我们还要做出一定的修改,不然会出错

[root@localhost ~]# cd /mnt/boot/

[root@localhost boot]# mkdir tmp      

[root@localhost boot]# cp initrd- 2.6.18 -164.el5.img ./tmp/

[root@localhost boot]# cd tmp/

[root@localhost tmp]# zcat initrd- 2.6.18 -164.el5.img | cpio -id

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- 2.6.18 -164.el5.img

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- 2.6.18 -164.el5.img

[root@localhost tmp]# rm initrd- 2.6.18 -164.el5.img

rm: remove regular file `initrd- 2.6.18 -164.el5.img'? y

[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 ( 2.6.18 -164.el5)

        root (hd0,0)

        kernel /vmlinuz- 2.6.18 -164.el5 ro root=LABEL=/ rhgb quiet

        initrd /initrd- 2.6.18 -164.el5.img

*************************************************/

上述是原有grub.conf的内容,我们只能用到部分现在不需要的我们可以注释掉,建成之后我们的grub.conf的内容如下:

default=0

timeout=5

#splashimage=(hd0,0)/grub/splash.xpm.gz  该项在后续过程中还可以启用

hiddenmenu

title Red Hat Enterprise Linux Server ( 2.6.18 -164.el5)

root (hd0,0)

kernel /vmlinuz- 2.6.18 -164.el5 rw root=/dev/sda2 rhgb quiet initrd /initrd.gz

 

 

 

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的内容变迁移到我们的新系统中了,当然我们还可以把一下常用的指令都移过去,比如:lsvigrepmkdircdrmuseraddreboothalt等等

 

 

新建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软件进行图片处理,图片要求最好是分辨率640x48016 图片的扩展名为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,ifconfigpingsysctl等,我们可以使用fastmove.sh来将指令移植到我们的新系统中

将模块移植到新的系统中

cp /lib/modules/ 2.6.18 -164.el5/kernel/drivers/net/mii.ko /lib/modules

 

cp /lib/modules/ 2.6.18 -164.el5/kernel/drivers/net/pcnet32.ko /mnt/sysroot/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.shvsftpd指令拷贝到新的文件系统中

[root@localhost ~]# sh fastmove.sh

Please input a command that you want to move :vsftpd

拷贝相关用户账号passwdshadowgroup等文件到/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 httpdlib移动到新系统中去

       在新系统中建立相应的目录结构如/etc/httpd/,/var/log/httpd/并且将原有目录结构中的东西拷贝到新系统中

       拷贝文件/etc/mime.types 到相同的目录结构

    接下来就是启动了

 

然后在windows上进行测试

 



本文转自 chenming421  51CTO博客,原文链接:http://blog.51cto.com/wnqcmq/1156222


相关文章
|
4月前
|
存储 网络协议 Ubuntu
【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能
UDP 是一种无连接的、不可靠的传输层协议,位于IP协议之上。它提供了最基本的数据传输服务,不保证数据包的顺序、可靠到达或无重复。与TCP(传输控制协议)相比,UDP具有较低的传输延迟,因为省去了建立连接和确认接收等过程,适用于对实时性要求较高、但能容忍一定数据丢失的场景,如在线视频、语音通话、DNS查询等。 链表 链表是一种动态数据结构,用于存储一系列元素(节点),每个节点包含数据字段和指向下一个节点的引用(指针)。链表分为单向链表、双向链表和循环链表等类型。与数组相比,链表在插入和删除操作上更为高效,因为它不需要移动元素,只需修改节点间的指针即可。但访问链表中的元素不如数组直接,通常需要从
254 2
|
4月前
|
Linux 数据可视化 开发者
|
2月前
|
存储 缓存 Linux
Linux文件系统的功能规划
【9月更文挑战第12天】本文通过类比图书馆,形象地解释了文件系统的组织形式和管理方法。首先,文件系统需按块存储文件,并设有索引区方便查找。其次,热点文件应有缓存层提高效率,文件需分类存储以便管理。最后,Linux内核需记录文件使用情况,通过文件描述符区分不同文件,确保文件操作准确无误。
|
3月前
|
Linux C++ Docker
【Azure 应用服务】App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)
【Azure 应用服务】App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)
|
3月前
|
网络协议 安全 Linux
在Linux中,内核主要功能及作用是什么?
在Linux中,内核主要功能及作用是什么?
|
4月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
186 1
|
4月前
|
负载均衡 Java Linux
黑马头条01,环境搭建,今日头条的介绍,今日头条的功能架构图,技术栈的说明,服务层,nacos(奶靠丝)安装,安装在Linux服务器上环境准备,
黑马头条01,环境搭建,今日头条的介绍,今日头条的功能架构图,技术栈的说明,服务层,nacos(奶靠丝)安装,安装在Linux服务器上环境准备,
|
5月前
|
Ubuntu 中间件 Linux
linux php添加扩展zip libzip ZipArchive功能
linux php添加扩展zip libzip ZipArchive功能
171 1
|
5月前
|
Web App开发 Linux 数据处理
深入理解Linux命令pkill:功能、原理与最佳实践
**pkill命令详解:在Linux中,pkill用于按进程名终止进程,简化了通过PID管理进程的步骤。它利用正则匹配支持模糊查找,可发送不同信号如SIGTERM或SIGKILL。常用示例包括:终止指定进程名、按用户或终端终止进程,以及使用-f进行模糊匹配。注意谨慎使用,避免误杀重要进程,先发送SIGTERM,无效再用SIGKILL。了解其权限需求和配合ps命令使用,能提升系统管理效率。**
|
5月前
|
Java Linux 网络安全
Linux常用50个命令分享:功能、示例与实用技巧
Linux常用50个命令分享:功能、示例与实用技巧