2010年5月5日 星期三

LVM2學習筆記

LVM2(Logical Volume Manager, version 2)的前身是LVM,他是由Heinz Mauelshagen於1998年在HP-UX上開發。他當初為了解決unix上分割區空間分配的問題而設計出這個管理程式。有了LVM,我們可以動態的調整空間的大小,大大縮短置換硬碟所需的downtime。這個鬼才現在任職於Redhat,目前正主持幾個跟software raid相關的計畫。目前我們所接觸到的教學文件大多是LVM2,但是因為已經全面取代了舊版的的LVM,因此還是以LVM稱之。

LVM的基本架構


上圖引用自鳥哥的私房菜,是一個相當有助理解的架構圖。本文僅適合非常熟悉LVM架構的讀者做為快速複習使用;如果談到PV/LV/VG等名詞您還得停頓一下,本文可能對您毫無幫助。下表則是我自己整理的指令列表,但僅列出一些常用的commands。

Function PV VG LV
新增 pvcreate vgcreate lvcreate
刪除 pvremove vgremove lvremove
擴大 vgextend lvextend lvresize
縮小 vgreduce lvreduce
變更屬性 pvchange vgchange lvchange
掃描 pvscan vgscan lvscan
詳列清單 pvdisplay vgdisplay lvdisplay
匯入/匯出 vgimport
vgexport
移動 pvmove
附註: 1. pvchangelvchange非常少用,本文也不會提及。
2. lvextend與lvreduce可以完全由lvresize來取代。
3. LVM不具備redundent的功能。如果想要有備援機制,請改用raid或是raid搭配LVM。
4. 目前的開機管理程式均無法辨識LVM,請獨立出/boot便於開機。

設計一個實驗

藉由實做是理解LVM最好的方式。本實驗的流程與目的如下:

  1. 利用虛擬機器產生一個2G大小的硬碟用來產生LVM類型分割區
  2. 練習建立與刪除PV
  3. 練習建立與刪除VG
  4. 練習建立與刪除LV
  5. 在LV上建立檔案系統,並且動態改變LV以及檔案系統大小
  6. 實做LVM的snapshot功能並還原
  7. 以新硬碟取代舊硬碟
  8. 系統重灌或是硬碟轉移,LVM的轉移方案


目標1:產生LVM類型分割區

我先前已經有一個2G的虛擬硬碟,我不想用fdisk慢慢組分割區,直接刪掉他的partiton table以利我們馬上就能使用:

dd if=/dev/zero of=/dev/hdb count=1
接著利用fdisk產生四個分割區,假設分別是hdb{1,2,5,6},各為200M, 300M, 300M以及1200M。

把partition ID改成8e(LVM format)。改完後,別忘記更新核心的partition資訊:

partprobe /dev/hdb
檢查一下核心是否已經更新partition table了:
cat /proc/partitions
major minor  #blocks  name

   3     0    8388608 hda
   3     1    8281476 hda1
   3     2     104422 hda2
   3    64    2097152 hdb
   3    65     196024 hdb1
   3    66     293328 hdb2
   3    67          1 hdb3
   3    69     293296 hdb5
   3    70    1314400 hdb6
如果能看到hdb的1,2,5,6號partition,那就表示可以進行下一步。

目標2:PV的建立與刪除

pv就是構成LVM最基本的元素,他可以是一整顆硬碟,也可以是一個partition。(實作上如果要把整顆硬碟加入LVM裡,還是建議至少做一個partition再加入)要把數個硬碟或是分割區加入PV裡,需要用pvcreate:

pvcreate /dev/hdb{1,5}
把某個分割區從pv裡移除,使用pvremove:
pvremove /dev/hdb5
查看現有的pv有哪些,可以用pvdisplay得知:
  "/dev/hdb1" is a new physical volume of "191.43 MB"
  --- NEW Physical volume ---
  PV Name               /dev/hdb1
  VG Name               
  PV Size               191.43 MB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               OKTpgY-M2tF-KykI-xPB1-xJae-UMqI-XKvJ5U
可以得知我們現在只有一個分割區加入到pv裡。我們把hdb{2,5}也加到pv裡,讓實驗繼續進行。
pvcreate /dev/hdb{2,5}

