【轉】淺談編譯kernel+busybox構建擁有遠程ssh登錄和web功能最小linux系統(一)


轉自:http://www.178linux.com/8237

實驗環境win7+VM11.1

大致過程總攬

1,硬件准備以及查看硬件設備型號(不用擔心,這些都是VM虛擬出來的)

2,編譯環境的配置以及下載內核源碼以及編譯內核

3,編譯busybox,以及提供系統正常運行的配置文件,初步運行linux系統

4,編譯安裝dropbear提供ssh服務

5,安裝nginx;提供web服務

 

一,硬件准備以及查看硬件設備型號

QQ截圖20150919223845.pngQQ截圖20150919224439.png

由於編譯后的系統占用的空間很小,所以不需要多大的空間。

注意添加虛擬磁盤的時候,一定要選擇創建單個文件,不然之后你將這塊硬盤添加到另一個寄生機的時候,會不好選擇,如上右圖

 

硬件准備完畢。接下來查看參數

1
2
3
4
5
6
7
8
9
10
[root@mysql ~] # lspci
00:00.0 Host bridge: Intel Corporation 440BX /ZX/DX  - 82443BX /ZX/DX  Host bridge (rev 01)
00:01.0 PCI bridge: Intel Corporation 440BX /ZX/DX  - 82443BX /ZX/DX  AGP bridge (rev 01)
00:07.0 ISA bridge: Intel Corporation 82371AB /EB/MB  PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corporation 82371AB /EB/MB  PIIX4 IDE (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB /EB/MB  PIIX4 ACPI (rev 08)
00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)
00:0f.0 VGA compatible controller: VMware SVGA II Adapter
00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
00:11.0 PCI bridge: VMware PCI bridge (rev 02)

大概了解下就可以。我們只是走一下步驟。因為這是虛擬機,設備都是假的。但是在真實環境這一步還是很重要的。

分區格式化掛載以及安裝grub

 1,分區

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@mysql linux] # fdisk /dev/sdb
Command (m  for  help): n
Command action
    e   extended
    p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-130, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130): +200M  
Command (m  for  help): n
Command action
    e   extended
    p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (27-130, default 27): 
Using default value 27
Last cylinder, +cylinders or +size{K,M,G} (27-130, default 130): 
Using default value 130
Command (m  for  help): w
The partition table has been altered!

2,格式化

1
2
[root@mysql linux] # mke2fs -t ext4 /dev/sdb1 
[root@mysql linux] # mke2fs -t ext4 /dev/sdb2

3,創建掛載目錄並且掛載之創建目錄

1
2
3
4
5
[root@mysql linux] # mkdir -pv /mnt/{boot,sysroot}
mkdir : 已創建目錄  "/mnt/boot"
mkdir : 已創建目錄  "/mnt/sysroot"
[root@mysql linux] # mount /dev/sdb1 /mnt/boot/
[root@mysql linux] # mount /dev/sdb2 /mnt/sysroot/

4,安裝grub(grub2--轉者注)

1
2
3
4
5
6
7
8
9
10
[root@mysql linux] # 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

為了驗證我們bootloader是否安裝成功了對此檢驗一下

1
2
3
[root@mysql mnt] # cd /mnt/boot/
[root@mysql boot] # ls
grub  lost+found

可以得知已經安裝成功

 

 

二,編譯環境的配置以及下載內核源碼以及編譯內核

 1, yum安裝編譯環境

1
yum groupinstall -y  "Development Tools"

 2,為了防止在編譯安裝配置.config文件時無法啟用tui界面,同時也要安裝ncurses,以及ncurses-devel

1
  yum  install  -y ncurses ncurses-devel

 3,下載內核源碼包和解壓到/usr/src目錄並且通過軟連接的形式鏈接到linux

1
2
3
4
5
[root@mysql ~] # tar xf linux-3.13.6.tar.xz -C /usr/src/
[root@mysql ~] # cd /usr/src/
[root@mysql src] # ln -sv linux-3.13.6/ linux
"linux"  ->  "linux-3.13.6/"
[root@mysql src] # cd linux

 4,清空所有配置選擇,

1
2
3
4
5
6
7
8
9
10
11
[root@mysql linux] # make allnoconfig  
   HOSTCC  scripts /basic/fixdep
   HOSTCC  scripts /kconfig/conf .o
   SHIPPED scripts /kconfig/zconf .tab.c
   SHIPPED scripts /kconfig/zconf .lex.c
   SHIPPED scripts /kconfig/zconf . hash .c
   HOSTCC  scripts /kconfig/zconf .tab.o
   HOSTLD  scripts /kconfig/conf
scripts /kconfig/conf  --allnoconfig Kconfig
#
# configuration written to .config

 5,執行內核配置(注意,我們是直接將系統功能驅動都是直接編譯進內核的,所以,我們配置選項都是選擇*號)

