主題隨身碟的設計與製作
2010.3.8
壹、自由數位學習總架構
一、重要原則
二、學習機構自由的數位學習簡易圖示:
數位學習資源庫: 自由課綱 自由課程計畫 自由課表 自由教材 自由素材 |
自 由 的 簡 易 網 管 |
自由的 可攜教材 |
行 動 學 具 |
自由的 數位學習介面(EzGo) |
三、重要關係
四、EzGo
五、簡易網管
貳、clone程式
一、程式列表
#!/bin/bash echo "請輸入來源隨身碟代號如 /dev/sdx :" read sdev echo "您要將系統複製到那一支隨身碟,請輸入目的地隨身碟代號如 /dev/sdy :" read dev echo "您輸入EzGo資料區的大小(單位千K,最少180):" read imgSize #dev="/dev/sdc" #sdev="/dev/sdb" #imgSize="180" date dev_s=`sfdisk -s $dev` let "cyl=$dev_s*2" let "cyl=$cyl/16065" let "p1=$cyl-349" dd count=16065</dev/zero>$dev sfdisk -q -D -C $cyl -H 255 -S 63 $dev <<EOF ,$p1,c ,349,83,* EOF mkdosfs -F 32 -s 16 $dev'1' dd bs=1 count=420 skip=90 seek=90 if=$sdev'1' of=$dev'1' mkfs -t ext2 -I 128 -q $dev'2' cd /media umount disk mkdir disk2 mount $dev'2' disk2 grub-install --recheck --root-directory=disk2 $dev dd bs=1 count=446 if=$sdev of=$dev rm -frd disk2/lost+found cp -a /cdrom/boot/vmlinuz disk2/boot cp -a /cdrom/boot/initrd.gz disk2/boot cp -a /cdrom/boot/ttylinux disk2/boot cp -a /cdrom/boot/grub/grub.conf disk2/boot/grub cp -a /cdrom/boot/grub/menu.lst disk2/boot/grub cp -a /cdrom/casper disk2 umount disk2 rm -fr disk2 mkdir disk1 mount -o iocharset=utf8 $dev'1' disk1 dd if=/dev/zero of=disk1/.os.img bs=1024000 count=$imgSize mke2fs -F disk1/.os.img mkdir osimg mount -o loop disk1/.os.img osimg cp -a /home/ezgo7 osimg cp -a /home/www osimg cp -a /home/mysql osimg umount osimg rm -fr osimg cp -dR --preserve=timestamps /mnt/PhET disk1 cp -dR --preserve=timestamps /mnt/Autorun.inf disk1 cp -dR --preserve=timestamps /mnt/Programs disk1 cp -dR --preserve=timestamps /mnt/dataCommon disk1 mkdir /mnt/Data umount disk1 rm -fr disk1 date
二、講解
三、dd
區段數目及位元組可以加上以下的單位:xM=M,c=1,w=2,b=512,kB=1000,K=1024,MB=1000000,M=1048576,GB=1000*1000*1000,G=1024*1024*1024,還有 T/P/E/Z/Y 如此類推。
每個轉換關鍵字可以是:
每個輸入輸出旗標可以是:
用 dd 分割還原檔案,檔案DGJD,共 98336321 bytes:
dd if=dgjd of=zz1 bs=1 count=20000000 dd if=dgjd of=zz2 bs=1 count=20000000 skip=20000000 dd if=dgjd of=zz3 bs=1 count=20000000 skip=40000000 dd if=dgjd of=zz4 bs=1 count=20000000 skip=60000000 dd if=dgjd of=zz5 bs=1 count=18336321 skip=80000000 還原 dd if=zz1 of=xdgjd bs=1 count=20000000 dd if=zz2 of=xdgjd bs=1 count=20000000 seek=20000000 dd if=zz3 of=xdgjd bs=1 count=20000000 seek=40000000 dd if=zz4 of=xdgjd bs=1 count=20000000 seek=60000000 dd if=zz5 of=xdgjd bs=1 count=18336321 seek=80000000
四、sfdisk
(一)查詢 1.sfdisk -?或--help:顯示幫助 2.sfdisk -v或--version:顯示sfdisk版本 3.sfdisk -T或--list-types:顯示所有sfdisk能辨識的檔案系統ID 4.sfdisk -V或--verify 裝置:檢查分割表,回答 OK ,或 5.sfdisk -g或--show-geometry 裝置:裝置分割成多少 cyl,head,sec(由kernel建議) 6.sfdisk -G或--show-pt-geometry 裝置:裝置分割成多少 cyl,head,sec(由分割表查得) 7.sfdisk -s或--show-size 裝置或分割:裝置或分割有多少 bytes 8.sfdisk -l或--list 裝置:裝置的諸分割列表 省略裝置或分割,即列出所有裝置的大小,並合計 9.sfdisk -d 裝置:裝置的諸分割列表, 10.sfdisk -x或--show-extend 分割:顯示擴展分區中的邏輯分區 11.sfdisk --print-id 裝置 幾:印出第幾分割的id 12.參數-uS or -uB or -uC or -uM:報告使用sectors或blocks或cylinders或megabytes為單位 (二)修改 1.sfdisk -c(或--change-id) 裝置 第幾分割 id:將裝置的第幾分割(數字,從1算起)的 id 設為指定值,如 sfdisk -c /dev/hdd 5 83:將裝置的第5分割的 id 設為 Linux 2.sfdisk 裝置 -N幾:改變第幾分割,如「sfdisk /dev/hdb -N5」然後回應「,,,*」,則除了將第五分割變bootable(active),其他什麼事也不做。 3.sfdisk 裝置 -A幾:第幾分割為active,其他分割為inactive (三)建立分割諸參數 -i 或--increment:開始磁柱由1開始而不是由0開始 -C 磁柱數 -H 磁頭數 -S 磁區數 -f 或--force:強行分割 -q 或--quiet:不秀出警告訊息 -L 或--Linux:與 Linux 相配合的分割方法。 -D 或--DOS:與 DOS 相容,會浪費一點空間。更精確地說:一個分割如果不能包含 sector 0,因它是此裝置的 MBR,或是包含分割表的延伸分割,在此情況下 sfdisk 會由的下一磁區開始分割。然而此參數是讓分割開始跳到下一個軌,如果每軌有34個磁區,這樣就浪費了33個磁區了,就像某些 DOS 版本一樣。某些開機引導程序(如 OSBS 而不是 LILO 或 OS/2)也會放在這些閒置的空間。如果你有用到這樣的開機引導程序,可以使用本參數。 -E 或--DOS-extended:分割的開始磁區會在延伸分割起始磁柱稍微靠內一些(如有些版本的 DOS),而非在磁柱一開始的磁區(如 Linux)。事實上最好是讓 DOS 和 Linux 都解讀延伸分割開始於磁柱邊界。當然只有知道 DOS 怎麼認定這支碟畫分磁柱、磁頭、磁區的方法,才會知道磁柱的邊界在那裡。 --IBM 或--leave-last:不分配最後磁柱。某些 IBM 診斷程式會假定它可以保留最後磁柱供測試使用。如果您認為可能會跑這樣的程式,請用本參數告訴 sfdisk 不要分配最後磁柱。有時最後磁柱會包含一份「損毀磁區表」。 -n:不寫入。做完所有動作但不要寫入硬碟 -R:請 kernel 重讀分割表(讓控制IO執行 BLKRRPART)。當手動修改分割表時(如用 dd 還原備份的分割表),這是很有用的動作。如果 kernel 報告「device busy for revalidation (usage = 2)」(裝置正忙請重新確認),表示裝置上正被使用,請卸載分割或下達 swapoff 停用 swap 分割。 --no-reread:開始重分割之前 sfdisk 會檢查磁碟是否未卸載,是否為 swap 裝置,若是會拒絕繼續進行重分割。本參數會取消以上的測試。另一方面 -f 會讓 sfdisk 強行繼續重分割,即使本測試認為不可行。 -O 檔案:在重分割之前,將要被覆寫的磁區存到另一個檔案(最好放在另一個磁碟) -I 檔案:在檔案系統被 sfdisk 破壞之後,回復原有狀態,如果事進有用 -O 備份下來。 1.sfdisk /dev/hdd:互動輸入各分割數據之格式 sfdisk 的讀取格式為每分割佔一行,欄與欄以空白、逗點、分號間隔。分隔號可以接空白。開頭和結尾的空白會被忽略。數字可以用八進位、十進位、十六進位,預設為十進位。當一欄未出現或空白時,會使用預設值。兩個 可以省略,sfdisk 可以自動算出。 ID 為16進位但不加前置0x,或者用 E,S,L,X 四個字母表達, L (LINUX_NATIVE (83)) 是預設值, S 是 LINUX_SWAP (82),E 是 EXTENDED_PARTITION (5),X i是LINUX_EXTENDED (85)。 欄的預設值是第一個未分配的 sector/cylinder/... 欄的預設值是取最大空間 2.sfdisk /dev/hdd << Test.data:依 Test.data 內容指示進行分割 Test.data內容每行一分割,各欄可用「空白」或「,」或「;」隔開,依序為 開始磁柱、磁柱數、ID(16進位)、開機分割否(*)如: 開始磁柱,磁柱數,類型(16進位),開機分割否(*) 通常只需要 開始磁柱,磁柱,類型 甚或 ,磁柱,類型 空分割則輸入 ,0
五、多重開機選單
default=0 timeout=10 title EzGo7 root (hd0,1) kernel /boot/vmlinuz ro boot=casper debian-installer/local=zh_TW splash quiet -- initrd /boot/initrd.gz title ttylinux 9.0 root (hd0,1) kernel /boot/ttylinux/vmlinuz ro load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=8192 root=/dev/ram0 initrd /boot/ttylinux/filesys.gz
六、HERE Document(HEREDOC)
自<<HERE的次行開始到行首出現HERE為止,中間數行為長字串。HERE不一定要寫成 HERE,您可以用任何一個字串來替代。 HERE Document 中仍然可以進行變數代換。可用於perl、bash,PHP則用<<<。 常用於將多行指令送給一個command shell。參、EzGo的布署方式
EzGo 其實只是把整套作業系統,壓成一個 live 檔:system.squashfs。檔名可改,副檔名一定要叫 squashfs 。再配合開機前導程式,讓這一個 live 檔開機起來。
一、隨身碟EzGo
(一)母碟生子碟
(二)以企鵝龍量產
二、更新光碟EzGo版本
三、將 EzGo 解壓縮後布署到硬碟
root (hd1,n-1) kernel /vmlinuz rw root=/dev/sdxn splash quiet -- initrd /initrd.img