目標3:VG的建立與刪除

對於作業系統來說,vg相當於傳統硬碟的地位;把許多個傳統分割區加入pv裡,然後建立一個vg組成一個大的虛擬硬碟。現在我們建立一個名為myVG的vg,由hdb1及hdb2組成:

vgcreate myVG /dev/hdb{1,2}
此時可以用vgdisplay以及vgscan觀察之:
  --- Volume group ---
  VG Name               myVG
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               472.00 MB
  PE Size               4.00 MB
  Total PE              118
  Alloc PE / Size       0 / 0   
  Free  PE / Size       118 / 472.00 MB
  VG UUID               VyMTQc-1Cuy-z2UG-jXyF-LFvx-vRY2-oQaJLd
由上面資訊可以得知,我們只有一個vg叫做myVG,大小為472MB,為118個PE的大小,目前完全沒有PE被使用。
再把hdb5加入到這個vg裡:
vgextend myVG /dev/hdb5
然後再使用vgdisplay/vgscan觀察變化。要把某個傳統分割區從vg裡開除,則使用vgreduce:
vgreduce myVG /dev/hdb1
要把整個vg砍掉重練,就使用vgremove:
vgremove myVG
為了後續的實驗,趕快恢復原狀吧:
vgcreate myVG /dev/hdb{1,2,5}

目標4:LV的建立與刪除

從一個vg裡建立一個lv,就好比從一顆硬碟建立分割區,你需要清楚的知道分割區從哪顆硬碟建立,以及分割區的大小。利用lvcreate建立lv:

lvcreate -L 500M -n myLV myVG
也可以特別指定vg裡的某個pv:
lvcreate -l 125 -n myLV myVG /dev/hdb1
上例表示使用myVG的其中一個pv的空間來建立lv,以-L指定大小,-l指定PE數量;預設1PE=4MB。需特別注意的是,lv一旦建立,想要使用lv則必須像是寫一個分割區一樣寫完整的路徑。以myLV而言,他的完整路徑將會是/dev/myVG/myLV或是/dev/mapper/myVG-myLV
現在擴大lv成為600M:
lvextend -l +25 /dev/myVG/myLV
上例會再從vg裡剩餘的空間去分配。同樣的,要縮減lv也很容易:
lvreduce -l -5 /dev/myVG/myLV
如果-l後面沒有接正負號,則表示改變大小成指定值。由於lvextend只能接正值,lvreduce後面只能接負值,這兩個指令可以完全被lvresize取代,例如上面兩個例子完全等於:
lvresize -l +25 /dev/myVG/myLV
lvresize -l -5 /dev/myVG/myLV
因此,往後的實作將只使用lvresize。為了使實驗繼續進行,我們把myLV的大小設定成600M吧:
lvresize -L 600M /dev/mapper/myVG-myLV

目標5:動態改變LV以及檔案系統大小

建立好lv(想像成建立好傳統的分割區)之後,就必須在上面搭載檔案系統以供使用。請把lv當成一個分割區一樣的來進行格式化吧!

mkfs.ext3 -L "myLV" /dev/mapper/myVG-myLV
mount -t ext3 LABEL=myLV /mnt
截至目前,這個lv已經正式上線使用了。不過我們可以藉由vgdisplay以及df得知,其實myLV並沒有用到全部的可用空間。LVM最強大的功能之一,就是允許線上擴大容量。由於lv是底層,檔案系統在上層,因此要擴大檔案系統必須lv先擴大,filesystem再擴大。
想要擴張lv到最大容量,你可以查看vg剩餘多少PE然後擴大,或是直接擴大到全部可用範圍:
lvresize -l +100%FREE /dev/myVG/myLV
或是指定完全使用某幾個pv:
lvresize -l +100%PVS /dev/myVG/myLV /dev/hdb{2,5}
由此可見,LVM的運用非常強大,且自訂性極高。
擴充lv的容量之後,接著就可以擴充檔案系統:
resize2fs /dev/myVG/myLV [700M]
如果不指定擴充大小,則resize2fs會自動擴充到全部可用範圍。