1
[root@mysql linux] # make menuconfig

 

總體.png 

QQ截圖20150920103700.png

簡單介紹下我們用到的配置選項

1,第一項,此項設置該系統為64位的操作系統(此項必須選擇,如果編譯32位系統,那么庫文件可能出現不兼容的現象)

 

2,第二項,為通用設置選擇並且進入進行配置,配置方式如下

QQ截圖20150919234954.png

選項一表示自定義系統內核的名稱,(回車后就可以進入設置了,我定義了終結者的型號T800,你懂的)

選項二表示支持進程間通信。這個也是必須開啟的

 

3,第三項,為啟動加載模塊支持選項。進入並且選擇。相應選項。選項如下圖。

QQ截圖20150919235749.png

意思是支持模塊卸載以及強制卸載模塊(這里解釋一下,為什么要支持這個功能,我們明明都是將所有功能都直接配置到了內核為什么還要啟動這個模塊功能呢,答案是為了以后可以更好的擴展,假如有新的硬件添加進來呢,那我們豈不是有點難為自己了,又要重新編譯內核一遍。)

 

4,第四項,此項表示開啟塊設備支持,此項默認打開。其他版本的內核源碼默認沒有打開,需要自己打開。不然的話,無法支持塊存儲設備。比如我們接下來要設置的scsi接口的塊存儲設備。

 

5,第五項,此項表示選擇cpu的架構以及調整一些cpu的參數。

QQ截圖20150920001819.png

第一項是開啟對稱多處理器

第二項是cpu的型號選擇回車如下圖,表示cpu是英特爾酷睿系列的,當然了你要是amd的cpu就依靠自己了

第三項是第一項一旦開啟此項就會默認開啟,此項便是開啟多核心調度

QQ截圖20150920001901.png

6,第六項,總線支持的配置選擇並進入

QQ截圖20150920084521.png

 

這三項分別代表的意思是,開啟pci總線支持,開啟pci-e的支持。這個不要多做解釋,你懂的,我想。

 

7,第七項,表示默認可執行文件的格式。(這項很重要,不開啟那么就ELF二進制程序就不支持)

QQ截圖20150920084818.png

主要選擇這三項,如果選擇第一項,默認第二項會被選擇

解釋一下,第一項和第二項表示內核支持ELF二進制可執行程序,第三項,(這個很重要)這個表示支持以#!開頭腳本文件。其實就是shell腳本。沒有這個,你的腳本寫出來,內核無法理解。

 

8,第八項,表示網絡功能的開啟。這項是支持網絡功能的必備選項。linux系統最強大的功能之一網絡功能。這項也是非常重要的。空格鍵選中為*號,回車進入配置內核網絡功能。

QQ截圖20150920085828.png

第一項,是網絡功能的選項,等會進入進行設置,主要是開啟tcp/ip的支持。

第二項,這個無線網的支持,默認是開啟的,但是我們要把它關閉,因為咱們這個是虛擬機,沒有無線網卡,開啟這個選項,很增加編譯負擔,既然是最小化編譯,那么就應該只買合用的不買沒有的。

 

進入第一項的二級子目錄,開始配置tcp/ip的支持。

QQ截圖20150920101939.pngQQ截圖20150920102128.png

QQ截圖20150920102201.png

QQ截圖20150920110402.png

下面開始做一下簡介:

第一項,這是必須的,肯定要支持,tcp/ip networking

第二項,此項表示支持,開啟路由擴展支持

第三項,此項表示,是對路由擴展功能的設置,這里我們選擇的是,支持策略路由。

第四項,此項表示,在內核上支持,網絡屬性的自動配置,旗下有很多的子選項,可以看見,dhcp協議,bootp協議的支持等等。但是這項我們並不開啟,我只是做個簡單的介紹,我們可是動手能力非常強的攻城獅,為什么要autoconfig呢。本着,內核最小化的原則。所以還是不要選擇了。

第五項,此項表示支持,tcp syn的支持,

第六項,此項表示,去掉ipv6的支持。因為不需要支持ipv6、

第七項,此項表示,開啟基於UNIX域的進程通信。不同主機進程利用tcp/ip 來支持通信,而內部則是利用UNIX domain來實現。因為內部的進程通信如果還是基於tcp/ip 那么未必有點,二逼了,消耗系統資源不說,還降低了進程的通信的效率。

 

我們跳過第九項先來介紹第十項,為什么呢,因為前八項都是屬於,內核功能的配置,第九項屬於,硬件驅動的配置。我們還是歸一下類,容易區分和理解。

 

10,第十項,這是開啟內核對於文件系統的支持。

QQ截圖20150920105417.png

這里我們開啟對ext4文件系統的支持。

 

