生活随笔
收集整理的這篇文章主要介紹了
制作微型linux
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
----更新:一個腳本可以一鍵制作這個小Linux,功能沒有寫的那么多,基本的開機可以了,見附件mklinux----
?
先簡述一下開機原理:
機器加電--bios讀取cmos設定--把控制權交給第一個開機裝置MBR,如如果第一個開機裝置MBR中沒有bootloader則交給第二個,依次類推--MBR中的bootloader程序根據在硬盤中的設置讀取內核與一個叫initrd的虛擬文件系統,因為現在的硬盤大都是SATA與SCSI的,內核中不集成這個驅動,通過加載Initrd這個虛擬的文件系統來加載SCSI的驅動,又有同學問了:為什么不把驅動做到內核中呢?這個是因為SCSI的驅動很多,做進去內核會很臃腫--畢竟是虛擬的文件系統,所以要切換到真實的文件系統上來,內核來完成根切換--完成根切換后內核把控制權交給init程序--init讀取/etc/inittab它的配置文件,根據配置文件完成初始化。通過看配置文件我們可知inittab完成這些工作1.默認開機級別 2.調用/etc/rc.d/rc.sysinit完成環境初始化 3.根據默認的開機級別啟動不同的服務腳本 /etc/rc.d/rc 這個腳本完成的任務 4.設定Ctrl+Alt+Del鍵的作用 5.設定電源UPS管理 6.調用/sbin/mingetty啟動6個終端 。6.如果是5級別的話啟動圖形界面。OK ?下面再來說說rc.sysinit完成的工作:1.初始化網絡,設定主機名 2.啟動SELinux 3.加密裝置 4.設置系統時鐘 5.加載驅動 6.啟動軟raid與LVM 7.啟用quota 8.可寫方式重新掛載/ 9.啟動日志 ? ? 基本原理就是這樣的
下面在vmware上來制作一個微型的Linux系統,能基于passwd認證,網絡可用,iptables可用,ssh可用,vi可用,其它的都舍去了,其實它就是一個tiny防火墻。
環境:vmware8.0 ?redhat5.8(宿主機) 內核2.6
一.為宿主機添加一塊2G大小scsi硬盤,開機。
這個我就不演示了。
二.在新建的硬盤上建立系統
1.對新建的硬盤分區
fdisk?/dev/sdb??????????????##這個是新加的那個硬盤?n?p?1?1?+50M?????????????????????????##新建一個分區為/boot分區?n?p?2?[回車]?+1G??????????????????????????##新建一個分區為/分區?w??????????????????????????????##保存? #?partprobe?/dev/sdb????##不用重啟機器,立馬分區生效?#?mke2fs?–j?/dev/sdb1?#?mke2fs?–j?/dev/sdb2??##格式化兩個分區?#?mkdir?–pv?/mnt/{boot,sysroot}???##建立兩個目錄,用于掛載sdb1,sdb2?#?mount?/dev/sdb1?/mnt/boot??#?mount?/dev/sdb2?/mnt/sysroot????##掛載它們??? 2.提供內核
#?cp?/boot/vmlinuz-`uname?-r`?/mnt/boot/vmlinuz-tiny????##用宿主機的內核? 3.提供Initrd這個用于切換根分區的文件,這個文件不同系統是不一樣的,下面我們修改原來的。
#?cp?/boot/initrd-`uname?-r`.img?/tmp/initrd.gz?#?cd?/tmp?#?gzip?–d?initrd.gz?????##解壓后type?initrd可知為cpio壓縮的,下面用cpio解壓?#?mkdir?init?#?cd?init?#?cpio?–ivcdu?<?../initrd?????##cpio解壓?#?vi?init?????##編輯它? #resume?LABEL=SWAP-sda3???##注釋這個swap分區,因為我們沒有啟用swap??mkrootdev?-t?ext3?-o?defaults,ro?/dev/sda2????##把我們新建的第二個分區將來當作根分區,看好是sda2 ##因為把這個磁盤放到新機器上它就是sda2? 保存,退出
#?find?.?|?cpio?–ovcB?|?gzip?–9?>?/mnt/boot/initrd-tiny? 3.為磁盤安裝grub,分兩個步驟,先安裝/boot/grub這個配置部分,再安裝MBR中的程序部分
#?grub-install?–root-directory=/mnt?/dev/sdb????##程序會到/mnt下找boot目錄,在boot下生成grub的配置目錄, ##/dev/sdb代表安裝到MBR中??#?ls?/mnt/boot?查看是否生成了grub目錄?,如果有則繼續? #?grub?>root?(hd1,0)/?????????##輸入?root?(hd1,0)/?按TAB查看有沒有剛才拷貝的vmlinuz-tiny,有的話繼續?>setup?(hd2)???????????##安裝到MBR中?為grub建立配置文件/mnt/boot/grub/grub.conf? #?vi?/mnt/boot/grub/grub.conf??default=0?timeout=3?title?A?Tiny?Linux??????root?(hd0,0)?????kernel?/vmlinuz-tiny?????initrd?/initrd-tiny? 到此grub安裝完畢
4.在/mnt/sysroot 下建立必備的目錄
#?mkdir?-pv?/mnt/sysroot/{root,sbin,bin,usr/{lib,sbin,bin},etc/rc.d,var,\proc,sys,tmp,dev,lib,home}? 5.移植init這個程序到/mnt/sysroot下
#?which?init????#可知Init在/sbin/下?#?ldd?/sbin/init?查看依賴的庫文件?? 把init與下面顯示的庫文件復制到相對應的位置
#?cp?/sbin/init?/mnt/sysroot/sbin/init?#?cp?/lib/libsepol.so.1?/mnt/sysroot/lib?#?cp?/lib/libselinux.so.1?/mnt/sysroot/lib?#?cp?lib/libc.so.6??/mnt/sysroot/lib?#?cp?/lib/libdl.so.2?/mnt/sysroot/lib?#?cp?/lib/ld-linux.so.2?/mnt/sysroot/lib?? 6.以同樣方式移植bash,方法同上,我就不寫了
7.有了這兩個程序,在添加如下配置文件系統就可以啟動了
#?vi?/mnt/sysroot/etc/inittab??id:3:initdefault:?si::sysinit:/etc/rc.d/rc.sysinit? #?vi?/etc/rc.d/rc.sysinit??#!/bin/bash?export?PATH=/bin:/sbin:/usr/bin:/usr/sbin?echo?"Welcome?to?Tiny?Linux"?/bin/bash? chmod?+x?/mnt/sysroot/etc/rc.d/rc.sysinit? 到此系統基本可以啟動了,下面測試
休眠宿主機,新建虛擬機,選擇磁盤時選已存在的磁盤,用剛才的磁盤
測試能否啟動到bash,如果能則繼續
三.添加一些命令,并支持密碼認證,hostname,并支持網絡
你是否發現copy命令與庫時很麻煩,下面提供個腳本cp.sh,用來copy命令與庫的,關閉tinylinux,打開宿主機繼續吧
#?vi?cp.sh??function?cpbin?{?????????if?which?$1?&>?/dev/null;?then??????????????????local?binpath=$(which?--skip-alias?$1)??????????else??????????????????return?10?????????fi???????????if?[?!?-d?/mnt/sysroot${binpath%/*}?];then??????????????????mkdir?-p?/mnt/sysroot${binpath%/*}?????????fi???????????if?[?!?-e?/mnt/sysroot/$binpath?];then?????????????????cp?$binpath?/mnt/sysroot/$binpath?????????else?????????????????return?11?????????fi???}??function?cplib?{?????????if?which?$1?&>/dev/null;then?????????????????local?binpath=$(which?--skip-alias?$1)?????????else?????????????????return?10?????????fi???????????modules=$(ldd?$binpath?|?grep?-o?'[^[:space:]]*/lib/[^[:space:]]\+')?????????for?I?in?$modules?????????do???????????????????[?!?-e?/mnt/sysroot$I?]&&?cp?$I?/mnt/sysroot/$I?????????done?}?while?:?;do?????????read?-p?"A?command?(q?to?exit):?"?cmd?????????if?[?$cmd?!=?"q"?];then?????????????????stat=?????????????????cpbin?$cmd?????????????????stat=$??????????????????if?[?$stat?==?"10"?]?;then?????????????????????????echo?"No?such?Command"?????????????????elif?[?$stat?==?"11"?];then?????????????????????????echo?"$cmd?have?been?existed?"?????????????????else?????????????????????????cplib?$cmd?????????????????fi?????????else????????????????break;?????????fi?done? 給個執行權限,就拷貝需要的命令吧!!
1.拷貝 ls mv cat cp ifconfig ping vi iptables mingetty login depmod modprobe hostname mount shudown reboot sync halt poweroff
#?sh?cp.sh?輸入以上命令即可? 2.修改/mnt/sysroot/etc/inittab 如下?
id:3:initdefault:?si::sysinit:/etc/rc.d/rc.sysinit?1:2345:respawn:/sbin/mingetty?tty1????????##就添加了幾個虛擬終端?2:2345:respawn:/sbin/mingetty?tty2?3:2345:respawn:/sbin/mingetty?tty3? init 調用mingetty來啟動虛擬終端,mingetty會調用login來讓用戶登陸,而login會調用pam接口來認證用戶的賬號密碼,pam對這個tinylinux來說,顯的太大了,于是我們用修改過的login程序直接調用/etc/passwd /etc/shadow 來認證吧,上面移植那個login是為了庫文件,修改過的login在附件中
4.下載login,copy到/mnt/sysroot/bin下,并給執行權限
#?chmod?+x?/mnt/syroot/bin/login? 5.建立/etc/passwd /etc/shadow ?/etc/group ,直接用系統上的吧
#?grep?^root?/etc/passwd?>?/mnt/sysroot/etc/passwd?#?grep?^root?/etc/group?>?/mnt/sysroot/etc/group?#?grep?^root?/etc/shadow?>?/mnt/sysroot/etc/shadow?#?chmod?400?/mnt/sysroot/etc/shadow? 或許你以為認證應該完了,其實login會調用/lib/libnss開頭的庫文件,把它們與它們的配置文件/etc/nsswitch.conf 移植過去
#?cp?/etc/nsswitch.conf?/mnt/sysroot/etc/?#?cp?/lib/libnss*?/mnt/sysroot/lib/? 6.一般內核編譯時網卡驅動被編譯成模塊,比如vmware需要的pcnet32模塊,所以我們要移植過去,當然還有它依賴的mii模塊。iptables需要的模塊有很多,我們不可能一個個的加載. # find /lib/modules/2.6.18-308.el5/kernel/ | grep netfilter ?發現netfilter的模塊的主要目錄,移植過去。
#?modinfo?pcnet32????##查看pcnet32的位置,及依賴模塊?#?modinfo?mii????##查看mii的位置,沒有依賴任何模塊? 移植它們
#?mkdir?-pv?/mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/ipv4??#?cp?/lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko?\/mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/??#?cp??/lib/modules/2.6.18-308.el5/kernel/drivers/net/mii.ko?\/mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/??#?cp?/lib/modules/2.6.18-308.el5/kernel/net/netfilter/???\/mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/??#?cp?/lib/modules/2.6.18-308.el5/kernel/net/ipv4/netfilter/?\/mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/ipv4/? #?chroot?/mnt/sysroot/?#?depmod??????????????##生成依賴關系以便modprobe加載? iptables 依賴/lib/iptables 下的模塊,移植過去
#?cp?/lib/iptables?/mnt/sysroot/lib/? 7.修改/mnt/sysroot/etc/rc.d/rc.sysinit,如下
#!/bin/bash??export?PATH=/bin:/sbin:/usr/bin:/usr/sbin?echo?"Welcome?to?Tiny?Linux"?modprobe?pcnet32?modprobe?iptable_filter?modprobe?iptable_nat?mount?-o?rw?/?ifconfig?eth0?172.16.1.2/16?hostname?www.laoguang.me?export?PS1='[\u@\h?\W]\$'? 休眠宿主機,啟動tinylinx,哇,需要驗證了,輸入你宿主機root的賬號密碼,登陸成功,這時ifconfig 你會發現eth0有ip了,世界立馬美好了好多。
8.移植/etc/sysctl.conf 并修改ip_forward的值
#?cp?/etc/sysctl.conf?/mnt/sysroot/etc/?#?vi?/mnt/sysroot/etc/sysctl.conf??net.ipv4.ip_forward?=?1? 開機測試
#?iptables?-A?INPUT -p?icmp?-j?DROP?? ping 一下別的主機測試
頭疼,移植Dropbear實現ssh有空再寫。。。。。。。。
轉載于:https://blog.51cto.com/laoguang/1061950
總結
以上是生活随笔為你收集整理的制作微型linux的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。