要縮減lv大小則與擴充相反--必須先縮小上層的filesystem,再縮小底層的lv。如果你不照此順序進行,lv上面的資料會全部付之一炬。縮減lv不支援線上進行,而且縮減到有寫入資料的部份也會造成檔案lost,必須小心為之:

umount /mnt
fsck.ext3 -f /dev/myVG/myLV
resize2fs /dev/myVG/myLV 500M
lvresize -l -25 /dev/myVG/myLV
mount LABEL=myLV /mnt
依序縮減filesystem以及lv大小後,就可以掛載後正式上線工作。

目標6:實做LVM的snapshot功能

Solaris的ZFS檔案系統擁有非常卓越的snapshot功能,雖然LVM的snapshot沒有Solaris那麼powerful,但是也是一樣功能強大且便於使用。snapshot目前僅支援lv,vg的snapshot功能還尚未實做出來。
快照檔其實就是一個lv,他會與檔案系統共用『未變更』的PE,因此snapshot必須與原本的lv在同一個vg裡面。

上圖引用自鳥哥的私房菜,說明了snapshot可以很小的原因就是與原本的lv共用未變更的PE。 他的大小約為想執行snapshot的lv的15%~20%的大小。檢查我們的lv大小:

lvdisplay | grep Size
以我們的例子而言,我們的lv約750MB,製作一個snapshot約需要150MB,恰好目標5的末段我們縮減了檔案系統,vg也還有約156M的空間可以用。我們讓snapshot就坐在這156MB上:
lvcreate -L 156M -s -n `date +"%Y-%m%d".snap` /dev/myVG/myLV
產生了具有日期為檔名的快照檔之後,可以以此作為系統還原備份之用。例如半年後想要回到snapshot的狀態,只要把該snapshot掛載上去就好。
umount /mnt
mkdir /mnt/{myLV,date}
mount /dev/myVG/2010-0505.snap /mnt/date
mount LABEL=myLV /mnt/myLV
雖然snapshot只佔有156MB的空間,但是對於核心而言,他就是一個lv的clone,因此你從df看到的大小是一樣的:
/dev/mapper/myVG-myLV
                      591M   17M  545M   3% /mnt/myLV
/dev/mapper/myVG-2010--0505.snap
                      591M   17M  545M   3% /mnt/date
把snapshot給umount之後,再來進行一些測試!
umount /mnt/date
for words in $(seq 1 1000000); do
      echo 'I love peace world!!' >> abc.txt
done
cp -r /etc/httpd /mnt/myLV
以上,我們做的所有更動都會紀錄在snapshot檔裡,可以用lvdisplay /dev/myVG/2010-0505.snap來觀察:
  --- Logical volume ---
  LV Name                /dev/myVG/2010-0505.snap
  VG Name                myVG
  LV UUID                JDGmIg-m0qW-M0VK-Gem1-4bqA-DEyS-83FtbL
  LV Write Access        read/write
  LV snapshot status     active destination for /dev/myVG/myLV
  LV Status              available
  # open                 0
  LV Size                600.00 MB
  Current LE             150
  COW-table size         156.00 MB
  COW-table LE           39
  Allocated to snapshot  13.32% 
  Snapshot chunk size    4.00 KB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
請特別留意"Allocated to snapshot"已經佔了13.32%,由此可知LV的snapshot有個關鍵的要素:所容許的異動大小必須小於snapshot的大小。往後將此snapshot掛載,便可以取出製作快照前的檔案作為備援使用。snapshot被掛載的時候會停止紀錄變動,請非常留意。

刪除一個snapshot就是刪除一個lv:

lvremove /dev/myVG/2010-0505.snap

目標7:以新硬碟汰換舊硬碟

以上已經展示過LVM線上擴大檔案系統及lv的卓越能力,也展示過製作snapshot的功能,現在則是模擬淘汰一個快要壞掉的舊硬碟,換上一個又大又新的硬碟上去。我們假設舊硬碟是hdb1(200M),新硬碟是hdb6(1200M),首先必須把新硬碟加入:

pvcreate /dev/hdb6
vgextend myVG /dev/hdb6
pvmove -v -i 2 /dev/hdb1 /dev/hdb6
上述的指令顯示線上加入一個新硬碟到vg裡,然後把hdb1裡的PE都移動到hdb6裡,並且每隔2秒顯示詳細訊息:
    Finding volume group "myVG"
    Archiving volume group "myVG" metadata (seqno 4).
    Creating logical volume pvmove0
    Moving 47 extents of logical volume myVG/myLV
    Found volume group "myVG"
    Updating volume group metadata
    Suspending myVG-myLV (253:0) with device flush
    Creating myVG-pvmove0
    Loading myVG-pvmove0 table (253:1)
    Resuming myVG-pvmove0 (253:1)
    Creating volume group backup "/etc/lvm/backup/myVG" (seqno 5).
    Checking progress every 2 seconds
  /dev/hdb1: Moved: 14.9%
  /dev/hdb1: Moved: 34.0%
  /dev/hdb1: Moved: 46.8%
  /dev/hdb1: Moved: 57.4%
  /dev/hdb1: Moved: 66.0%
  /dev/hdb1: Moved: 76.6%
  /dev/hdb1: Moved: 89.4%
  /dev/hdb1: Moved: 100.0%
    Found volume group "myVG"
    Loading myVG-myLV table (253:0)
    Suspending myVG-myLV (253:0) with device flush
    Suspending myVG-pvmove0 (253:1) with device flush
    Resuming myVG-pvmove0 (253:1)
    Removing temporary pvmove LV
    Writing out final volume group after pvmove
    Creating volume group backup "/etc/lvm/backup/myVG" (seqno 7).
由於是每隔兩秒顯示一次訊息,因此訊息很長。
vgreduce myVG /dev/hdb1
pvremove /dev/hdb1
lvresize -l +100%FREE /dev/myVG/myLV
resize2fs /dev/myVG/myLV
最後的兩行指令,就是把hdb1完整的從LVM裡面拿掉,接著就是找個可以允許短暫downtime的時間,把舊硬碟抽走。別忘了新硬碟容量大多了,別忘了先把lv變大,在擴大filesystem!

目標8:LVM的轉移方案

假設今天想要換新的機器或是重灌系統,但是lvm裡面的資料還是要保留下來,我們該怎麼處理呢?大致的流程如下:

umount->vgchange(deactivate)->vgexport->系統重灌->vgimport->vgchange(activate)->mount

承續剛才的狀況:

umount /mnt/myLV
vgchange -a n myVG
vgexport myVG #可以藉由vgdisplay觀察是否有exported!

上述的指令便是停止vg的運作,因此所有在vg上的lv也都會全部終止運作,因此假設你在vg上切不只一個lv,則需要把所有掛載點都umount之後,vgchange才有可能終止活動。我終止這個vg並且匯出vg之後,關閉虛擬的os並開啟一個新的os,假設是SLES11好了;我們可以在SLES11上面利用vgdisplay找到這個vg:

vgimport myVG
vgchange -a y myVG
mkdir /export
mount /dev/myVG/myLV /export
如此一來便可以順利完成轉移。


參考文獻:

1. Redhat Enterprise Linux系統管理寶典 進階篇(陳永昇),第八章
2. Logical Volume Manager(一)(二)(林彥明)
3. RHEL3/4 之Logical Volume Manager(林彥明)
4. 鳥哥的私房菜:Logical Volume Manager

2010年5月3日 星期一

[轉載]Steve Jobs的公開信談Apple拒絕flash

全文轉載自:Steve Jobs談為何蘋果討厭吃Flash(完整公開信,中文版),ZDnet Taiwan


蘋果跟Adobe有很深的關係,我們還曾在他們草創的車庫裡跟Adobe創辦人見過面,蘋果是他們第一個大客戶,把他們的Postcript語言用在我們新的Laserwriter印表機中。蘋果曾經投資過Adobe,也曾一度擁有Adobe 20%股權多年。我們曾密切合作創新推出桌面出版,雙方都有過許多甜蜜時光,但過了那段蜜月期後,我們就漸行漸遠了,蘋果歷經瀕死經驗,Adobe則以Acrobat產品打入企業市場。今日,我們依然共同服務雙方共有的創意客戶群,Mac用戶大概買了半數Adobe的Creative Suite產品,但除此之外,雙方已經殊少交集了。