9,第九項,配置內核支持,各種硬件設備,選擇回車進入查看,配置相應的設備對應的驅動程序

 

1442719506505568.jpg1442719473183648.jpg

1442719395567697.jpg

分別進行介紹

第一項,通用設置進入后選擇如下選項,

QQ截圖20150920112656.png

選擇第一項表示,自動生成設備文件,在內核掛載根文件系統之后,同時掛載設備文件系統到/dev目錄下

 

第二項,表示支持,scsi設備的支持,進入后選擇

QQ截圖20150920113334.png

 

第三項,開啟對 FUSION MPT設備的支持,這主要是對scsi硬盤一些功能上的支持。

QQ截圖20150920113508.png

表示支持主機驅動的spi。以及啟用Fusion MPT logging facility"。MPT代表"Message Passing Technology"(消息傳遞技術)。Fusion驅動是由LSI Logic公司開發。MPT一種進程間使用的特定消息策略。

 

第四項,主要是網絡設備的支持。選擇進入,關閉wireless,只選擇以太網設備的驅動,選擇如下圖。

QQ截圖20150920114027.png

QQ截圖20150920114045.pngQQ截圖20150920114118.png

操作如圖,沒有什么好解釋的,默認配置不要動,只需要把這些貼出來的圖,你選中就可以了。

 

第五項,主要是輸入設備的設備配置,沒有什么好解釋的,直接上圖

QQ截圖20150920114813.png

 

第六項,主要是usb接口的設置,直接上圖。

QQ截圖20150920114916.png

QQ截圖20150920114936.pngQQ截圖20150920114948.png

到此內核編譯的配置過程已經ok了。

然后

1
[root@host linux] #make   bzImage     ##只編譯核心
1
2
3
4
5
6
7
8
[root@mysql linux] # cp arch/x86/boot/bzImage /mnt/boot/ #把內核拷貝到boot目錄下
[root@mysql ~] # cd /mnt/boot/grub/
[root@mysql grub] # vim grub.conf   ##配置grub.conf文件
timeout 5
default 0
title T800.1
root (hd0,0)
kernel  /bzImage  ro root= /dev/sda2

 

 

三,編譯busybox,以及提供系統正常運行的一些配置文件,初步運行linux系統

 

一,安裝配置編譯環境,這里需要glibc-static包的支持,還有libmcrpt-devel的支持,以及下載busybox解壓源碼包

    實施安裝過程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@mysql ~] # yum install -y libmcrypt-devel glibc-static
[root@mysql ~] # tar xf  busybox-1.21.1.tar.bz2 -C /usr/src/
[root@mysql ~] # cd !$/busybox-1.21.1/
[root@mysql  busybox] make  menuconfig  ##過程與內核是否有點相似。
Busybox Settings  --->
     Build Options  --->
         [*] Build BusyBox as a static binary (no shared libs)
#只要配置這一項就可以了,其他的都不要動。這個表示編譯成靜態可執行程序,
#簡單說就是不需要依賴系統上的#一些庫,因為我們是最小化的系統,
#這個系統很多庫文件是沒有的。如果不設置這個選項,依賴動態庫的話,這
#個程序很有可能因為系統上缺少某類庫而無法正常運行,甚至是不能運行。
[root@mysql busybox-1.21.1] # make && make install
--------------------------------------------------
You will probably need to  make  your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
#以上表示編譯成功
[root@mysql busybox-1.21.1] # cp -a -d _install/* /mnt/sysroot/
[root@mysql busybox-1.21.1] # cd !$
[root@mysql sysroot] # ls
bin  linuxrc  lost+found  sbin  usr
[root@mysql sysroot] # rm -f linuxrc 
#因為這是鏈接文件,在sbin目錄下,有個init文件同樣也是鏈接指向busybox的,
#所以這個不需要。我們只需要init就可以做系統啟動時所要的文件了。
[root@mysql sysroot] # mkdir -pv dev home lib64 media root sys boot  \
  etc/{rc.d,sysconfig} lib mnt proc var tmp                 
#創建系統所需的常用目錄。
[root@mysql grub] #vim grub.cfg              #開始測試一下busybox是否可用

set timeout=15
set default=0

menuentry 'Storm Platform'{
set root=(hd0,msdos2)
linux (hd0,msdos1)/bzImage rw root=/dev/sdc2 init=/sbin/init
}

[root@mysql grub] #sync;sync;sync;sync 
#同步文件到磁盤上,最好是同步后等個一兩秒,
#再執行如下圖操作不然磁盤損壞基本是要格式化這個分區然后重來一遍,你懂的。

QQ截圖20150920134330.png

掛起虛擬機,同時把宿主機的硬盤掛載到寄生機上,開啟。(這步驟就補貼圖了,很簡單和創建一個虛擬機的過程一樣,只不過在創建硬盤的時候,選擇已有硬盤就可以,不需要新建)初步效果圖如下,

