主題隨身碟的設計與製作

2010.3.8

壹、自由數位學習總架構

一、重要原則

  1. 大半學習機構的本質不是公司,不可能由收費來承擔費用,適合自由的數位學習方案。
  2. 以5%的費用,達到50%的效能。

二、學習機構自由的數位學習簡易圖示:

數位學習資源庫:
自由課綱
自由課程計畫
自由課表
自由教材
自由素材






自由的
可攜教材



自由的
數位學習介面(EzGo)

三、重要關係

  1. 行動學具的強固,可以降低網管成本,使學習機構簡易網管變得可行。
  2. EzGo中必須布好內容路徑,直接取用「可攜教材」及網路上的「數位學習資源庫」。

四、EzGo

  1. 定位為師生的標準數位學習介面。
  2. 為五大資源的合體:表單、桌面、AP套件組合、內容路徑、(如PhET)、多國語言。台灣負責多國語言中的英文和正體中文,再找海外的伙伴團隊,做好簡中、印尼文版本。
  3. 提供內容路徑的匯入功能。
  4. Live 檔最強固,可以簡化網管。
  5. Live USB、DVD、Live檔放置到硬碟、解開作業系統放硬碟,四位一體,取得一個皆有工具可以製作另外三個。
  6. 提供簡單的 Framework 和工具,讓人家可以容易調製客製化版本,或者製作懶人包。
  7. 將內建「問題回報」機制,讓使用者自動上傳bug及校調意見。
  8. 在 /opt 下放 tw_Get_Creative.swf ,使之合於預載 flash player 之授權條件。

五、簡易網管

  1. 不可能為每個學習者,都給一條對外網路,所以多使用者共用對外網路不可避免有網管課題出現。
  2. 網管很複雜,成本也很高,包含設備成本和人事成本。
  3. 無線的成本高於有線,人多的成本遠大於人少。
  4. 負載平衡,數條小的對外頻寬比等量大頻寬便宜很多,而且全部斷線的風險低。
  5. 防火牆(layer 3,4)。
  6. 入侵防禦系統(layer 7)。
  7. 帳號認證。
  8. 建置DMZ。
  9. 無線網路廣播。
  10. Apach、PHP、DNS、SMB、NTP、FTP、SSH、MySQL等服務的架設。
  11. NAS的布署。
  12. 資料的終極保存方案與備份方案。

貳、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

二、講解

  1. 注意:目的隨身碟各分割必須卸載。硬碟中如移植有 Live 檔,可能從硬碟開機。
  2. 變數:sdev:來源碟,dev:目的碟,imgSize:資料區大小,dev_s:隨身碟k數,p1:第1分割磁柱數。
  3. 用dd將第1磁柱清為0,以免干擾,並方便救援。
  4. 以 HERE Document(HEREDOC) 配合 sfdisk 分割目的隨身碟。注意參數D。
  5. 格式化第1分割,再用dd複製母碟第1分割啟動磁區的程式。
  6. 格式化第2分割,掛載第2分割。
  7. 以 grub-install 安裝多重開機選單。
  8. 用 dd 複製母碟分割表中的程式。
  9. 複製母碟中的 EzGo 作業系統核心 vmlinuz 。
  10. 複製母碟中的 EzGo 開機參數設定 initrd.gz 。
  11. 複製母碟中的 ttylinux 。
  12. 複製母碟中的多動開機選單 grub.conf,menu.lst 。
  13. 掛載第1分割,注意要指定字集。
  14. 用 dd 在第1分割中製造資料區 .os.img 。
  15. 格式化資料區,掛載資料區。
  16. 複製母碟中的 /home/ezgo7 、 /home/www 、 /home/mysql 到子碟資料區。
  17. 複製母碟中的 PhET 到子碟第1分割,自由教材。
  18. 複製母碟中的 Autorun.inf 到子碟第1分割。
  19. 複製母碟中的 Programs 到子碟第1分割,可攜程式。
  20. 複製母碟中的 dataCommon 到子碟第1分割,這是主題資料夾,會代代複製下去,目前放 autojava.bat 和 ezgo7_linux 。
  21. autojava.bat ,在人家的電腦 Windowa 中沒裝 jre 時使用,會找到隨身碟中的 jre ,並設定好執行路徑。
  22. 在子碟中造全新的 Data 資料夾,這是個人資料夾,每次母碟生子碟都會造一個新的空夾。
  23. 以 date 指令,顯示母碟生子碟的起迄時間。

三、dd


--help 顯示求助說明並離開
--version 顯示版本資訊並離開
可用諸選項
  1. if=檔案,取代標準輸入來讀入檔案。
  2. of=檔案,取代標準輸出來輸出檔案。
  3. bs=位元組,每區段多大,預設為512 bytes。影響count,skip,seek,強迫 ibs=<位元組> 及 obs=<位元組>。
  4. ibs=位元組,每次讀取指定的位元組。
  5. obs=位元組,每次寫入多少位元組。
  6. cbs=位元組,每次轉換指定的位元組。
  7. count=區段數,只複製指定區段數目的輸入資料。1M代表1024*1024,1MB代表1000*1000。1Mb不合法。
  8. skip=區段數,輸入跳過幾區段。
  9. seek=區段數,輸出跳過幾區段。
  10. status=noxfer,suppress transfer statistics。
  11. conv=關鍵字,根據以逗號分隔的關鍵字表示的方式來轉換檔案。
  12. iflag=旗標,根據以逗號分隔的旗標表示的方式來讀入檔案。
  13. oflag=旗標,根據以逗號分隔的旗標表示的方式來輸出檔案。

區段數目及位元組可以加上以下的單位: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 如此類推。

每個轉換關鍵字可以是:

  1. ascii ,由 EBCDIC 轉換至 ASCII
  2. ebcdic ,由 ASCII 轉換至 EBCDIC
  3. ibm ,由 ASCII 轉換至 alternate EBCDIC
  4. block ,將以 newline 作為結束字元的區段的 newline 換成空格,直至空格填滿 cbs(char,byte,sector) 表示的大小
  5. unblock,會將 cbs 大小的區段中所有結束的空格刪除,並轉換為一個 newline 字元
  6. lcase ,將大寫字元轉換為小寫
  7. nocreat,輸出檔不存在的話不會寫出結果
  8. excl ,如果輸出檔已經存在則作為失敗處理
  9. notrunc,不截斷輸出檔
  10. ucase ,將小寫字元轉換為大寫
  11. swab ,交換每一對輸入資料位元組
  12. noerror,讀取資料發生錯誤後仍然繼續
  13. sync ,將每個輸入資料區段以 NUL 字元填滿至 ibs 的大小;當配合 block 或 unblock 時,會以空格代替 NUL 字元填充
  14. fdatasy,真正將資料寫入磁碟後才結束程式
  15. fsync ,類似 fdatasync,並寫入元資料

每個輸入輸出旗標可以是:

  1. append ,附加模式(只有輸出時有意義)
  2. direct ,直接使用 I/O 處理資料
  3. dsync ,使用同步的 I/O 處理資料
  4. sync ,也是同步,而且使用描述(metadata)
  5. nonblock,使用non-blocking I/O
  6. nofollow,不遵循符號鏈接
  7. noctty ,不從檔案中指定控制終端

用 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

(一)母碟生子碟

  1. 用隨身碟開機。以下稱母碟。
  2. 打開終端機。
  3. 打「ls /dev/sd?」查出母碟是sd幾,如 /dev/sda。
  4. 插入要被複製 EzGo 進去的隨身碟。以下稱子碟。
  5. 卸載子碟,因為等一下要對其重分割並進行格式化。
  6. 再打「ls /dev/sd?」查出子碟是sd幾,如 /dev/sdb。
  7. 打「su root」回應 root 密碼,將身份調整為 root 。
  8. 打「./clone」
  9. 輸入來源碟(母碟)代碼,如「/dev/sda」,
  10. 輸入目的碟(子碟)代碼,如「/dev/sdb」,
  11. 輸入可寫資料區大小(單位千K),如「500」代表 500 MB。
  12. 一切自動化完成。

(二)以企鵝龍量產

二、更新光碟EzGo版本

  1. 找一剩餘空間大於7G的硬碟分割,在其中造一燒錄資料夾
  2. 其中放兩資料夾 casper 和 isolinux 。
  3. isolinux 資料夾照抄目前 EzGo 光碟的 isolinux 資料夾。
  4. casper 資料夾中,照抄目前 EzGo 光碟 casper 資料夾的vmlinuz1、initrd1.img。
  5. 將新版的 ***.squashfs (如 system.squashfs )放入 casper 資料夾中。
  6. 造 iso檔:以 root 身份執行 「mkisofs -l -R -J -V "光碟名稱" -hide-rr-moved -v -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o 輸出檔.iso 燒錄目錄」。
  7. 用 EzGo 中的燒錄軟體 Brasero 將iso檔燒成光碟。
  8. 不久將會把造 iso檔、燒光碟寫成腳本檔,放進隨身碟中。

三、將 EzGo 解壓縮後布署到硬碟

  1. 將硬碟第 n 分割格式化為 ext 格式。
  2. 變換身份為 root
  3. mount -o loop system.squashfs /mnt
  4. 掛載硬碟第 n 分割,例如掛載點為 /part 。
  5. 下「cp -a /mnt/* /part」將 system.squashfs 所有檔案複製到硬碟第 n 分割的掛載點上。
  6. 此分割 grub 的開機選項為:
        root (hd1,n-1)
        kernel /vmlinuz rw root=/dev/sdxn splash quiet --
        initrd /initrd.img
  1. 重開機後可將此解壓縮的 EzGo 將以校調,增刪軟體。
  2. 再以光碟或隨身碟重開機,掛載硬碟第n分割,以 root 身份執行「mksquashfs 掛載點 目的路徑/system.squashfs」即可得到客製版的 EzGo 。
  3. 不久將會把解壓縮和壓縮 Live 檔寫成腳本檔,放進隨身碟中。