歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 自制簡單的Linux

自制簡單的Linux

日期:2017/3/3 16:36:29   编辑:關於Linux

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-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的內容變遷移到我們的新系統中了,當然我們還可以把一下常用的指令都移過去,比如: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/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.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 到相同的目錄結構

接下來就是啟動了

然後在windows上進行測試

本文出自 “90後噭凊陽洸” 博客,請務必保留此出處http://wnqcmq.blog.51cto.com/5200614/1156222

Copyright © Linux教程網 All Rights Reserved