隨身碟版攜帶型Linux製作, casper-rw 解析__Linux

來源:互聯網
上載者:User

一直都在想,不管用誰的電腦,我都可以得到一個完全一致的工作環境,上面有我喜愛的軟體,有我儲存的重要資料,甚至瀏覽器的各種偏好都得一模一樣。現在的雲端運算技術可以部分解決這個問題,但是遠遠不夠。我的理想境界是,無論身處何地,一開機,看到的就是自己的電腦,或者相當於自己的電腦。自己可以任意處理自己的資料,不把隱私泄露給別人,當然也不要破壞人家已有的軟體環境。要實現該理想,有幾個辦法:

1. 隨時帶一個筆記本或者迷你筆記型電腦。到哪裡都用它。

2. 帶一個小小的隨身碟,裡面裝好作業系統和軟體,到哪裡都可以用它。

3. 只要有一個網路帳號,到哪裡都可以得到一個專屬於自己的安全的軟體環境(含作業系統和應用軟體,以及個人的資料)。

辦法1太麻煩,辦法3需要雲端運算技術的進一步發展,且網路頻寬進一步提升。辦法2最現實,也最好用。本文就集中精力來講解如何在隨身碟上裝一個Linux,自己的軟體和資料都可以在上面永久儲存。

A. 版本選擇

Linux的版本很多,這裡選擇Ubuntu。理由就是好用,官方和民間的支援都不錯,對PC或者筆記本的相容性好,本身整合的內容已經能夠滿足案頭使用者的基本需求,在上面用內建的軟體包管理器擷取軟體也極其方便。不用像其他發行版一樣,經常為了支援某個驅動絞盡腦汁,或者要安裝某個特殊的軟體不得不反覆設定。

最新的穩定版是Ubuntu10.04。便攜隨身碟的目的是提供一個方便的辦公環境,所以應該選擇案頭版,不需要選擇伺服器版,除非硬要做一個移動的伺服器,呵呵。在32位和64位這兩個版本之間我猶豫了一會兒。理論上64位的效能更好(所以伺服器一般都用64位),但是32位的相容性理所當然會超過64位(很多軟體只有32位版本),且這個隨身碟系統有可能會跑在比較老的32位CPU上面,所以最終我最終選擇了32位。

B. Live USB的製作

很多Linux都支援Live CD的製作,Ubuntu當然也不例外。Live CD不僅可以引導電腦安裝系統,它本身就是一個功能豐富的Linux系統,預裝了常用的軟體,完全通過光碟片啟動可以進入案頭,瀏覽網頁,線上聊天,編輯檔案,樣樣都不在話下。甚至我們可以安裝軟體,不過,由於我們所做的改動都是在記憶體中進行的,重啟電腦之後,新裝的軟體沒有了,所有改動也都消失了。

現在的Ubuntu也支援Live USB的製作,省去了燒錄光碟片的麻煩。幾乎所有較新的電腦都支援USB啟動,所以,Live USB可以方便地用來引導系統。當然,它擁有Live CD的全部功能,更重要的是,隨身碟本身是可讀可寫的,我們甚至有機會用它來儲存自己的更改,這比Live CD強多了。

