在前面的《Linux系統-小倒騰之Linux DIY定製裁剪(附帶簡單網絡功能)o_o(一)》博文中,我通過對一個Linux系統的裁剪,最終製作出來了一個帶有網絡功能的微型Linux系統;其實它就是由一個Kernel+根文件系統+外圍的一些模塊組成,將他們拼湊在一起而已,所以這些並不算什麼高大上的事情,最終沒目的還是爲了更加了解Linux!所以大家看標題應該知道,本文將會再次對Linux進行裁剪,並實現nginx與dropbear這兩個應用服務在我裁剪的Linux上面運行;下面我說一下實驗的大概步驟(實驗環境與上一次一樣):
1.準備Target使用的磁盤
2.對磁盤分區格式化,並掛載
3.對Target磁盤安裝grub程序
4.編譯內核(選擇一些必備的功能)提供bzImage
5.編譯busybox應用程序(下面介紹)提供busybox應用程序
6. 爲init提供配置文件
7.配置主機名和banner
8.基本測試
9.提供dropbear應用程序(另外一種SSH服務程序)
10.提供nginx應用程序
11.綜合測試
以上是本文博客實驗的大概步驟,其中前面的3步已經在《Linux系統-小倒騰之Linux DIY定製裁剪(附帶簡單網絡功能)o_o(一)》中演示過了,再此我就不再貼出步驟啦,我直接從第4步開始;9-11步我將放在下篇博文中進行;如果各位看官有問題,請留言,Thanks!
前提條件:
以下實驗中請提前安裝好各開發包組,否則編譯會報錯!
[root@station10 ~]# yum groupinstall -y "Development tools" [root@station10 ~]# yum groupinstall -y "Desktop Platform Development" [root@station10 ~]# yum groupinstall -y "Server Platform Development"
================編譯Linux kernel/提供bzImage================
1.解壓kernel源碼包
[root@station10 ~]# tar -xf linux-3.13.6.tar.xz -C /usr/src/ [root@station10 ~]# cd /usr/src/ [root@station10 src]# ln -sv linux-3.13.6 linux `linux' -> `linux-3.13.6' [root@station10 src]# cd linux [root@station10 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 # [root@station10 linux]# make menuconfig #→此命令執行後會會出現以下這些提示信息並馬上會彈出一個Kernel配置界面出來 [root@station10 linux]# make menuconfig HOSTCC scripts/kconfig/lxdialog/checklist.o HOSTCC scripts/kconfig/lxdialog/inputbox.o HOSTCC scripts/kconfig/lxdialog/menubox.o HOSTCC scripts/kconfig/lxdialog/textbox.o HOSTCC scripts/kconfig/lxdialog/util.o HOSTCC scripts/kconfig/lxdialog/yesno.o HOSTCC scripts/kconfig/mconf.o HOSTLD scripts/kconfig/mconf scripts/kconfig/mconf Kconfig
通過該配置文件我選擇了基本的一些功能(具體項請下載附件)
選定基本的項目後退出(系統提示會將選擇的這些項目保存到該路徑下的.config文件中)
2.cp該目錄下的.config文件到/root/到/root目錄下留作備份使
[root@station10 linux]# cp .config /root/config-3.13.6-x86_64
3.執行make bzImage,編譯開始
經過漫長的等待,編譯完成;將生成的內核文件拷貝至Target的boot分區(即/mnt/boot)
注意:在前一次的博文中我只做了兩個分區作爲Target的boot分區以及根分區,此次我將多分出一個區作爲swap分區
[root@station10 linux]# cp arch/x86_64/boot/bzImage /mnt/boot/
===============編譯busybox應用程序提供busybox應用程序===============
什麼是busybox?
BusyBox 是一個集成了一百多個最常用linux命令和工具的軟件。BusyBox 包含了一些簡單的工具,例如ls、cat和echo等等,還包含了一些更大、更復雜的工具,例如grep、find、mount以及telnet。有些人將 BusyBox 稱爲 Linux 工具裏的瑞士軍刀。簡單的說BusyBox就好像是個大工具箱,它集成壓縮了 Linux 的許多工具和命令,也包含了 Android 系統的自帶的shell。
BusyBox 將許多具有共性的小版本的UNIX工具結合到一個單一的可執行文件。這樣的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一個比較完善的環境,可以適用於任何小的或嵌入式系統。
下面就去動手操作一下吧
1.解壓獲取到的busybox壓縮包
[root@station10 ~]# tar -xf busybox-1.22.1.tar.bz2 -C /usr/src/ [root@station10 ~]# cd /usr/src/busybox-1.22.1/ [root@station10 busybox-1.22.1]#
2.執行make menuconfig(與內核編譯時相似,會出現一個配置界面)
由於它需要手動改變的項目很少,所以只需要按照以下步驟去做即可:
#Busybox Settings ---> ##General Configuration ---> ###[*] Build BusyBox as a static binary (no shared libs)
選擇此項,是將該應用程序編譯成靜態二進制格式程序,這就意味着它所依賴的庫文件不再以動態方式去鏈接,它也就沒有庫文件,因爲在編譯時直接就編譯到自身了,這樣就使得它的空間和性能得到很好的提升,故此這裏選擇該項.完成後退出
3.執行執行make
[root@station10 busybox-1.22.1]# make
OH! make命令執行過程中報錯了...
原因:上面在編譯busybox時選擇了靜態編譯模式;而在靜態編譯程序時就會用到glibc-static這個程序包,所以安裝上這個包即可順利通過(包位置在第二張系統盤內)
[root@station10 busybox-1.22.1]# yum install -y glibc-static #再一次make [root@station10 busybox-1.22.1]# make #完成後make install
OK!編譯完成後在當前目錄的_install目錄下就生成了一些文件
其中的三個目錄中就提供包含了一個Linux系統應有的絕大多數常用命令
4.移植busybox應用程序
#將busybox應用程序文件copy至Target的根目錄 [root@station10 busybox-1.22.1]# cp -a _install/* /mnt/sysroot/ [root@station10 busybox-1.22.1]# ls /mnt/sysroot/ bin linuxrc lost+found sbin usr #補全所需的其他目錄 [root@station10 busybox-1.22.1]# mkdir -p etc/rc.d var/{log,run} root home lib64 dev proc sys boot mnt media tmp srv usr/lib64 [root@station10 busybox-1.22.1]# cd /mnt/sysroot/ [root@station10 sysroot]# ls bin boot dev etc home lib64 lost+found media mnt proc root sbin srv sys tmp usr var bin linuxrc lost+found sbin usr [root@station10 sysroot]# rm -rf linuxrc [root@station10 sysroot]# ls sbin/ acpid fbsplash halt insmod loadkmap mkfs.ext2 poweroff start-stop-daemon udhcpc adjtimex fdisk hdparm ip logread mkfs.minix raidautorun sulogin vconfig arp findfs hwclock ipaddr losetup mkfs.vfat reboot swapoff watchdog blkid freeramdisk ifconfig iplink lsmod mkswap rmmod swapon zcip blockdev fsck ifdown iproute makedevs modinfo route switch_root bootchartd fsck.minix ifenslave iprule mdev modprobe runlevel sysctl depmod fstrim ifup iptunnel mkdosfs nameif setconsole syslogd devmem getty init klogd mke2fs pivot_root slattach tunctl [root@station10 sysroot]#
5.配置grub.conf引導文件
[root@station10 sysroot]# vim ../boot/grub/grub.conf default=0 timeout=2 title Larry Linux (1.0) root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init quiet [root@station10 sysroot]# sync
6.第一次嘗試啓動(Target的創建我在這裏就不說了請看上次博文第9步)
啓動時
啓動後
ok,busybox應用程序現在已經安裝完成,再進一步的去完它
====================爲定製Linux創建所需文件====================
1.爲init提供配置文件
(1)創建/etc/rc.sysinit文件
[root@station10 ~]# cd /mnt/sysroot/etc/ [root@station10 etc]# vim rc.d/rc.sysinit #!/bin/sh # #歡迎短語 echo -e "\tWelcome to \033[34mLarry\033[0m Linux" #判斷、設置主機名 [ -r /etc/sysconfig/network ] && source /etc/sysconfig/network [ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost /bin/hostname $HOSTNAME #設置命令提示符 str=$"(Repair filesystem)" PS1="$str \# # "; export PS1 #掛載僞文件系統 mount -t proc proc /proc mount -t sysfs sysfs /sys mdev -s #虛擬終端所需目錄 mkdir /dev/pts #在grub中根是隻讀的,將其重新掛載爲讀寫 mount -o remount,rw / #設置IP,實現初始化系統時配置上IP地址 ifconfig lo 127.0.0.1 ifconfig eth0 172.16.41.200 mount -a [root@station10 etc]# chmod +x rc.d/rc.sysinit
(2)創建/etc/inittab文件,提供虛擬終端
[root@station10 etc]# vim 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
2.爲定製Linux系統提供passwd, group, shadow文件
#++++++++++++++++++++++++用戶帳號文件++++++++++++++++++++++++ [root@station10 ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash [root@station10 ~]# head -1 /etc/passwd > /mnt/sysroot/etc/passwd [root@station10 ~]# tail -1 /etc/passwd guomaoqiu:x:500:500::/home/guomaoqiu:/bin/bash [root@station10 ~]# tail -1 /etc/passwd >> /mnt/sysroot/etc/passwd [root@station10 ~]# tail /mnt/sysroot/etc/passwd root:x:0:0:root:/root:/bin/bash guomaoqiu:x:500:500::/home/guomaoqiu:/bin/bash [root@station10 ~]# #++++++++++++++++++++++++用戶組文件++++++++++++++++++++++++ [root@station10 ~]# head -1 /etc/group root:x:0: [root@station10 ~]# head -1 /etc/group > /mnt/sysroot/etc/group [root@station10 ~]# tail -1 /etc/group guomaoqiu:x:500: [root@station10 ~]# tail -1 /etc/group >> /mnt/sysroot/etc/group [root@station10 ~]# tail /mnt/sysroot/etc/group root:x:0: guomaoqiu:x:500: [root@station10 ~]# #++++++++++++++++++++++++用戶密碼文件++++++++++++++++++++++++ [root@station10 ~]# head -1 /etc/shadow root:$6$BjOvO9nU$D8yuO9WIByQTEoKlUyFeCx9DWrkWNWzmHg4uUvarpE47nrHheJlOUNeZl***7hmQjKHGX8fCOANfCXjUSyL31.:16161:0:99999:7::: [root@station10 ~]# head -1 /etc/shadow > /mnt/sysroot/etc/shadow [root@station10 ~]# tail -1 /etc/shadow guomaoqiu:$6$caU3ijAy$Mdb2bSG7km9mg4e5TwgJCkhnYMGcglXt4x90YBKwcLnq4Uw2iOBPBXIzvxY4Bz0Re3nBUYiAVaTlbnoqJEsHN/:16161:0:99999:7::: [root@station10 ~]# tail -1 /etc/shadow >> /mnt/sysroot/etc/shadow [root@station10 ~]# tail /mnt/sysroot/etc/shadow root:$6$BjOvO9nU$D8yuO9WIByQTEoKlUyFeCx9DWrkWNWzmHg4uUvarpE47nrHheJlOUNeZl***7hmQjKHGX8fCOANfCXjUSyL31.:16161:0:99999:7::: guomaoqiu:$6$caU3ijAy$Mdb2bSG7km9mg4e5TwgJCkhnYMGcglXt4x90YBKwcLnq4Uw2iOBPBXIzvxY4Bz0Re3nBUYiAVaTlbnoqJEsHN/:16161:0:99999:7::: [root@station10 ~]# #由於busybox對於sha512的加密沒有很好的兼容性,所以這裏才用md5的加密密碼去替換即可 [root@station10 ~]# openssl passwd -1 #用openssl命令生成 Password: Verifying - Password: $1$44JNhWzY$dvFrjxxOHgdA7O2Rz9c0Z0 [root@station10 ~]# vim /mnt/sysroot/etc/shadow root:$1$44JNhWzY$dvFrjxxOHgdA7O2Rz9c0Z0:16161:0:99999:7::: guomaoqiu:$1$44JNhWzY$dvFrjxxOHgdA7O2Rz9c0Z0:16161:0:99999:7::: [root@station10 ~]# chmod 400 /mnt/sysroot/etc/shadow
3.爲定製版Linux定義主機名文件
[root@station10 etc]# mkdir sysconfig [root@station10 etc]# vim sysconfig/network HOSTNAME=statino20.example.com [root@station10 etc]#
4.爲定製版Linux定義banner
[root@station10 etc]# vim issue Larry Linux Kernel \r on an \m [root@station10 etc]#
Ok!現在我嘗試啓動一下,
還是老規矩啦,掛起宿主機,開啓Target
Picture-1(登錄界面)
Picture-2(登錄後)
Picture-3(網絡信息)
Picture-4(普通用戶登錄嘗試)
OK! 至此一個定製版的Linux系統已經差不多搭建完成
接下來的內容我將完成從宿主機上面移植兩個應用程序到Target的實驗;有興趣的請關注下篇博客!