定製微型Linux系統

前言

一、使用如下命令獲取本機硬件信息:linux

# cat /proc/cpuinfo
# cat /proc/meminfo
# lspci -v


二、實驗目的nginx

此次實驗的目的是:藉助於宿主機(正常安裝CentOS6.5系統),在目標機上構建一個微型Linux系統,能提供基本的bash命令行接口,提供基本的網絡功能,提供用戶登陸接口和完成身份驗證,提供遠程鏈接功能,提供nginx功能。shell

三、實驗說明vim

1)宿主機:正常安裝CentOS6.5系統ip : 192.168.1.152bash

把宿主機上的第二塊磁盤cl.vmdk做爲目標機上僅有的一塊磁盤。網絡

wKiom1P7HWSwaKwuAAHieK5qHS0963.jpg

2)目標機app

wKiom1P7HYfwl4eiAAHe3bRtKwA827.jpg

使用VMware建立目標機時,不建立新的磁盤,而是使用宿主機上的第二塊磁盤做爲目標機的惟一一塊磁盤。dom

注意:目標機只有一塊磁盤。socket

1、提供一個基本的bash命令行接口

注意:記得在宿主機上進行的操做,必定要使用sync命令同步到對應磁盤上。ide

一、在宿主機的另外一塊磁盤/dev/sdb 上分區、格式化、掛載

(1)分區

/dev/sdb1    50M

/dev/sdb2    512M

wKioL1P7HuSCI27eAAJIzkmqWRE177.jpg


2)格式化

# mke2fs  -t ext4  /dev/sdb1
# mke2fs  -t ext4  /dev/sdb2


wKioL1P7HxCDZJlZAAE7kgNoZQM604.jpg


3)掛載

# mkdir  -pv  /mnt/{boot,sysroot}
# mount  /dev/sdb1  /mnt/boot
# mount  /dev/sdb2  /mnt/sysroot


wKiom1P7HgvTw-RvAAKlqLMP2zo045.jpg


二、編譯內核

下載Linux內核源代碼linux-3.13.6.tar.xz 並解壓到/usr/src 

# tar xf linux-3.13.6.tar.xz -C /usr/src


建立軟連接

# cd /usr/src
# ln -sv linux-3.13.6 linux
`linux' -> `linux-3.13.6'



內核的 allnoconfig 配置目標會把全部的內核選項都設置爲no(除了一些必須設爲yes的內核選項外),也就是把它們既不編譯進內核,也不編譯成模塊。

# cd linux
# make allnoconfig  #把全部非必選的內核選項都設置爲no



手動選擇內核編譯的配置

# make menuconfig


要手動勾選的內核選項
64-kit kernel  #必須跟宿主機的平臺保持一致
Ceneral setup  
    --> Local version - append to kernel release  #手動設定內核版本號
    --> System V IPC  #支持system V 風格的IPC(進程間通訊),可選也可忽略。
Enable loadable module support 
    --> Module unloading    #選擇支持動態卸載模塊
Enable the block layer
    --> Block layer SG support v4  #選擇支持使用塊層
Processor type and features
    --> Symmetric multi-processing support #支持對稱多處理器
    --> Processor family
        --> Core 2/newer Xeon   #選擇合適的CPU類型
    --> Multi-core scheduler suppor  #支持多核調度
Bus options (PCI etc.)
    --> PCI support  #選擇支持PCI總線
Executable file formats / Emulations #可執行文件格式或類型
    --> Kernel support for ELF binaries  #支持ELF格式
    --> Kernel support for scripts starting with #!  #支持#!開頭的腳本格式
Networking support  
    --> Networking options 
        --> TCP/IP networking   #支持網絡功能
        --> Unix domain sockets #選擇支持Unix domain sockets 協議(若是要在如下擴展nginx功能,這項必需)
Device Drivers
    --> Generic Driver Options  #選擇支持把內核探測設備生成的設備文件掛載到/dev目錄下
        --> Maintain a devtmpfs filesystem to mount at /dev
        --> Automount devtmpfs at /dev, after the kernel mounted the rootfs
    --> SCSI device support 
        --> SCSI device support
        --> SCSI disk support
    --> Fusion MPT device support
        --> Fusion MPT ScsiHost drivers for SPI
        --> Fusion MPT logging facility
    --> Network device support  #選擇網卡驅動
        --> Ethernet driver support
            --> Intel devices
                --> Intel(R) PRO/1000 Gigabit Ethernet support 
                --> Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support
    --> Input device support  #選擇支持輸入設備(鍵盤和鼠標)
        --> Mouse interface
        --> Keyboards
        --> Mice
    --> USB support  #選擇USB驅動
        --> xHCI HCD (USB 3.0) support
        --> EHCI HCD (USB 2.0) support
        --> OHCI HCD (USB 1.1) support
        --> UHCI HCD (most Intel and VIA) support
File systems
    --> The Extended 4 (ext4) filesystem #選擇ext4類型文件系統


編譯內核

