我們需要先在宿主機上添加一個磁盤,然后,把這個磁盤做好分區和文件系統:
fdisk /dev/sdb
創建第一個分區:
n
p
1
+512M
創建第二個分區:
n
p
2
+10G
保存退出:
w
為分區提供文件系統:
kpartx /dev/sdb
為分區提供文件系統:
mke2fs -t ext4 /dev/sdb1 mke2fs -t ext4 /dev/sdb2
為他們在宿主機上提供目錄掛載:
mkdir /mnt/boot mkdir /mnt/sysroot
把分區掛載上:
mount /dev/sdb1 /mnt/boot mount /dev/sdb2 /mnt/sysroot
然后,我們需要提供內核了,這時,我需要把內核進行手工編譯,這個編譯只是基于虛擬機上的硬件,日后需要編譯,要根據自己主機的硬件情況進行選擇驅動和功能模塊:
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
然后,我們會進入對內核的功能和驅動進行選擇:
(1)[*]64-bit kernel
(2)[*]Enable loadable module support
(3)-*-Eable the block layer
(4)Processsor type and features–>[*]Symmetric multi-processing support
[*]Multi-core scheduler support
Processor family(Core 2/newer Xeon)
(5)Bus options(PCI etc.)–>[*]PCI support
(6)Executable file formats / Emulations –> [*]Kernel support for ELF binaries
[*]Write ELF core dumps with partial segments
<*> Kernel support for scripts starting with #!
(7)-*-Networking support –> Networking options –> <*>Unix domain sockets (這個選項,我們過后啟動nginx需要)
[*] TCP/IP networking
(8)Device Drivers –> SCSI device support —>[*] SCSI device support
[*] SCSI target support
[*] SCSI disk support
[*] SCSI tape support
Generic Driver Options –> [*] Maintain a devtmpfs filesystem to mount at /dev
[*] Automount devtmpfs at /dev,after the kernel mounted the rootfs
[*]Fusion MPT device support –> <*> Fusion MPT ScsiHost drivers for SPI
<*> Fusion MPT ScsiHost drivers for FC
<*> Fusion MPT ScsiHost drivers for SAS
[*] Network devcie support —> [*] Network core driver support
[*]Ethernet driver support –> [*]Intel devcies
<*> 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 —> [*] Support for Host-side USB
<*> EHCI HCD (USB 2.0) support
<*> OHCI HCD (USB 1.1) support
<*>OHCI support for PCI-bus USB controllers
(9)File systems –> <*> The Extended 4 (ext4) filesystem
[*] Use ext4 for ext2/ext3 file systems
這些選項弄好之后,退出并把這些選項設置保存下來!
編譯壓縮內核:
make -j 4
把編譯好的內核放到移植的boot目錄下
cp arch/x86_64/boot/bzImage /mnt/boot/
好了,我們開始進行把移植的主機生成bootloder和grub
grub-install --root-directory=/mnt/ /dev/sdb cd /mnt/boot/grub/ vim grub.conf timeout=5 defaults=0 title bwei linux root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init :wq
為移植的系統提供需要的目錄:
cd /mnt/sysroot mkdir -p bin boot dev etc home lib64 media mnt proc root sbin sys usr
用busybox提供移植的系統init程序和個程序:
tar xf busybox-1.22.1.tar.bz2 -C /usr/src cd /usr/src/busybox-1.22.1 make menuconfig busybox settings --> Build Options --> [*]Bulid BusyBox as a static binary (no share libs) 然后我們保存設置選項! make -j 4 make install
安裝完成之后,我們把_install/中sbin bin usr目錄和目錄下的文件都復制到需要移植的系統的目錄下:
cp _install/sbin /mnt/sysroot cp _install /bin /mnt/sysroot cp _install/usr /mnt/sysroot
提供/etc下的目錄:
mkdir /mnt/sysroot/etc/rc.d mkdir /mnt/sysroot/etc/rc.start mkdir /mnt/sysroot/etc/init.d
提供inittab文件:
cd /mnt/sysroot/ vim etc/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 ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -r -a (getty終端程序會把login程序調用,然后,進行用戶名和密碼進行驗證) :wq
提供/etc/profile給移植系統提供環境變量:
vim etc/profile export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PS1='[\u@\h\W]\$' :wq
給移植的系統掛載文件系統的配置文件:
vim etc/fstab /dev/sda2 / ext4 defaults 1 1 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 devpts /dev/pts devpts defaults 0 0 /dev/sda1 /boot ext4 defaults 0 0 :wq
為移植系統提供主機名:
mkdir etc/sysconfig vim etc/sysconfig/network HOSTNAME=www.bwei.com
提供系統初始化的腳本:
vim etc/init.d/rc.sysinit #!/bin/bash echo -e "\033[35mbwei linux\033[00m" mount -n -o remount,rw /dev/sda2 / mdev -s mkdir /dev/pts mount -a [ -r /etc/sysconfig/network ] && source /etc/sysconfig/network [ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost hostname $HOSTNAME ifconfig eth0 172.16.100.2 netmask 255.255.255.0 up ifconfig lo 127.0.0.1 netmask 255.0.0.0 up for i in /etc/rc.start/S* do $i start done :wq
給登錄用戶提供passwd shadow group文件:
etc/passwd: root:x:0:0:root:/root:/bin/bash bwei:x:501:501:bwei:/home/bwei:/bin/bash nginx:x:498:498:nginx:/home/nginx:/bin/bash etc/shadow: (里面的密碼加密是用這個命令寫的:openssl passwd -salt `openssl rand -hex 8` -1 bwei) root:$1$15a442a4$.N192u6UQi6hAJDFC1RTp0:16674:0:99999:7::: bwei:$1$15a442a4$.N192u6UQi6hAJDFC1RTp0:16674:0:99999:7::: nginx:$1$15a442a4$.N192u6UQi6hAJDFC1RTp0:16674:0:99999:7::: etc/group: root:x:0: bwei:x:501: nginx:x:498:
由于login程序依賴于nsswitch庫文件,驗證用戶名,把庫文件復制一份到移植的系統上:
cp /lib64/libnss* lib64/ cp /usr/lib64/libnss* usr/lib64/
為用戶提供家目錄:
mkdir home/nginx mkdir home/bwei
我們需要使用一個程序移植腳本:
cp.sh腳本: #!/bin/bash read -p 'plz input a bin name:' bin binname=`which $bin` bincp() { [ ! -d /mnt/sysroot`dirname $binname` ] && mkdir -p /mnt/sysroot`dirname $binname` cp $binname /mnt/sysroot`dirname $binname` } libcp() { for i in `ldd $binname | grep -o '/[^[:space:]]\{1,\}'`;do [ ! -d /mnt/sysroot`dirname $i` ] && mkdir /mnt/sysroot`dirname $i` cp $i /mnt/sysroot`dirname $i` done } while true do bincp libcp read -p 'do you want to cp again:' bin if [ $bin == 'quit' -o $bin == 'q' ];then exit 0 fi done
我們用bash ~/cp.sh
bash
我們把bash移植過去.
然后,我們遠程登錄時,還要提供安全shell的配置文件:
vim etc/shells /bin/bash /bin/sh
我們開始編譯和安裝dropbear:
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編譯和安裝完成后,我們需要把他的生成的程序移植
使用上面的cp.sh的腳本來進行移植:
bash ~/cp.sh
dbclient
dropbearkey
dropbear
把上面三個程序都移植后,需要提供一個啟動dropbear的腳本:
vim /mnt/sysroot/etc/init.d/dropbear #!/bin/bash dbkeypath=/etc/dropbear dsskey() { [ ! -d $dbkeypath ] && mkdir $dbkeypath [ ! -f $dbkeypath/dropbear_dss_host_key ] && dropbearkey -t dss -f $dbkeypath/dropbear_dss_host_key } rsakey() { [ ! -d $dbkeypath ] && mkdir $dbkeypath [ ! -f $dbkeypath/dropbear_rsa_host_key ] && dropbearkey -t rsa -s 2048 -f $dbkeypath/dropbear_rsa_host_key } start() { dsskey rsakey pidof dropbear &> /dev/null if [ $? -eq 0 ];then echo "dropbear already start !!" else /usr/local/sbin/dropbear -p 22 if [ $? -ne 0 ];then echo "dropbear start false !!" else echo "dropbear is starting !!" fi fi } stop() { pidof dropbear &> /dev/null if [ $? -ne 0 ];then echo "dropbear alreay stop !!" esle killall dropbear if [ $? -ne 0 ];then echo "dropbear stop false !!" else echo "dropbear is stopping !!" fi fi } case "$1" in "start") start ;; "stop") stop ;; "restart") stop start ;; *) echo "plz input start|stop|restart" esac chmod +x /mnt/sysroot/init.d/dropbear cd /mnt/sysroot/rc.start
為該腳本提供鏈接啟動文件:
ln -sv ../init.d/dropbear ./S01dropbear
我們再來實現編譯和安裝nginx:
groupadd -r nginx useradd -r -g nginx nginx tar xf nginx-1.6.1.tar.gz cd nginx-1.6.1 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --without-prce --without-http_rewrite_module make make install
我們安裝后,先在自己的機子上進行測試,成功后,才進行移植:
/usr/local/nginx/sbin/nginx netstat -tnlp tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1681/nginx
我們看到這個記錄,證明我們的nginx成功開啟了,我們移植開始:
cp -a /usr/local/nginx /mnt/sysroot/usr/local
最后,我們可以為其提供腳本啟動的,這個腳本只要修改一下上面的dropbear腳本就可以了!
我們還可以對我們的做好的目錄一個備份,以免我們的我們的磁盤壞了,到時我們之前做的都沒有了:
cd /mnt/sysroot/ find . | cpio -H newc -o | gzip -9 -n > /root/sysroot.gz
當我們需要把這個解壓時,可以這樣做:
gunzip /root/sysroot.gz cpio -i < /root/sysroot
原創文章,作者:13-廣州-楊過,如若轉載,請注明出處:http://www.www58058.com/8255