我按照官方網站上的指導教程(http://www.ubuntu.com/desktop/get-ubuntu/download),下載了Universal USB Installer(版本1.7.9.8),在Windows上很方便地用4G 隨身碟製作了一個Live USB。興緻沖沖地用它來啟動電腦,果然看到了漂亮的Ubuntu案頭。於是,我給它配好網路,安裝了一些常用的軟體。過了一會兒,我關閉電腦,把隨身碟插在另一台電腦上面。啟動之後,發現系統又變得乾乾淨淨,自己的改動完全沒有保留。這,這不跟Live CD是一模一樣的嗎。

上網搜尋了一番,有不少製作能夠持續保留使用者資料的隨身碟版Ubuntu的方法。比如,這篇文章就提到了好幾種方法:https://wiki.ubuntu.com/LiveUsbPendrivePersistent。最直接的就是直接把隨身碟當成硬碟來安裝。這樣安裝原理簡單,但是對隨身碟的磨損也是最大的。我們都知道,隨身碟裡面用來儲存的晶片都是Nand Flash。Flash晶片的每一個塊(block)都有一定的擦除/寫入次數限制,超過這個限制該塊就很可能被壞掉。典型的寫入次數有1萬次和10萬次。平常我們使用的大容量隨身碟一般都用MLC Flash晶片,寫入周期大概是1萬次。隨身碟裡的韌體做了磨損平衡和壞塊處理等演算法,我們把它用作平常儲存資料的介質,綽綽有餘,也不用擔心寫1萬次就會把隨身碟寫壞的情況。但是如果用來直接跑系統,由於臨時檔案等諸多因素,其寫入的壓力會大很多,在這種情況下,我們不得不考慮隨身碟的使用時間。所以,直接用隨身碟當硬碟來裝Linux不推薦。因為這樣的話,即使禁掉了SWAP分區,/tmp分區還會在硬碟上面,該分區的臨時檔案會加速隨身碟的磨損。我按照另外一種辦法http://rudd-o.com/en/linux-and-free-software/a-better-way-to-create-a-customized-ubuntu-live-usb-drive來製作了一個隨身碟,但是重啟之後,只能停在GRUB的控制台裡,無法啟動Linux。正當我準備詳細琢磨該辦法的時候,我發現Universal USB Installer本來就支援製作能夠持久儲存資料的隨身碟,只是之前我沒有注意而已。請看下圖:

之前我忽略了Step 4,用的是No Persistence的預設值。其實該選項的目的就是讓你選擇合適的大小來儲存自己的修改資料。我選擇了2GB Casper-RW,這樣,我對系統做的任何修改(包括新裝軟體,增加的檔案等等),都會被存在casper-rw這個檔案當中,該檔案最大可以是2G。當然,使用者完全可以不關心casper-rw這個檔案,按照以往的用法來使用隨身碟的Ubuntu。

談到這裡,製作隨身碟版的Ubuntu就告一段落了。利用工具做好的隨身碟,幾乎可以在任何主流的電腦上面啟動。裝好的軟體也會按照原樣儲存下來,爽哉。如果你就像簡單地嘗試一下隨身碟Linux,看到這裡就可以跳過本文其他部分了。如果你想瞭解有關隨身碟Linux的部分技術細節,想利用隨身碟來有效地隨處工作,請繼續看下去。

C. 隨身碟的分區

隨身碟當然是容量越大體積越小就越小。現在4G和8G的隨身碟都很便宜了。我手頭最多的隨身碟為4G的,所以本文中的隨身碟大小預設都為4G。我做好一個隨身碟,還可以把整個隨身碟的內容備份到一個檔案裡面,隨時可以恢複系統,且可以方便地把它複製到另外的隨身碟上,讓我的移動工作環境進一步實用——它不需要物理上依賴於某個特定的隨身碟,只要我手頭有備份的鏡像檔案,就可以隨時恢複整個系統。

不過,4G的隨身碟實際容量並沒有4G。這主要是單位換算不同造成的。在Windows,是按照1K=1024位元組,1M=1024K,1G=1024來進行計算,隨身碟的廠商一般按照1K=1000位元組,1M=1000K,1G=1000M來計算。所以,在Windows中看到的隨身碟的實際容量經常為3.7-3.8G(不同的隨身碟略有差別)。假定我有2個4G的隨身碟,一個容量是3.7G,一個是3.8G。如果我在3.7G的隨身碟上裝好系統,然後複製到3.8G的隨身碟上,沒有任何問題;但是反過來,就會有一部分資料丟掉,可能會導致潛在的問題。為了提高相容性,我給隨身碟重新分區,划了一個3.5G的FAT32分區用來製作系統。Universal USB Installer製作隨身碟Linux的時候,似乎必須要求隨身碟本身已經被格成FAT格式,否則不能選擇該盤。事實上,隨身碟Linux的分區本身採用的就是FAT格式,只是上面的檔案可能在Linux啟動之後又被當作塊裝置,以其他的檔案系統格式再次被載入(稍後我會再講)。大家再製作自己的Linux系統時,如果考慮到方便複製等相容性因素,也可以給隨身碟保留一點點容量。

Windows的磁碟管理不能直接對隨身碟進行分區,我們可以藉助第三方的工具來進行。我是用二進位編輯工具直接開啟隨身碟,修改第一個扇區(MBR)的分區表來實現預留3.5G大小的分區的。剩下的200MB空間我就讓它保留著好了。因為Flash需要用磨損平衡演算法來提高使用壽命,這200MB額外的空間被用到全域的磨損平衡當中,對延長隨身碟的使用時間很可能有一定的好處。

D. aufs檔案系統

啟動隨身碟版Ubuntu,輸入mount命令,得到如下的輸出:

aufs on / type aufs (rw)none on /proc type proc (rw,noexec,nosuid,nodev)none on /sys type sysfs (rw,noexec,nosuid,nodev)none on /dev type devtmpfs (rw,mode=0755)none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)/dev/sdb1 on /cdrom type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)/dev/loop0 on /rofs type squashfs (ro,noatime)none on /sys/fs/fuse/connections type fusectl (rw)none on /sys/kernel/debug type debugfs (rw)none on /sys/kernel/security type securityfs (rw)none on /dev/shm type tmpfs (rw,nosuid,nodev)tmpfs on /tmp type tmpfs (rw,nosuid,nodev)none on /var/run type tmpfs (rw,nosuid,mode=0755)none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)gvfs-fuse-daemon on /home/ubuntu/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=ubuntu)