我之前很想寫出我對Adobe Flash產品的想法,好讓大家能更瞭解為何我們不想讓Flash進到iPhones、iPods與iPads。Adobe一直認為我們的決定是出於商業考量,他們說我們這麼做是要保護App Store,但其實這一切都只是出於技術考量而已。Adobe說我們是封閉系統,而Flash是開放的,但事實根本相反,我在此解釋一下。

首先是開放問題。

Adobe的Flash產品是100%專屬的,僅能由Adobe提供,未來怎麼發展、價格等也全看Adobe自己的決定。雖然Adobe的Flash產品廣為使用,但這不代表他們是開放的,因為這個技術由Adobe自家掌控,從任何角度來看,Flash都是封閉系統。

蘋果自己也有很多專屬產品,不過iPhone、iPod與iPad雖然是封閉的,但十分相信所有跟Web有關的標準都應該公開。蘋果捨棄Flash,改用HTML5、CSS與JavaScript,這些都是公開標準。蘋果的行動裝置要用最高性能、最低耗電的部署方式推出。HTML5(蘋果、Google等都已經採用此一新標準)可讓Web開發者建立更先進的繪圖、字型、動畫與轉換,完全不需仰賴第三方瀏覽器外掛(不像Flash那樣)。HTML5完全開放,由標準委員會控制,蘋果也在其中。

蘋果甚至也自創Web的開放標準,比如,蘋果弄了一個小的開放原始碼計畫稱為WebKit,這是一個完整開放原始碼HTML5呈現引擎,是Safari網頁瀏覽器的核心。WebKit目前已經廣為採用,Google在Android的瀏覽器也有採用,Palm也是,Nokia也有用,RIM(BlackBerry)則已經宣布未來會採用。現在幾乎除了微軟以外,其他主要智慧手機瀏覽器都是使用WebKit。蘋果把WebKit技術開放出來,讓行動網路瀏覽器立下了標準。

Adobe也不斷說蘋果行動裝置無法存取完整的Web,因為75%的網路影片都是以Flash製作。但他們沒說的是,這些影片同時也都有提供更現代的格式:H.264,可在iPhone、iPod與iPad上觀看。YouTube(佔了網路影片40%市佔率)便可用在一款蘋果行動裝置都有搭配的應用程式中,iPad所提供的YouTube觀看經驗看是無與倫比。若再加入Vimeo、 Netflix、 Facebook、 ABC、 CBS、 CNN、 MSNBC、 Fox News、 ESPN、 NPR、 Time、 The New York Times、 The Wall Street Journal、 Sports Illustrated、 People、 National Geographic、等等的影片,則iPhone、iPod與iPad用戶並沒有少看太多影片。

Adobe還宣稱蘋果機器無法玩Flash遊戲,這點說得沒錯,但還好我們的App Store有超過5萬種遊戲程式,其中還有許多都是免費的,事實上,iPhone、iPod與iPad可用的遊戲比其他任何平台都還要來得多。

第三,我們看中穩定性、安全性與效能

賽門鐵克最近特別指出Flash是2009年安全性最差的軟體之一,我們也一手深知,Mac當機的頭號理由都是出在Flash。我們曾跟Adobe合作修正這些問題,但這些狀況多年下來依然存在,我們不想因為加入Flash而降低iPhone、iPod與iPad的穩定性與安全性。

此外,Flash在行動裝置上的效能不佳,我們多年來多次要求Adobe提出一個可在行動裝置上擁有良好效能的Flash版本,但我們從來沒看過。Adobe曾公開表示Flash會在2009年初用在一款智慧手機上,之後改口說是2009年下半,之後又延至2010年上半,現在則已經變成2010年下半年了。我們相信最終他們還是會推出,但還好我們不需癡癡等待,誰曉得屆時效能如何?

第四點,電池效能問題

播放影片若要達成電池長效,則手機必須能在硬體中進行影片解碼,若用軟體解碼會耗費太多電力,許多新一代行動裝置中所使用的晶片都含有H.264解碼器,這是一種產業標準,用在每一台藍光DVD播放機中,包括蘋果、Google(YouTube)、Vimeo、Netflix等大廠也都有採用。Flash最近雖然也加入支援H.264,但目前所有Flash網站的影片則必須使用較舊版本的解碼器,無法用在行動晶片中,且必須用軟體來執行,這兩者的差異十分顯著,比如在iPhone上,H.264影片可播放10小時,但若用軟體解碼,則只能播放5小時電池就沒電了。

網站若以H.264來重新編碼影片,則不需使用Flash就能提供出來,他們可在所有瀏覽器播放,比如蘋果的Safari或Google Chrome,不需外掛,而在iPhone、iPod與iPad上觀看效果都很好。

第五,觸控問題

Flash主要是提供給使用滑鼠的PC,而非給使用手指的觸控螢幕,比如許多Flash網站都都使用所謂的「rollovers」(滑鼠移過去會有動作),但蘋果的多重觸控介面不使用滑鼠,也沒有rollover概念。多數Flash網站都得重新改寫才能支援觸控裝置。若開發者需要重寫Flash網站,那何不乾脆使用更現代的技術,如HTML5、CSS與JavaScript?

就算我們真的支援Flash好了,這也無法解決多數Flash網站都必須改寫才能支援觸控裝置的事實。

第六,最重要的理由

除了上述缺點外,我們不允許Flash進入我們的行動裝置還有個最重要的理由:Adobe希望開發者使用Flash來開發可在我們行動裝置上可使用的應用程式。

我們從過去慘痛的經驗得知,讓一個第三方軟體層介入平台與開發者之間,則最終出現的都是次等程式,阻礙平台的創新與進步。若開發者變得很仰賴第三方開發資料庫與工具,則若第三方不提供新功能,他們就無法享受到平台更新的好處,我們不可能讓第三方來決定他們何時會把更新提供給我們的開發者。

若第三方還提供跨平台開發工具,情況則變得更糟,第三方有可能會等到所有平台的更新版本都準備就緒了才會推出,不必然會為單一平台推出更新,結果開發者僅能使用最大公約數的功能。我們無法接受這種結果,開發者竟然是因為其他平台還沒準備好,所以無法使用我們的創新功能。

Flash是跨平台開發工具,Adobe的目標並非協助開發者撰寫最好的iPhone、iPod與iPad程式,他們的目標是協助開發者撰寫跨平台程式。而Adobe向來對於蘋果平台的更新十分緩慢,比如,Mac OS X已經推出快10年了,Adobe才剛在兩週前推出的CS5才完整採用。Adobe是所有主要第三方開發者中,最慢完整採用Mac OS X的。

我們的出發點很簡單,我們希望提供最先進創新的平台給我們的開發者,我們希望他們是直接站在我們的平台肩膀上,寫出全世界最好的程式。我們會持續強化平台,好讓開發者寫出更棒、更強大、更好玩、更實用的程式。這是三贏局面,我們可賣出更多機器,因為我們有最好的程式、而開發者也可接觸更多的客戶,而使用者則可享受到最多的程式選擇性。

結論

Flash是PC與滑鼠時代的產物,Flash的確是Adobe的成功之作,也因此我們能理解為何他們想把Flash延伸至PC之外,但行動時代講究的是低耗電、觸控介面與開放Web標準,Flash在這幾個方面都是不及格的。

這麼多媒體爭相提供內容讓我們放在蘋果行動裝置,顯示Flash已經成了觀看影片或任何Web內容的雞肋。而蘋果App Store超過20萬種應用程式證明開發者不需要Flash一樣可寫出圖像十分豐富的程式,包括遊戲。

行動時代所新推出的開放標準(如HTML5)將在行動裝置上勝出(PC亦然)。或許Adobe應該多花一點時間專心在未來推出好用的HTML5工具,而不是不斷批評蘋果太不念舊。
Steve Jobs

April, 2010


全文轉載自:Steve Jobs談為何蘋果討厭吃Flash(完整公開信,中文版),ZDnet Taiwan

(陳奭璁譯)