自定製Linux微型系統

本節我們將通過編譯內核源碼來搭建一個自定製的微型Linux系統,並且配上一個busybox來實現一些最基本的內容,最後我們在這基礎上加上一個遠程登錄的功能。好了廢話不多說,下面我們就來開始介紹吧。

 

準備工作

1、在宿主機中安裝開發環境

[root@localhost ~]# yum -y groupinstall "Development tools" "Server Platform Development"
[root@localhost ~]# yum -y install "ncurses-devel"

2、在宿主服務器添加一塊磁盤,作爲微型Linux系統的主磁盤。

這裏我添加了一塊10G的磁盤/dev/sdb

首先創建2個分區(具體的操作過程這裏就不給了,講的實在太多了)

image

創建好之後對分區進行格式化

[root@localhost ~]# mke2fs -t ext4 /dev/sdb1
[root@localhost ~]# mke2fs -t ext4 /dev/sdb2

並創建掛載點進行掛載:在/mnt下創建boot和sysroot目錄

[root@localhost ~]# mount  /dev/sdb1 /mnt/boot
[root@localhost ~]# mount  /dev/sdb2 /mnt/sysroot

創建grub

[root@localhost ~]# grub-install  --root-directory=/mnt  /dev/sdb

創建grub配置文件

[root@localhost ~]# vim /mnt/boot/grub/grub.conf
timeout=5
default=0
title Linux 8
    root (hd0,0)
    kernel /bzImage ro root=/dev/sda2 init=/sbin/init

OK,環境就先準備這些。

 

編譯內核

首先要到網絡去下載內核源碼,這裏我用的是linux-3.13.6的版本進行編譯的

解壓內核源碼

[root@localhost ~]# tar xf linux-3.13.6.tar.xz -C /usr/src/

創建軟連接

[root@localhost src]# ln -sv linux-3.13.6/  linux
[root@localhost src]# cd linux/

配置內核模塊參數

[root@localhost linux]# make allnoconfig
[root@localhost linux]# make menuconfig

編譯內核模塊參數

先來一張整體的截圖

image

1、選擇64位內核

wps_clip_image-11183

2、General setup --> Local Version - append to kernel release --> 自定義版本號

刪除字符需要使用Ctrl+Backspace

image 

General setup --> System V IPC    進程間通信的

wps_clip_image-29529

3、支持動態裝卸載模塊

Enable loadable module support --> Module unloading

wps_clip_image-921        wps_clip_image-8817

4、支持使用塊層

Enable the block layer --> Block layer SG support v4

wps_clip_image-9425   wps_clip_image-22502

5、Processor類型和特性

Processor type and features

--> Processor family (Core2/newer Xeno) 處理器

--> Symetric muliti-processing support 對稱多處理器

--> Muliti-core scheduler support 多核調度支持

image

6、總線

Bus options(PCI etc.)

-->PCI support

wps_clip_image-28734

7、可支持文件類型和格式

Exectuable file formats /Emulations

--> Kernel support for ELF binaries 支持ELF格式

--> Kernel support for scripts starting with #! 支持以#!開頭的腳本格式

wps_clip_image-6787

8、網絡

Networking support

    -->Networking options

        -->TCP/IP networking

wps_clip_image-6883

9、驅動

Device Drivers

支持臨時掛載文件系統

Device Driver Options

-->Maintain a devtmpfs filesystem to mount at /dev

--> Automount devtmpfs at /dev,after the kernel mount... 並自動掛載

image 

硬盤相關

-->SCSI device support

    -->SCSI device support

        -->SCSI disk support

image

image

MTP相關

-->Fusion MPT device support

    -->Fusion MPT ScsiHost drivers for SPI

    -->Fusion MPT logging facility

image

image

 

USB接口配置

-->Input device support 鍵盤鼠標 

-->USB support

  -->xHCI HCD (USB3.0) support

  -->EHCI HCD (USB2.0) support

  -->OHCI HCD (USB1.1) support

  -->UHCI HCD (most Intel and VIA) support

-->Mouse interface 鼠標接口

-->Keyboards 鍵盤

-->Mice-->PS/2 mouse ps2的鼠標

image

wps_clip_image-6772

網卡驅動 (注意這裏一定要與自己的主機的環境一致,不然網卡無法驅動)

Device Drivers

    -->Network device support

        -->Network core driver support 網絡核心驅動支持

        -->Ethernet driver support 以太網驅動支持

image

image

10.文件系統

File systems

-->The Extended 4 (ext4) filesystem 支持ext4文件系統

 

好了可以進行編譯了

[root@localhost linux]#make –j  4

編譯好之後

[root@localhost linux]#cp arch/x86_64/boot/bzImage /mnt/boot

 


編譯安裝busybox

BusyBox 是將許多具有共性的小版本的UNIX工具結合到一個單一的可執行文件。這樣的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一個比較完善的環境,可以適用於任何小的嵌入式系統。

下面我們進行編譯安裝

[root@localhost ~]# tar xf busybox-1.22.1.tar.bz2

使用靜態編譯的模式,將依賴於glibc-static

[root@localhost ~]# yum -y install glibc-static,libcrypt
[root@localhost ~]# cd  busybox-1.22.1
[root@localhost busybox-1.22.1]# make menuconfig

只需要修改一項

BusyBox Settings

    Build BusyBox as a static binary (no shared libs) 編譯成爲一個靜態

clipboard

[root@localhost busybox-1.22.1]# make && make install

會生成一個_install目錄

將此目錄中的所有複製到/mnt/sysroot目錄中

cp -a * /mnt/sysroot

在/mnt/sysroot中創建根文件系統需要的一些目錄

[root@localhost sysroot]# mkdir /mnt/sysroot/{proc,sys,dev,home,boot,root,tmp,var,lib64,mnt,media,etc}

 

提供相應的配置文件

/mnt/sysroot/etc/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
devpts  /dev/pts devpts  defaults  0 0

 


 

/mnt/sysroot/etc/inittab   提供初始化腳本的指定,開啓僞終端的指定,定義ctrl+alt+del

::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 19200 tty1
::respawn:/sbin/getty 19200 tty2
::respawn:/sbin/getty 19200 tty3
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

 

/mnt/sysroot/etc/shells   提供安全的shell環境

/bin/sh
/bin/ash
/bin/tcsh
/bin/bash
/sbin/nologin

 

/mnt/sysroot/etc/rc.d/rc.sysinit      系統進一步初始化腳本

#!/bin/sh  
 #    
 echo -e "Welcome to MiniLinux"    
 echo "Remouting root filesystem"    
 mount -n -o remount,rw /dev/sda2  /    #創建遠程連接虛擬終端需要的pts文件夾    
 mkdir /dev/pts    #掛載fstab文件中的所有設備文件    
 mount -a    #創建設備文件    mdev -s
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network

[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost || hostname $HOSTNAME    主機名相關 
ifconfig eth0 172.16.106.254           配置網卡信息   
ifconfig lo 127.0.0.1
for i in /etc/rc.start/*            
do           
    $i start     
done

 

/mnt/sysroot/etc/passwd提供賬號

root:x:0:0::/root:/bin/sh

 

/mnt/sysroot/etc/shadow    提供密碼

openssl passwd -1 -salt `openssl rand -hex 4`    生成密碼

root:密碼:..........

 

/mnt/sysroot/etc/profile    環境變量

export PS1='[\u@\h \W]\$'   
export PATH='/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin'

以上步驟完成之後一個簡單的可以基於tty登錄的微型系統就OK了。

我們可以驗證一下:

image

 

 

提供遠程連接服務

在安裝之前提供相應的名稱解析庫

其中基於文件的名稱解析,所依賴的共享庫文件有

/lib64/libnss_files-2.12.so

/lib64/libnss_files.so.2

/usr/lib64/libnss3.so

/usr/lib64/libnsspem.so

/usr/lib64/libnsssysinit.so

/usr/lib64/libnssutil3.so


創建目錄並複製程序

# cp -a -d /lib64/libnss_files* /mnt/sysroot/lib64
# mkdir /mnt/sysroot/usr/lib64
# cp -a -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64
# cp -a -d /usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so /mnt/sysroot/usr/lib64

提供nsswitch.conf配置文件

# cp /etc/nsswitch.conf /mnt/sysroot/etc/
passwd:     files   
shadow:     files    
group:      files
#hosts:     db files nisplus nis dns   
hosts:      files dns

 

編譯安裝dropbear

安裝dropbear可以查看幫助文檔

less INSTALL

安裝步驟:

[root@localhost ~]# tar xf dropbear-2013.58.tar.bz2
[root@localhost ~]# cd dropbear-2013.58/

直接裝在MiniLinux

./configure

注:

默認安裝在/usr/local,可以自定義指定安裝後的目錄

如果需要配置在編譯之前可以修改安裝目錄下的options.h

make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

 

使用bincp.sh將dropbear相關命令移植到MiniLinux中

先提供bincp.sh的腳本

#!/bin/bash  
#    
target=/mnt/sysroot/

[ -d $target ] || mkdir $target

preCommand() {  
    if which $1 &> /dev/null; then    
    commandPath=`which --skip-alias $1`    
    return 0    
    else    
    echo "No such command."    
    return 1    
    fi    
}

commandCopy() {  
    commandDir=`dirname $1`    
    [ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}    
    [ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}    
}

libCopy() {  
    for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do    
    libDir=`dirname $lib`    
    [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}    
    [ -f ${target}${lib} ] || cp $lib ${target}${libDir}    
    done    
}

read -p "Plz enter a command: " command

until [ "$command" == 'quit' ]; do

  if preCommand $command ; then  
    commandCopy $commandPath    
    libCopy $commandPath    
  fi

  read -p "Plz enter a command: " command  
done

 

 

wps_clip_image-11198

 

dropbear的使用:啓動dropbear

選項:

    -d dsskeyfile

    -r rsakeyfile

    -F 在前臺運行

    -E 指定錯誤輸出位置爲標準錯誤輸出

    -s 禁止基於密碼的認證,只能基於密鑰的認證

    -P 指定pid文件位置,默認/var/run/dropbear.pid

    -p 指定家庭的地址和端口 [address:]port

    -h 查看幫助

dropbearkey命令:創建dropbear所需的密鑰文件

選項:

    -t 加密算法    dss、rsa

    -s 密碼長度

    -f 密鑰位置

    -h 查看幫助

注:密鑰權限默認爲600

創建目錄

# mkdir -p /mnt/sysroot/etc/dropbear    #dropbear的密鑰文件存放位置
# mkdir -p /mnt/sysroot/var/run    #pid文件所在的目錄

創建dss形式的密鑰文件

# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key

創建rsa形式的密鑰文件,指定密鑰長度爲2048

# dropbearkey -t rsa -s 2048 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key


 

好了這些完成之後我們的遠程接入功能也應該可以實現了。可以測試一下

image

image

image

image

image OK,登錄成功。

 

本節的內容就講到這裏,歡迎大家批評指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章