kernel是內核,採用本身定製,最小化編譯。busybox是提供rootfs,至關於用戶空間。dropbear是提供遠程ssh服務的,至關於openssl,可是它是輕量級的。ngnix是在定製的系統上提供的web服務。html
環境:採用VMware虛擬機 linux
例如:查看cpu類型,不一樣的機器可能不一樣nginx
查看pci類型:web
一、下載內核源代碼,下載地址是 kernel.org。這裏使用的內核版本是 3.13.6shell
二、解壓內核文件並配置vim
tar xf linux-3.13.6.tar.xz -C /usr/src cd /usr/src ln -sv linux-3.13.6 linux cd linux make allnoconfig make menuconfig # 須要依賴ncusres-devel make
編譯完成。centos
在make menuconfig時選擇對應的選項,經常使用的以下:(都是直接編譯進內核)安全
選擇上面的選項編譯完成後,會在當前目錄下提供生成arch/x86/boot/bzImage內核映像壓縮文件,做用等同於系統中vmlinuz文件。bash
一、獲取busybox源碼包 這裏使用的版本是:busybox-1.22.1ssh
二、開始編譯
tar xf busybox-1.22.1.tar.bz2 cd busybox-1.22.1 make menuconfig make make install
對於make menuconfig的選項說明:
注意:在執行make時,可能會出現 以下錯誤:
/usr/bin/ld: cannot find -lcrypt collect2: ld returned 1 exit status make: *** [busybox_unstripped] Error 1
出現這個錯誤的緣由是由於在配置busybox的時候,一般配置爲靜態編譯,因此編譯後在最後的連接階段須要連接crypt的靜態庫文件(libcrypt.a),而非動態庫文件(libcrypt.so*),該庫文件由glibc提供,一般系統中只安裝了glibc,而沒有安裝glibc-static。
解決方法:
安裝glibc-static包 yum install glibc-static
安裝完成後,會在當前目錄下生成一個_install目錄,裏面文件以下,實際上就生成一個busybox二進制程序,其餘都是他的連接文件,主要的目的是模擬Linux的各類命令。可是咱們發現裏面,沒有bash,可是這裏sh兼容bash。
功能至關強大啊,就一個命令。看看這個文件的大小:
大體原理以下:
# 一、在虛擬機中添加塊新的磁盤(在VMware中模擬實現)。劃分2個主分區,大小分別爲50M、512M,並格式化。 # 二、建立模擬boot目錄和根文件系統,並掛載 mkdir /mnt/boot /mnt/sysroot -p mount /dev/sdb1 /mnt/boot mount /dev/sdb2 /mnt/sysroot # 三、提供內核文件以及對應的grub # 安裝grub grub-install --root-directory=/mnt /dev/sdb # 複製內核編譯完成的bzImage文件到 /mnt/boot目錄下: cp /usr/src/linux/arch/x86_64/boot/bzImage /mnt/boot/ # 提供grub的配置文件 # vim /mnt/grub/grub.conf,文件內容以下: # 這裏不須要initramfs,由於這裏內核能夠直接掛載根文件系統 timeout=3 default=0 title Mini Linux Cl5 root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init # 四、提供rootfs ############################################################################################### # 複製命令 cp -a /root/busybox-1.22.1/_install/* /mnt/sysroot/ # 建立必要的目錄 mkdir /mnt/sysroot/{root,boot,proc,sys,dev,usr,lib64} ################################################################################################# ################################################################################################## # 提供配置文件,busybox在執行init程序時須要配置文件inittab # vim /mnt/sysroot/etc/inittab ,內容以下: # init 程序會以inittab文件爲配置文件,格式以下: #讀取/etc/rc.d/rc.sysinit配置文件(在這裏是/mnt/sysroot/etc/rc.d/rc.sysinit) ::sysinit:/etc/rc.d/rc.sysinit # 開啓4個虛擬終端,執行getty命令,此命會調用login程序登錄,respawn是退出時從新執行login, # 因此此時須要進行用戶認證 ::respawn:/sbin/getty 19200 tty1 ::respawn:/sbin/getty 19200 tty2 ::respawn:/sbin/getty 19200 tty3 ::respawn:/sbin/getty 19200 tty4 # crtl +alt + del 鍵的做用 ::ctrlaltdel:/sbin/reboot # 設定關機時的動做,也比較關鍵。若是沒有這一項的話,會出現開機後, ## 新建立的文件的內容可能會改變 ::shutdown:/bin/umount -a -r ################################################################################################# ################################################################################################ # 提供用戶,密碼,組文件 # 密碼由 openssl passwd -1 -salt `openssl rand -hex 4` 生成 # cat /mnt/sysroot/etc/passwd root:x:0:0:root:/root:/bin/sh centos:x:500:500::/home/centos:/bin/sh # cat /mnt/sysroot/etc/shadow root:$1$8dadd7c5$r7vRrjpLnBzq08KXzy4mA0:16296:0:99999:7::: centos:$1$8dadd7c5$r7vRrjpLnBzq08KXzy4mA0:16307:0:99999:7::: # cat /mnt/sysroot/etc/group root:x:0: centos:x:500: ############################################################################################# ############################################################################################# # 提供/etc/rc.d/rc.sysinit(在這裏是/mnt/sysroot/etc/rc.d/rc.sysinit)文件, ## 文件內容以下: #!/bin/sh # echo -e "\033[31mWelcom Mini Linux\033[0m" mount -a # 此選項會去讀取文件/etc/fstab mdev -s # 是busybox提供的會自動掃描設備的命令 mount -n -o remount,rw /dev/sda2 / # 這一項比較重要,若是沒有這一項的話, ## 根文件系統是隻讀的 # 提供網卡地址 ifconfig lo 127.0.0.1 netmask 255.255.255.255 up ifconfig eth0 172.16.10.14 netmask 255.255.0.0 up # 若是編譯時沒有設置主機名,須要如下設置主機名 #[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network #[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && hostname localhost || hostname $HOSTNAME #####/etc/sysconfig/network文件內容以下: # HOSTNAME=www.clusteLinux.com echo -e "\033[31mEND\033[0m" ########################################################################################## ########################################################################################### # 建立fstab文件 /dev/sda2 / ext4 defaults 0 0 /dev/sda1 /boot ext4 defaults 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 ########################################################################################## ######################################################################################### # 用戶登陸時,會去讀取profile文件,在這裏能夠設置提示符等; # vim etc/profile 內容以下: export PS1=[\u@\h \W]$ #########################################################################################
結果:
dropbear: 更小環境下,提供簡單ssh遠程鏈接服務。相似於openssh工具,可是它更輕量級。安裝完dropbear後,會生成如下幾個命令:
dropbear:是dropbear的服務端,相似於sshd
dbclient:是dropbear的客戶端,相似於ssh
dropbearkey: 是祕鑰生成工具,相似於ssh-keygen
ropbearconvert:實現openssh和dropbear之間的祕鑰轉換
例如:dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear_rsa_host_key
scp:遠程複製工具
安裝配置dropbear
########一、安裝dropbear####################### # 下載dropbear軟件,這裏使用的版本是dropbear-2013.58.tar.bz2 # 開始安裝 tar xf dropbear-2013.58.tar.bz2 cd dropbear-2013.58 ./configure make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install # dropbear默認是安裝到/usr/local目錄下的。./configure完成後,會生成一個option.h的文件, ## 裏面定義了各類屬性。例如:/var/run/dropbear.pid,因此在對應煩人磁盤上的目錄要存在。 #####二、複製dropbear dbclient dropbearkey scp到對應的虛擬根文件系統下############ # 使用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 # 須要注意的是,scp命令須要單獨複製對應的命令和所依賴的庫,避免和系統中的scp衝突 #####################三、定義安全的shell########################## # vim /mnt/sysroot/etc/shells 內容以下,能夠添加信任的shell,必要的 /bin/sh #################四、移植nsswitch###################################### # 在使用ssh遠程工具鏈接的時候,用戶名的解析要藉助於nsswitch。 # bash的用戶名解析也是這種機制,因此若是要使用bash做爲默認shell的話,移植nsswitch是必要的 cp -a -d /lib64/libnss_files-2.12.so /lib64/libnss_files.so.2 /mnt/sysroot/lib64/ cp -a -d /usr/lib64/libnss3.so /usr/lib64/libnss_files.so /usr/lib64/libnsspem.so \ /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so /mnt/sysroot/usr/lib64/ ###############五、確保pid文件所在的目錄存在################################### mkdir /mnt/sysroot/var/run ###########################六、提供服務腳本#################### # vim /mnt/sysroot/etc/init.d/dropbear 內容以下: ##################################################################### #!/bin/sh # dbprog='/usr/local/sbin/dropbear' dbkeygen='/usr/local/bin/dropbearkey' dsskey='/etc/dropbear/dropbear_dss_host_key' rsakey='/etc/dropbear/dropbear_rsa_host_key' rsakeysize=2048 dbport=22 gendsskey() { if [ ! -f $dsskey ]; then echo "Generating dss key file." [ -d /etc/dropbear ] || mkdir /etc/dropbear $dbkeygen -t dss -f $dsskey fi } genrsakey() { if [ ! -f $rsakey ]; then echo "Generating rsa key file." [ -d /etc/dropbear ] || mkdir /etc/dropbear $dbkeygen -t rsa -s $rsakeysize -f $rsakey fi } start() { gendsskey genrsakey if ! pidof dropbear &> /dev/null; then echo "Starting dropbear" $dbprog -p $dbport retval=$? else echo "$dbprog is already running..." return 1 fi if [ $retval -eq 0 ]; then echo "OK" return 0 else echo "Failure" return 1 fi } stop() { if pidof dropbear &> /dev/null; then echo "stopping dropbear sucess..." killall dropbear retval=$? else echo "$dbprog is not running..." return 1 fi } restart() { stop sleep 1 start } usage() { echo "Usage: `basename $0` {start|stop|restart}" } case $1 in start) start ;; stop) stop ;; restart) restart ;; *) usage ;; esac ################################################################## chmod +x /mnt/sysroot/etc/init.d/dropbear ############七、提供devpts掛載文件系統並設置開機自啓動######################## # /mnt/sysroot/etc/rc.d/rc.sysinit 在這個文件中,在mdev -s 以後,mount -a以前,添加: # mdev -s mkdir /dev/pts # mount -a #######在/mnt/sysroot/etc/fstab中添加################################# devpts /dev/pts devpts defaults 0 0 ##################################################################### # 設置開機自啓動 for i in /etc/rc/S* ; do $i start done ##################################################################### mkdir /mnt/sysroot/etc/rc/ cd /mnt/sysroot/etc/rc/ ln -s ../../etc/init.d/dropbear ./S01dropbear #################################################################### #################八、設置環境變量######################### # 在 /mnt/sysroot/profile 文件中添加: export PATH=/bin:/sbin:/usr/bin:/usr/sbin
結果:
過程以下:
一、編譯,配置ngnix useradd nginx ./configure --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx \ --without-pcre --without-http_rewrite_module make && make install # 提供主頁面 echo "hello" > /usr/local/nginx/html/index.html 二、複製到虛擬根文件系統下 cp -a /etc/ngnix/ /mnt/sysroot/etc cp -a /usr/local/nginx/ /mnt/sysroot/usr/local/ 三、複製nginx所依賴的庫文件 #使用bincp.sh腳本完成,注意此時nginx要在PATH環境變量中 四、修改 /mnt/sysroot/etc/profile 文件,添加: export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/nginx/sbin/
在minilinix上添加ngnix用戶就能夠了,結果:
至此配置完畢。本文是本身的理解,若有偏離和錯誤,歡迎指正。