我們暫且不考慮proc,sysfs等用來對系統進行輔助管理的特殊檔案系統,只考慮和隨身碟的實際儲存打交道的部分。在上述列表裡,沒有看到我們最熟悉的ext3/ReiserFS等Linux下的主流檔案系統。那到底隨身碟上建立的是什麼檔案系統,是如何進行資料儲存的呢。

前面已經提到,製作隨身碟的時候,需要隨身碟上已有一個FAT32的分區。製作工具把必備的檔案拷入到該分區,並不會對分區本身做修改。所以,現在的隨身碟理所當然地具有一個FAT32的分區。從mount的輸出可以看到,裝置/dev/sdb1(就是隨身碟的第一個分區,電腦的本地硬碟被識別成/dev/sda)被mount到/cdrom,格式為VFAT。顧名思義,該分區的功能類似於Live CD,我們可以簡單地理解它裡麵包含了一張Ubuntu安裝光碟片所包含的必要內容。因為所有的軟體和資料都儲存在/dev/sdb1上,所以/cdrom理所當然地包含了我們需要的一切內容。

但是從/cdrom裡面能夠找到的只是有限的檔案,似乎大部分都和安裝有關,熟悉的就是/cdrom/casper目錄下的核心檔案vmlinuz以及initrd.lz。並不能找到我們所熟悉的其他Linux系統檔案以及設定檔。既然/cdrom已經囊括全部了,那根目錄下的/bin,/sbin,/etc又來自哪裡呢。

/cdrom/casper下有一個巨大無比的檔案filesystem.squashfs,大概700MB,從名字可以猜測,這個檔案是不是本身就包含了運行Linux所必需的檔案系統。且它的大小也能夠容納足夠的應用程式。在Linux中,單一檔案可以被載入成一個loop裝置,然後它就可以當作普通的塊裝置使用,被mount成其他檔案系統。(檔案a可以作為塊裝置block_a,上面又存在一個檔案b,那檔案b又可以被作為塊裝置block_b,上面又存在一個檔案c…一層套一層,這就是《盜夢空間》的檔案系統版演繹。)用下面的命令查看當前使用的loop裝置資訊:

$ sudo losetup -a/dev/loop0: [0811]:27 (/cdrom/casper/filesystem.squashfs)/dev/loop1: [0811]:33 (/casper-rw-backing/casper-rw)

系統建立了兩個loop裝置,其中/dev/loop0就是基於filesystem.squashfs建立的。結合前面mount命令的輸出,我們得以知道/dev/loop0被mount到/rofs目錄,檔案系統類型是squashfs。squashfs是一種唯讀壓縮檔系統,在很多Linux上普遍使用,速度快,壓縮比例高,乃Live CD製作的首選。在Ubuntu裡簡要查詢了一下,/rofs下共有檔案10萬多個,總容量大概是1.7GB。想想原始的filesystem.squashfs的大小才700MB,squashfs的表現已經很不錯。從這裡也可以瞭解到Live CD(Live USB)上為什麼可以放這麼多的內容。

/rofs目錄下有幾乎我們所需要的一切,包括熟悉的bin,sbin,lib,etc,home等目錄。儼然整個Linux系統就被它納入囊中。可是它只是唯讀(rofs表示read only file system),我們現在的隨身碟Linux對檔案系統是可讀可寫的。而且,/rofs下面有一個bin,根目錄下也有/bin,這兩者是什麼關係呢。比較了一下,/rofs/bin怎麼和/bin似乎一模一樣。

秘密在於aufs (Another Union FS)這個特殊的檔案系統。它不是一個普通的檔案系統,而是把現有的不同檔案系統組合在一起,形成一個統一的檔案系統。假設有有兩個檔案系統,fs_a和fs_b,它們所掛載的目錄分別是/a和/b。利用aufs,可以讓它們合并起來,/a和/b均可重新對應到根目錄/。實際使用的時候,一般使用者只需要關心根目錄/所對應的檔案系統是aufs即可,不必關心太多的底層細節。談到這裡,有人就有疑問了。比如,在aufs下建立一個檔案,那該檔案到底是存在於/a下面,還是/b下面呢。這不存在著很明顯的衝突問題嗎。

實際上,aufs並不具有把任意檔案系統彙總在一起的功能。它一般只組合兩個檔案系統,其中一個是唯讀,另外一個是可讀可寫的。讀取檔案的時候,如果僅僅唯讀檔案系統上有該檔案,則從唯讀該處讀取;如果可讀寫的檔案系統上也有該檔案,則從可讀寫的檔案系統上讀取。寫檔案的話,理所當然地就只能往可讀寫檔案系統上寫。唯讀檔案系統可以認為是基礎,可讀寫檔案系統是補充,採取copy on write(COW,寫時複製)的方式來儲存使用者的修改。因為僅僅儲存修改部分,所以可以很大程度的節約空間。

就本文的例子來說,/rofs是一個唯讀檔案系統,另外用了一個檔案casper-rw來儲存使用者的更改資料。casper-rw是Universal USB Installer直接建立在隨身碟根目錄下的。如果該檔案的大小是2G,則可以儲存2G的修改內容。如果隨身碟的空間允許,我們可以向這個檔案的末尾追加內容,擴大檔案以便增加可儲存資料的容量。該檔案本身被載入成一個loop裝置,從losetup -a的輸出來看,該裝置為/dev/loop1。在此裝置上建立好了ext2檔案系統,被mount到/cow中。aufs把/rofs和/cow合并起來,一起載入到根目錄/下。/rofs放的是原始檔案,/cow儲存使用者修改。所以,我們可以看到根目錄下的檔案結構基本和/rofs下一模一樣,只是新裝的軟體和建立的檔案在/rofs下無法查看。 (aufs的建立位於initrd裡的相關指令碼,在啟動之後,是無法直接查看/cow等目錄的。)

我們可以這麼簡單理解,這個隨身碟版Ubuntu的基本系統存放於檔案filesystem.squashfs當中,對它的修改都存放於檔案casper-rw當中。

E. 減少對隨身碟的磨損

由於Flash晶片的擦除/寫入次數限制,我們在保證滿足自己需要的前提下,盡量減少隨身碟的寫入次數。預設情況下,隨身碟版Ubuntu已經禁掉了SWAP分區,且把/tmp掛載到了記憶體,這些都是延長隨身碟使用時間的有效手段。

在系統中,預設會把最後一次訪問檔案的時間(last access time)給記錄到該檔案的中繼資料當中。這個操作的開銷實際上很大,比如,我僅僅開啟一個檔案不對該檔案做任何寫操作,都會導致系統底層對磁碟至少有一次寫操作。對隨身碟來說,last access time的更新也是降低效能,磨損隨身碟的一個重要因素。該時間對於普通的應用來說沒有任何實際用處,所以我們可以把它禁掉。(有少數程式需要依賴於last access time來進行一些特殊判斷,不過,從大局考慮,去掉它是隨身碟版Linux提高效能減少磨損的一個重要手段。)Linux的mount命令有一個noatime的選項,加上它可以實現禁用last access time的功能。(還有一個針對目錄的禁用last access time選項,叫nodiratime。但是有人分析只要加了noatime,就會實現nodiratime的功能。)比如,如果把/dev/sdc載入成ext3檔案系統,並禁掉last access time,我們可以這樣調用mount:

mount -t ext3 -o noatime /dev/sdc /mnt/myfs

事實上,在製作隨身碟版Ubuntu的過程當中,/rofs已經被設定了noatime。載入到/cow打casper-rw以及aufs也都被設定了noatime(mount輸出無法直接查看,但是在initrd.lz的相關指令碼中可以看到)。另外,/cdrom是以relatime的方式來mount的。相比noatime來說,relatime是一個考慮效能和功能的折衷方案。只有當檔案的last access time早於最後修改時間的時候,才會對它進行更新。因此,用relatime的方式,可以記錄檔案修改之後的第一次訪問的時間。