QQ截圖20150920133643.png

看基本的命令都可以使用了,ls,ifconifg,等等常用命令都是可以的了。說明我們的busybox已經可以使用了,但是執行ifconfig的時候出現了一個錯誤,這是網絡設備在內核中沒有生成,后面我們會設置通過mdev -s來自動生成設備文件。

 

接下來進行一下簡單的系統配置,grub.conf,fstab,inittab,rc.d/rc.sysinit,

 

首先重新配置一下。grub.conf的文件初始化腳本去掉init這個選項,我們自己編寫了rc.sysinit初始化腳本程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@mysql etc] # vim /mnt/boot/grub/grub.conf 
timeout 5
default 0
title T800.1
root (hd0,0)
kernel  /bzImage  ro root= /dev/sda2      # 去掉init選項利用下面的rc.sysinit來初始化
 
[root@mysql etc] # vim fstab             ###配置開機掛載文件系統
/dev/sda2  / ext4 defaults 0 0
/dev/sda1  /boot  ext4 defaults 0 0
proc  /proc  proc defaults 0 0
sysfs  /sys  sysfs defaults 0 0
 
[root@mysql etc] # cat rc.d/rc.sysinit    ###配置開機初始化,腳本
#!/bin/bash
#
mount  -n -o remount,rw  /dev/sda2  /
mount  -a
mdev -s                                # 自動生成設備文件
[root@mysql etc] # chmod +x rc.d/rc.sysinit ###因為是開機初始化腳本程序,所以必須給與執行權限。
 
[root@mysql ~] # bash bincp.sh   ###這是一個腳本程序,這個程序的功能是復制可執行程序同時也會復制依賴
Plz enter a  command bash        ###的庫
Plz enter a  command : quit        ###這里表示移植bash程序。busybox里面是沒有bash的但是兼容bash,
###默認支持的是ash,所以bash還是要移植的。此腳本會在后面貼出來

為了檢驗一下使用環境有木有什么錯誤,那就來測試一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@mysql mnt] # chroot sysroot/
bash -4.1 # pwd 
/
bash -4.1 # ls
bin         dev         home        lib64       media       proc        sbin        tmp         var
boot        etc         lib         lost+found  mnt         root        sys         usr
bash -4.1 # ifconfig
ifconfig /proc/net/dev : No such  file  or directory
eth0      Link encap:Ethernet  HWaddr 00:0C:29:CF:89:47  
           inet addr:192.168.199.137  Bcast:192.168.199.255  Mask:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 
lo        Link encap:Local Loopback  
           inet addr:127.0.0.1  Mask:255.0.0.0
           UP LOOPBACK RUNNING  MTU:65536  Metric:1
 
bash -4.1 # exit
從以上測試來看,應該是沒有問題的。

好了,在掛起宿主機,開始測試系統運行情況。

QQ截圖20150920143855.png

到了這一步,我們已經完成了構建了一個可以運行的linux小系統了。而且可以支持網絡。

 

 

四 ,編譯安裝dropbear提供遠程ssh登錄方式。

一 ,實現ssh登錄的前提,你最起碼要支持本地登錄吧。所以首先得實現本地登錄。配置如下

你要有passwd,shadow,group這些關乎民生東西都沒有還登錄個毛線。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@mysql etc] # touch passwd shadow group
 
[root@mysql etc] # vim passwd
root:x:0:0:root: /root : /bin/bash             
mayershi:x:500:500:shisheng: /home/shisheng : /bin/bash
 
[root@mysql etc] # openssl passwd -1 -salt `openssl rand -hex 4`
Password: 
$1$70b57fe2$A6awWahj8sdzQtzdI7hhu. ###生成用戶密碼,基於md5加密的。
 
[root@mysql etc] # vim shadow
root:$1$70b57fe2$A6awWahj8sdzQtzdI7hhu.:16690:0:99999:7:::
mayershi:$1$70b57fe2$A6awWahj8sdzQtzdI7hhu.:16690:0:99999:7:::
 
[root@mysql etc] #chmod go= shadow
 
[root@mysql etc] # vi sysconfig/network #添加主機名
HOSTNAME=www #test#com           #####       #代表.
[root@mysql etc] # vi inittab        ####添加控制台程序,
::sysinit: /etc/rc .d /rc .sysinit
::respawn: /sbin/getty  19200 tty1     ####必須調用getty實現login登錄。
::respawn: /sbin/getty  19200 tty2  
::respawn: /sbin/getty  19200 tty3
::respawn: /sbin/getty  19200 tty4
::respawn: /sbin/getty  19200 tty5
::respawn: /sbin/getty  19200 tty6
::ctrlaltdel: /sbin/reboot
:: shutdown : /bin/umount  -a -r

詳情見下我下一篇博文

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM