我们需要先在宿主机上添加一个磁盘,然后,把这个磁盘做好分区和文件系统:
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.178linux.com/8255