文章目錄
Linux作業系統下如何製作Image映像檔案http://os.51cto.com 2007-09-04 10:50 metallica 賽迪網 我要評論(0)
- 摘要:我一直想做一個屬於自己的小型的linux,但從網上搜尋所得結果都是打造放在磁碟片中的linux,而且都是用lilo啟動。很不幸,本人的筆記本沒有軟碟機,所以這些也不適合自己。乾脆自己做一個可從光碟片啟動並啟動並執行linux。
- 標籤:Linux Image 映像檔案 dd
◆一.為什麼要做這樣一個Linux
我一直想做一個屬於自己的小型的linux,但從網上搜尋所得結果都是打造放在磁碟片中的linux,而且都是用lilo啟動。很不幸,本人的筆記本沒有軟碟機,所以這些也不適合自己。乾脆自己做一個可從光碟片啟動並啟動並執行linux。
看你想將rh_linux.img做成什麼樣子。如果是檔案系統的話,那麼你需要這麼作:
dd if=/dev/zero of=rh_linux.img count=CONTS
參數count表示需要建立的檔案大小(以塊為單位,每塊大小為512位元組,如果rh_linux.img大小為1M,則CONTS=2000).
建立完成rh_linux.img以後,需要使用檔案系統工具(mkfs.ext2、mkfs.ext3、mkfs.jffs2等)格式化它(例如: mkfs.ext3 rh_linux.img);接下來使用:mount -o loop MDIR rh_linux.img將鏡象檔案掛載到目錄MDIR下,將boot.bin拷貝進去就可以了。
◆二.Linux啟動簡介
系統加電後進入bios,隨後讀取硬碟的主引導記錄(MBR),然後調用另一個引導程式(grub或lilo)來載入核心和鏡像檔案。載入核心後系統會把檔案系統存放到ram中,然後系統運行。在這裡我們使用grub來載入核心和鏡像檔案。
◆三.編譯核心
我使用的linux 2.6 核心,詳細編譯核心方法可以從以下文章中得到,這裡不再贅述。
http://hi.baidu.com/lianxi1999/blog/item/95c782111f75a212b8127b03.html
◆四.編譯busybox
busybox是一個整合了一百多個最常用linux命令和工具的軟體,我的理解就是用來產生linux下的常用命令的小程式。把編譯後的busybox程式放到我們的要做的系統中後,我們就能用一些linux下的常用命令了。
編譯busybox與編譯其他linux下的程式一樣,首先下載busybox,我用的是1.0版。
#tar xvfz busybox-1.00.tar.gz // 解開busybox
#cd busybox-1.00
#make menuconfig //配置busybox
下面是需要編譯進busybox的功能選項,其他的可以根據需要自己
General Configuration應該選的選項
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf
Build Options
Build BusyBox as a static binary (no shared libs)
這個選項是一定要選擇的,這樣才能把busybox編譯成靜態連結的可執行檔,運行時才獨立於其他函數庫.否則必需要其他庫檔案才能運行,在單一個linux核心不能使他正常工作.
Installation Options
Don't use /usr
這個選項也一定要選,否則make install 後busybox將安裝在原系統的/usr下,這將覆蓋掉系統原有的命令.選擇這個選項後,make install後會在busybox目錄下產生一個叫_install的目錄,裡面有busybox和指向他的連結.
其他選項都是一些linux基本命令選項,自己需要哪些命令就編譯進去,一般用預設的就可以了.
配置好後退出並儲存.
#make //編譯busybox
#make install //安裝busybox
編譯好後在busybox目錄下產生子目錄_install,裡面的內容:
bin
linuxrc -> bin/busybox
sbin
◆五.製作檔案系統
(這一步主要參http://blog.linuxmine.com/html/34/6534_itemid_861.html 謝謝GuCuiwen)
這是比較麻煩的一步,我弄了好久,看了挺多網上的文章,但總是不對。
建一個目錄rootfs 用來裝檔案系統
#mkdir etc usr var tmp proc home root dev //建立檔案目錄
其中etc,proc和dev是一定要建的,bin和sbin可以拷貝busybox產生的,其他的可以象徵性的建幾個就可以了.
拷貝busybox下的_install檔案夾到rootfs下
#cp -R busybox-1.00/_install/* rootfs/
在dev檔案夾下建立裝置檔案名稱:
#cd rootfs/dev
為了方便我們直接從原系統的/dev目錄下拷貝過來.一定要叫-r參數
#cp -R /dev/console ./
#cp -R /dev/null ./
#cp -R /dev/zero ./
...
其中,fd0,hda,ram,ram1,tty1,null,zero,loop1,fb0,fb,tty(這個GuCuiwen文章中沒有,但我覺得要加)等是必備的.
其它的hda,hda1,hdb等可以根據實際需要決定.但是上表中的選擇是比較合理的,即能滿足大部分的需要,
建立etc目錄下的設定檔
busybox.conf group inittab motd passwd resolv.conf shadow-
fstab init.d issue mtab profile shadow
其中init.d是一個目錄,從busybox-1.00原始碼目錄下拷貝過來.
#cp -R busybox-1.00/examples/bootflopyp/etc/init.d rootfs/etc/
把init.d拷過來後要更改其中的檔案rcS:
請確保這個檔案是可執行檔,否則請改成可執行檔:
#chmod u+x rcS
用記事本開啟rcS的內容:
#! /bin/shmount -o remount,rw //bin/mount -a>/etc/mtabechoechoechoechoecho -en "\t\tWelcom to lxh Linux\\033][0;39m\n"hostname LxhLinux |
echo後面跟的都是系統可以自己作相應的修改.
busybox.conf是一個空檔案.
其他檔案的內容如下:
fstab/dev/fd0 / ext2 defaults 0 0none /proc proc defaults 0 0/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0grouproot:0:rootinittab::sysinit:/etc/init.d/rcS::askfirst:/bin/shtty2::respawn:/bin/getty 38400 tty2tty3::respawn:/bin/getty 38400 tty3tty4::respawn:/bin/getty 38400 tty4# Stuff to do when restarting the init process::restart:/bin/init# Stuff to do before rebooting::ctrlaltdel:/bin/reboot::shutdown:/bin/umount -a -r::shutdown:/bin/swapoff -aissueBaby Linux release 0.1motdmtabpasswdroot::0:0:root:/root:/bin/ashprofile# /etc/profile: system-wide .profile file for the Bourne shellsechoechoexport PS1="[\u@\h \w]\$"echo "Done"alias ll='ls -l'alias du='du -h'alias df='df -h'alias rm='rm -i'echoresolv.confnameserver 192.168.1.12shadowroot1$$adltAB9Sr/MSKqylIvSJT/:12705:0:99999:7:::shadow-root1$DWU.tenP$B7ANiXoGoiZMwJR6Ih8810:12705:0:99999:7::: |
◆六.製作img映象檔案
把上面的檔案系統做成img映像檔案,以便核心把它載入ram中
linux下有很多ram,我們用ram1,首先把ram1格式化成ext2檔案系統
[root@gucuiwen babylinux]# mkfs.ext2 -m0 /dev/ram1
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1024 inodes, 4096 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
將ram1掛裝到檔案系統中:
先建立一個掛裝點:
#mkdir /mnt/ram
掛上ram1:
#mount /dev/ram1 /mnt/ram
將先前做好的rootfs根檔案系統拷貝到ram1上.
#cp –R rootfs/* /mnt/ram
拷貝好根檔案系統後卸載ram1:
#umount /dev/ram1
再用dd把這個ram1以映象方式取出來:
[root@gucuiwen babylinux]# dd if=/dev/ram1 of=initrd.img
讀入了 8192+0 個塊輸出了 8192+0 個塊
把產生的initrd.img拷到一個地方備用
◆七.製作grub啟動光碟片
首先下載grub安裝檔案,我下的是0。96版的grub。
tar zxvf grub-0.95.tar.gz //解開grub
cd grub-0.95
./configure
make
make install
好了,grub安裝完成。安裝完成後得到了最重要的stage2_eltorito 我們把它拷出來備用。
現在開始製作啟動光碟片:
mkdir iso ////建立iso檔案夾,我們把所要的檔案拷進這個檔案夾
mkdir -p iso/boot/grub
cp /stage2_eltorito所在的路徑/stage2_eltorito iso/boot/grub ////把stage2_eltorito檔案拷入grub檔案夾中
cp /boot/grub/menu.lst iso/boot/grub
cp /boot/grub/grub.conf iso/boot/grub
////把grub所用的開機檔案grub.conf,menu.lst 拷入grub檔案夾
下面我們更改menu.lst中的內容
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/hda1
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=1
timeout=10
title I love lxh ^_^ //顯示在選項上的標題
root (cd)
kernel /boot/grub/vmlinuz-2.6.20 ro root=/dev/ram0
initrd /boot/grub/initrd.img
要更改的內容我用紅色表示了,cd表示從光碟機啟動,/boot/grub/vmlinuz-2.6.20表示核心檔案vmlinuz-2.6.20在光碟片上存放的路徑,/dev/ram0表示根檔案目錄的位置,由於我們是從光碟片啟動,啟動時所有檔案系統都拷入了ram,所以這裡我們從ram0啟動。 /boot/grub/initrd.img是我們上一步我們做的鏡像檔案存放在光碟片的位置
◆八,整合,燒錄
下面我們把所製作的檔案全部整合在一起
iso-》boot -》grub -》grub.conf
iso-》boot -》grub -》menu.lst
iso-》boot -》grub -》stage2_eltorito
iso-》boot -》grub -》vmlinuz-2.6.20
iso-》boot -》grub -》initrd.img
vmlinuz-2.6.20,和 initrd.img可以不放在這裡,若更改了存放路徑則grub.conf中也要更改。
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o grub.iso iso
////這步的意思是把iso檔案夾中的內容做成一個鏡像,-b參數是表示做一個啟動盤 ,其他的東西我也不太明白,如果哪位高手知道-no-emul-boot -boot-load-size 4 -boot-info-table是什麼意思希望mail我。
好了,現在grub.iso就是你所需要的鏡像了,我們可以先放到虛擬機器的光碟機中看看它是不是能夠引導系統。如果不能仔細檢查沒一步。注意 grub.iso不能用winiso製作,原因好像是winiso做的iso檔案缺少了光碟片資訊。但我們可以用demotools載入grub.iso檔案,然後用全盤複製的方式燒錄一張光碟片linux。
◆九,這裡我們用grub來引導,用lilo是一樣的,只是設定檔不同而已,網上關於lilo的文章很多。
◆十:關於ram
製作過程中關於ram我很迷惑,現在我的理解是電腦把一部分記憶體類比成磁碟,所以我們可以對這部分記憶體進行格式化。這個格式化一個真正的磁碟是一樣的,但是由於這畢竟是虛擬,所以其中的資料掉電後就會消失。這部分記憶體就叫ram。
【責任編輯:絕對無奈 TEL:(010)68476606-8003】