# make -j 4



三、把宿主機上編譯生成的bzImage複製到目標機上

# cp arch/x86_64/boot/bzImage /mnt/boot
# sync  #使得操做同步到磁盤


四、給目標機安裝grub並提供grub配置文件

安裝grub

# grub-install --root-directory=/mnt /dev/sdb
# cd /mnt/boot
# ls
grub  lost+found



grub提供配置文件

[root@localhost boot]# cd grub/
[root@localhost grub]# vim grub.conf
timeout=10
default=0
title Customed Linux( 3.13.6 )
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 init=/sbin/init



五、爲目標機提供根文件系統

# cd /mnt/sysroot
# mkdir -pv bin sbin root home etc/init.d proc sys mnt media var tmp usr/{sbin,bin} lib64



六、在目標機sbin目錄下提供init腳本

#!/bin/bash
#
echo -e "Welcome to \033[34mCustomed\033[0m Linux"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
mount -n -t devtmpfs none /dev
mount -n -o remount,rw /dev/sdb2 /
/bin/bash
[root@localhost sbin]# chmod +x init  #賦予該腳本執行權限
[root@localhost sbin]# ll init 
-rwxr-xr-x 1 root root 198 Aug 20 02:47 init
[root@localhost sbin]# bash -n init  #檢查語法



七、使用bincp.sh腳本爲目標機提供一些命令

[root@localhost ~]# ./bincp.sh
Plz enter a command: mount
Plz enter a command: umount
Plz enter a command: ls
Plz enter a command: ps
Plz enter a command: kill
Plz enter a command: cat
Plz enter a command: bash
[root@localhost ~]# sync  #注意:操做完後必定要記得同步到磁盤上
[root@localhost ~]# chroot /mnt/sysroot  #切換根目錄來測試
bash-4.1# ls
bin  etc  homelib64  lost+found  media  mnt  proc  root  sbin  sys  tmp  usrvar
bash-4.1# exit
exit
[root@localhost ~]#



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



八、啓動目標機,進行初步測試

測試成功,在目標機上能正常打開bash命令行,相關的命令也有效

wKiom1P7JMrwIU5VAAIiKCizToE263.jpg

2、爲目標機系統提供登陸認證(使用busybox)

一、編譯安裝busybox

BusyBox介紹:

BusyBox 是一個集成了一百多個最經常使用linux命令和工具的軟件。BusyBox 包含了一些簡單的工具,例如lscatecho等等,還包含了一些更大、更復雜的工具,例grepfindmount以及telnet。有些人將 BusyBox 稱爲 Linux 工具裏的瑞士***。簡單的說BusyBox就好像是個大工具箱,它集成壓縮了 Linux 的許多工具和命令,也包含了 Android 系統的自帶的shell

其實,本質上就是給busybox程序建立軟連接,就能根據其軟連接名來調用對應軟連接名的命令,如建立軟連接ls -->busybox,就能使用軟連接名ls來正常使用ls命令。

wKioL1P7KwmCmKh3AAKIHMCompk364.jpg


1)安裝依賴包

# yum install glibc-static



2)下載、解壓busybox-1.22.1.tar.bz2

# tar xf busybox-1.22.1.tar.bz2



(3)編譯安裝busybox-1.22.1

# cd busybox-1.22.1
# make menuconfig

選定爲靜態編譯

wKiom1P7Kj2hpsI-AAKfWPq1IB4372.jpg


wKiom1P7KlPiO-dpAACEVEvp__E962.jpg

busybox沒有bash,而是ash ,可是兼容bash


wKiom1P7KmXxLW1MAAJsM8tdjIg014.jpg

 

編譯安裝busybox

[root@localhost busybox-1.22.1]# make 
[root@localhost busybox-1.22.1]# make install
[root@localhost busybox-1.22.1]# cd _install  #默認安裝在當前目錄的_install目錄下
[root@localhost _install]# ls
bin  linuxrc  sbin  usr



 wKiom1P7KpGhHc0XAAFW660MxNM190.jpg


2複製_install目錄下的全部文件到目標機根目錄下