記錄檔系統(比如ext3)會額外向磁碟寫入日誌,以保證檔案系統的完整性。但是對於隨身碟來說,增加的日誌無疑會帶來更多的寫入操作。因此,如果對系統的穩定性不敏感的話,建議capser-rw上採用不帶日誌的ext2檔案系統。事實上,該隨身碟版Ubuntu在初始化capser-rw時用的就是ext2.

Linux中,除了特別的需求,檔案一般都是按非同步模式寫入磁碟當中。也就是說,應用程式寫入的資料,會先放在頁緩衝(page cache)裡面,等合適的時間再刷(flush)到磁碟當中。這種方式可以提高效能,同時也能夠有效地降低寫入的次數。Linux的核心匯出了幾個proc檔案,可以供我們調節相關的flush參數。隨身碟版Ubuntu已經對Linux的預設參數做了一定的修改。相關的proc檔案以及Ubuntu的設定值如下:

/proc/sys/vm/dirty_ratio: 20/proc/sys/vm/dirty_background_ratio: 10/proc/sys/vm/dirty_writeback_centisecs: 1500/proc/sys/vm/dirty_expire_centisecs: 3000

簡單解釋如下:當page cache裡的髒資料(dirty data)超過記憶體20%(dirty_ratio)的時候,會被馬上刷到磁碟中;如果超過記憶體10%(dirty_background_ratio),進程pdflush會在後台非同步地把資料刷到磁碟中。如果10%的閾值一直未達到,也不要緊,核心會每隔15秒(dirty_writeback_centisecs)啟動一次flush操作,只要髒資料待在cache的時間超過了30秒(dirty_expire_centisecs),也會被刷到磁碟當中。

為了進一步減少寫的次數,讓髒資料在cache中待得更久,我們可以在啟動指令碼裡更改部分參數,比如,修改dirty_writeback_centisecs為6000,表示把後台周期性flush的時間調成60秒一次。修改dirty_expire_centisecs為6000,表示髒資料的逾時時間為60秒。另外兩個參數可以不用修改,因為在小量寫入的時候,髒資料一般也達不到記憶體總量的10%,在大量資料寫入的時候,也沒有必要把髒資料緩衝更久。同時請注意,更改這些資料之後,系統突然斷電等異常情況導致資料丟失的機率會相對較大一點。所以如何選擇,得根據自己的需求權衡一下。

另外,隨身碟上請只裝自己需要的軟體,不要像普通Linux那樣亂裝一通。這是減少隨身碟寫次數非常重要也非常簡單的一個手段。

F. 備份與還原

隨身碟版Ubuntu做了一些設定,提高了效能,理論上也應該延長了隨身碟的使用時間。但是這些操作也會帶來一定的風險,比如系統突然斷電的情況下,最近修改的資料就更容易丟失。我們在此隨身碟上啟動並執行是案頭系統,主要就是為了方便,功能夠用,不像伺服器那樣要求很嚴格,也能夠承擔此風險(如果有更高的可靠性要求,請不要採用此隨身碟系統)。但是,即使隨身碟品質再好,我們自己也很注意,它總有可能會損壞,因此,強烈建議對隨身碟進行定期備份。備份之後的鏡像檔案,可以隨時恢複到容量足夠大的隨身碟上,讓該系統具有迅速複製的功能。即使你忘記帶了隨身碟,也可以通過網路取得該鏡像(網路速度要足夠快),迅速恢複一個專屬於自己的工作環境。

Windows下的很多工具都具有整盤複製功能。Linux下用dd也可以方便地進行備份(假設隨身碟的裝置名稱為/dev/sda):

dd if=/dev/sdb of=/mnt/backup/ubuntu_bak1.img bs=1M

塊大小(bs)設定大一點有助於提高效能,尤其是往隨身碟寫入資料的時候。(大塊的寫入有利於降低隨身碟的底層IO。對於一般的Flash來說,一次寫1個位元組和一次寫4K所產生的IO是一樣的,甚至更多。)假設插入另外一塊隨身碟/dev/sdc,可以把備份的鏡像燒錄到該隨身碟上,讓此隨身碟立馬成為我的定製版Ubuntu:

dd if=/mnt/backup/ubuntu_bak1.img of=/dev/sdc bs=1M

當然,如果想加快備份速度的話,也可以單獨備份casper-rw檔案,因為自己所作的修改全部儲存在該檔案當中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.