一、使用如下命令獲取本機硬件信息:linux
# cat /proc/cpuinfo # cat /proc/meminfo # lspci -v
二、實驗目的nginx
此次實驗的目的是:藉助於宿主機(正常安裝CentOS6.5系統),在目標機上構建一個微型Linux系統,能提供基本的bash命令行接口,提供基本的網絡功能,提供用戶登陸接口和完成身份驗證,提供遠程鏈接功能,提供nginx功能。shell
三、實驗說明vim
(1)宿主機:正常安裝CentOS6.5系統(ip : 192.168.1.152)bash
把宿主機上的第二塊磁盤cl.vmdk做爲目標機上僅有的一塊磁盤。網絡
(2)目標機app
使用VMware建立目標機時,不建立新的磁盤,而是使用宿主機上的第二塊磁盤做爲目標機的惟一一塊磁盤。dom
注意:目標機只有一塊磁盤。socket
注意:記得在宿主機上進行的操做,必定要使用sync命令同步到對應磁盤上。ide
一、在宿主機的另外一塊磁盤/dev/sdb 上分區、格式化、掛載
(1)分區
/dev/sdb1 50M
/dev/sdb2 512M
(2)格式化
# mke2fs -t ext4 /dev/sdb1 # mke2fs -t ext4 /dev/sdb2
(3)掛載
# mkdir -pv /mnt/{boot,sysroot} # mount /dev/sdb1 /mnt/boot # mount /dev/sdb2 /mnt/sysroot
二、編譯內核
下載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命令行,相關的命令也有效
一、編譯安裝busybox
BusyBox介紹:
BusyBox 是一個集成了一百多個最經常使用linux命令和工具的軟件。BusyBox 包含了一些簡單的工具,例如ls、cat和echo等等,還包含了一些更大、更復雜的工具,例grep、find、mount以及telnet。有些人將 BusyBox 稱爲 Linux 工具裏的瑞士***。簡單的說BusyBox就好像是個大工具箱,它集成壓縮了 Linux 的許多工具和命令,也包含了 Android 系統的自帶的shell
其實,本質上就是給busybox程序建立軟連接,就能根據其軟連接名來調用對應軟連接名的命令,如建立軟連接ls -->busybox,就能使用軟連接名ls來正常使用ls命令。
(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
選定爲靜態編譯
(busybox沒有bash,而是ash ,可是兼容bash)
編譯安裝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
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
六、再次測試目標機系統是否能正常啓動
七、進一步爲目標機提供用戶登陸界面
爲目標機提供用戶登陸界面的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
測試:
(已有登陸界面了)
八、爲目標機提供用戶和帳號(能驗證用戶登陸)
(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
遇到的問題:在宿主機和目標機之間切換得太快了,在宿主機上修改的文件還沒同步到目標機上,就會出現如下這種問題。
解決方法:
只有一個解決方法,從新格式化該硬盤
(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)測試
(能顯示主機名,測試成功)
到此一個小型的Linux系統的基本功能已經基本實現的。
至於提供遠程鏈接和nginx功能,放在後續博文: http://hjqjk.blog.51cto.com/5970897/1545380