[root@localhost sysroot]# ls 
bin  etc  homelib64   media  mnt  proc  root  sbin  sys  tmp  usrvar
[root@localhost sysroot]# rm * -rf  #清空sysroot目錄下的全部文件
[root@localhost _install]# cp -a * /mnt/sysroot
[root@localhost sysroot]# ls
bin  linuxrc  sbin  usr
[root@localhost sysroot]# rm linuxrc  #linuxrc連接沒用,可刪除
rm: remove symbolic link `linuxrc'? y



三、爲目標機的sbin/init提供配置文件 /mnt/sysroot/etc/inittab

只提供物理控制檯的inittab:
[root@localhost sysroot]# vim etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh  (「-」表示該shell爲 login shell。)
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r



四、提供系統初始化腳本

[root@localhost rc.d]# vim rc.sysinit  #在etc/rc.d/目錄中提供系統初始化腳本
#!/bin/sh
#
echo -e "Welcome to \033[43mCustomed\033[0m Linux"
echo "Remounting root filesystem"
mount -n -o remount,rw /dev/sda2 /   #以讀寫的方式從新掛載根文件系統
[root@localhost rc.d]# chmod +x rc.sysinit  #給予該腳本執行權限



五、提供掛載文件fstab

[root@localhost sysroot]# vim etc/fstab  #提供掛載文件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



六、再次測試目標機系統是否能正常啓動

wKiom1P7K0_jHk39AAHbFw1DIwg784.jpg

 


七、進一步爲目標機提供用戶登陸界面

爲目標機提供用戶登陸界面的inittab

::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 19200 tty1
::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



測試:

wKiom1P7LOKSPzHJAACcjC-z89Q885.jpg

(已有登陸界面了)


八、爲目標機提供用戶和帳號(能驗證用戶登陸)

1)使用openssl加密密碼

[root@localhost sysroot]# openssl passwd -1 -salt `openssl rand -hex 4`
Password: 
$1$f73e29d0$r.BamU/sKlQH9TmbT4j.e1



2)提供/etc/passwd文件

root:x:0:0::/root:/bin/sh   #busybox提供了sh,但沒有提供bash
hjq:x:500:500::/home/hjq:/bin/sh



3)提供對應的/etc/shadow文件

root:$1$f73e29d0$r.BamU/sKlQH9TmbT4j.e1:16250:0:99999:7:::
hjq:$1$f73e29d0$r.BamU/sKlQH9TmbT4j.e1:16250:0:99999:7:::
[root@localhost etc]# chmod go= shadow  #修改shadow文件的權限,只有管理員纔有權限
[root@localhost etc]# ll shadow
-rw------- 1 root root  117 Aug 20 18:27 shadow



4)提供/etc/group文件

root:x:0:
hjq:x:500


5)爲hjq用戶建立家目錄

[root@localhost sysroot]# mkdir /home/hjq



6)提供命令行提示符

[root@localhost sysroot]# vim etc/profile
export PS1='[\u@\h \W]\$'  (注意:這裏要用單引號,不能用雙引號)



7)提供主機名

[root@localhost sysroot]# mkdir etc/sysconfig
[root@localhost sysroot]# vim etc/sysconfig/network
HOSTNAME=www.hjq.com



8)從新修改系統初始化腳本

[root@localhost sysroot]# vim etc/rc.d/rc.sysinit 
#!/bin/sh
echo -e "Welcome to \033[43mCustomed\033[0m Linux"
echo "Remounting root filesystem"
mount -n -o remount,rw /dev/sda2 /
echo "Mounting all filesystem"
mount -a  #自動掛載/etc/fstab文件中定義的設備
echo "Creating dev file"
mdev -s  
[ -f /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && hostname localhost || hostname $HOSTNAME
[root@localhost etc]# sync


 

遇到的問題:在宿主機和目標機之間切換得太快了,在宿主機上修改的文件還沒同步到目標機上,就會出現如下這種問題。

wKioL1P7LqPSZoarAAGtTOGokkw475.jpg

解決方法:

只有一個解決方法,從新格式化該硬盤

(1)備份/mnt/sysroot目錄下的全部文件(使用cpio命令能儘量保證文件的權限等信息不變)

[root@localhost sysroot]# find . | cpio -o -H newc | gzip -9 > /root/sysroot.gz
4387 blocks



(2)卸載/dev/sdb2

[root@localhost ~]# umount /mnt/sysroot
umount: /mnt/sysroot: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[root@localhost ~]# fuser -km /mnt/sysroot  #停止正在此掛載點的進程
/mnt/sysroot:        45955c 45985c 45998c 46036c 46270c 46375c 46466c 46522c 46558c 46587c 46620c
[root@localhost ~]# umount /mnt/sysroot  #成功卸載



(3)從新格式化

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



4)從新掛載

[root@localhost ~]# mount /dev/sdb2 /mnt/sysroot
[root@localhost ~]# cd /mnt/sysroot
[root@localhost sysroot]# ls  #從新格式化後,分區上的原有數據全被清除了
lost+found



5)使用cpio命令從新恢復此前備份的文件

[root@localhost sysroot]# gunzip /root/sysroot.gz
[root@localhost sysroot]# cpio -i < /root/sysroot
4387 blocks
[root@localhost sysroot]# ls
bin  boot  dev  etc  home  lib64  lost+found  media  mnt  proc  root  sbin  sys  tmp  usr  var



(6)測試

wKiom1P7Li-Si0d0AAJbF3lp5UM638.jpg


wKiom1P7LgrgFvU-AABCF0q2i5o874.jpg

(能顯示主機名,測試成功)

到此一個小型的Linux系統的基本功能已經基本實現的。

至於提供遠程鏈接和nginx功能,放在後續博文:   http://hjqjk.blog.51cto.com/5970897/1545380

相關文章
相關標籤/搜索