在linux下如何制作img的映像文件


看你想將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
我一直想做一個屬於自己的小型的linux,但從網上搜索所得結果都是打造放在軟盤中的linux,而且都是用lilo啟動。很不幸,本人的筆記本沒有軟驅,所以這些也不適合自己。干脆自己做一個可從光盤啟動並運行的linux。
二.Linux啟動簡介
系統加電后進入bios,隨后讀取硬盤的主引導記錄(MBR),然后調用另一個引導程序(grub或lilo)來加載內核和鏡像文件。加載內核后系統會把文件系統存放到ram中,然后系統運行。在這里我們使用grub來加載內核和鏡像文件。
三.編譯內核
我使用的linux 2.6 內核,詳細編譯內核方法可以從以下文章中得到,這里不再贅述。
http://hi.baidu.com/lianxi1ArrayArrayArray/blog/item/Array5c782111f75a212b8127b03.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/sh 
mount -o remount,rw / 
/bin/mount -a 
> /etc/mtab 
echo 
echo 
echo 
echo 
echo -en "\t\tWelcom to lxh Linux\\033][0;3Arraym\n" 
hostname LxhLinux
echo后面跟的都是系統可以自己作相應的修改.
busybox.conf是一個空文件.
其他文件的內容如下:
fstab 
/dev/fd0 / ext2 defaults 0 0 
none /proc proc defaults 0 0 
/dev/cdrom /mnt/cdrom udf,isoArray660 noauto,owner,kudzu,ro 0 0 
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0 
group 
root:0:root 
inittab 
::sysinit:/etc/init.d/rcS 
::askfirst:/bin/sh 
tty2::respawn:/bin/getty 38400 tty2 
tty3::respawn:/bin/getty 38400 tty3 
tty4::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 -a 
issue 
Baby Linux release 0.1 
motd 
mtab 
passwd 
root::0:0:root:/root:/bin/ash 
profile 
# /etc/profile: system-wide .profile file for the Bourne shells 
echo 
echo 
export PS1="[\u@\h \w]\$" 
echo "Done" 
alias ll=’ls -l’ 
alias du=’du -h’ 
alias df=’df -h’ 
alias rm=’rm -i’ 
echo

resolv.conf 
nameserver 1Array2.168.1.12 
shadow 
root1$$adltABArraySr/MSKqylIvSJT/:12705:0:ArrayArrayArrayArrayArray:7::: 
shadow- 
root1$DWU.tenP$B7ANiXoGoiZMwJR6Ih8810:12705:0:ArrayArrayArrayArrayArray:7:::
六.制作img映象文件
把上面的文件系統做成img映像文件,以便內核把它載入ram中
linux下有很多ram,我們用ram1,首先把ram1格式化成ext2文件系統
[root@gucuiwen babylinux]# mkfs.ext2 -m0 /dev/ram1
mke2fs 1.32 (0Array-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1024 inodes, 40Array6 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
1 block group
81Array2 blocks per group, 81Array2 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
讀入了 81Array2+0 個塊輸出了 81Array2+0 個塊
把生成的initrd.img拷到一個地方備用
七. 制作grub啟動光盤
首先下載grub安裝文件,我下的是0。Array6版的grub。
tar zxvf grub-0.Array5.tar.gz //解開grub
cd grub-0.Array5
./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
用grub打造屬於自己的光盤linux.rar
轉自:
http://hi.baidu.com/websfx/blog/item/6e16aa3e565277fb838b1353.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM