分類
公告

【站務公告】新增iPhone版頁面

最近用智慧型手機上網的讀者越來越多,特別以iPhone為大宗

為此本站增加iPhone版頁面,特別適合iPhone螢幕大小以及瀏覽方式。

各位如果用iPhone裡的Safari連上本站,應該會看到如下的頁面:

希望這個頁面樣式可以更方便iPhone使用者的閱讀。

分類
公告

公告

某網友的留言:

跟你意見相左的人都是蠢蛋,在我看來你也沒好到哪。
寫了一堆只是把你自己歸類到你所講的「不尊重他人的選擇自由」。

我的回應:
這種留言很多。本來我想說少數看不懂文章的蠢蛋,懶得理了,不過還是點一下蠢在哪好了。
我指出一些相反意見在邏輯上、經濟學上或法學上的不合理之處,但我並沒有進而主張「這些蠢蛋連說話的權利都不該有」!
如果我這樣主張了,那就是我不尊重人家的自由權。
有人可以選擇不念書、不思考,成天淨講蠢話或是主張白痴左派理念;但我也可以選擇念書、思考、用經濟學和法學思維來批判這些蠢貨色。
這兩種自由的前提是言論自由;而能箝制、限縮言論自由的對象來自於有公權力的政府,非私人。所以有人留了沒意義的蠢留言,被我刪掉還跟我抗議,只證明自己真的一點基本法律自由權觀念都沒有,只是更讓我懶得理。早說過,法律上言論自由是對抗政府,不是對抗私人。
在美國牛肉事件上也是一樣的。
想吃跟不想吃的都是屬於個人的自由,但這種自由的前提是「有得選擇」。
如果只因為部分人不願意承擔風險,就動用政府的公權力限制其他人,使其連選擇吃的自由都沒有,則前面的個人選吃牛肉與否的自由根本就沒有存在的空間。
三篇文章在談的選擇自由,是這個層次的東西。
有人要蠢到把兩種自由混為一談,這我管不著。我要對這種蠢蛋開罵,也輪不到其他貨色來做「自曝其短」的同情與辯駁。

分類
公告

諾貝爾和平獎的創舉

看來諾貝爾和平獎創造了一個很神奇的頒發獎項規則:獎勵意圖!

以後有人想要拍一部曠世巨著、註定成為經典的電影,光這樣的計畫就足以讓他拿到奧斯卡金像獎最佳電影了!

A guy who did nothing but only the tautologous speeches and “Yes, we can" dreams is worth of a prize.
It’s so funny!

分類
公告

[公告]更換佈景

將網站換了個佈景,希望可以增加閱讀的舒適性。

目前字的行距還在微調之中,其他則大致如此。

分類
公告

四川災區急需帳篷!

以下訊息是Google 透過Adsense寄出來的信。從寄信地址看來應該不會是假造的。

今天早些时候,谷歌接到来自四川震区政府和摄制组的求助信息,由于一直下雨,绵阳北川地区的大量灾民情况非常堪忧,现在急需可以让灾民避雨的60万顶帐篷!根据下午四川政府最新发布的信息,全省急需帐篷总共260万顶!

借助网络的力量,让更多的人了解灾区的求助信息,协助灾区的同胞最大限度地得到帮助,是我们AdSense小组每一位成员最大的心愿和义不容辞的责任。为此,我们恳请广大发布商在看到这一消息时,请立即在您的网站上帮助发布这一信息,使得我们灾区同胞能够少度过一个冰冷潮湿的夜晚,多一份温暖。

一个网站的力量有限,联合起来力量无穷。您的帮助和努力对灾区人民是莫大的希望。在此,我们衷心希望所有的发布商和我们联合起来,充分发挥我们手中互联网的力量,为抗震救灾出一份力!

我们今后还会不断发布来自灾区的求助信息,如果您愿意和我们携手帮助灾区同胞抗震救灾,重建家园,请您注册 Google AdSense 抗震爱心联盟 https://spreadsheets.google.com/a/google.com/viewform?key=psN9iO-vpoNkmBZ20KeBkEQ ,我们会在需要的时候第一时间与您联络。另外,也请您放心,您所提供的联系方式将仅作为抗震救灾联系所有,我们将严格保护您的信息隐私。

最后,我们对您的帮助表示由衷的敬佩和感谢!

Google AdSense 小组敬上

關於四川地震我能做的不多,就透過這篇轉載,希望有能力的人能幫多少是多少囉…
祝大家都平安快樂

分類
公告

網站升級,重新開始

之前「毓毓的窩」的網址是http://yuyulaw.info/wordpress/
除了網址有點沒必要的太長之外,更重要的問題在於當時所使用的資料庫編碼不太對,造成現在wordpress資料庫升級一直有點問題。

另一方面,最早網站為純HTML,伺服器使用.Mac時,站名為「毓毓的Mac窩」,主題環繞在我最喜歡的Macintosh(麥金塔)電腦上。

而隨後網站改用wordpress 1.5架構,並搬遷到現在承租的這個伺服器上後,我自己的文章內容取向也越來越偏向投資、經濟學、法律、產業分析…等。
這也是為什麼當時把MAC從站名中拿掉。

這一次再改站名為「元毓說」,網址簡化為:yuyulaw.info。同時也升級了整個blog系統架構。

畢竟舊網站與新站其實都是在我自己承租的同一個伺服器底下,因此在兩、三次失敗的資料庫資料轉移之後,請大家原諒我現在沒時間也沒精力再去跟這件事情奮戰。

換句話說,過去的舊文章還是在舊網址–「毓毓的窩」那邊,不會刪除;新文章將從新網址–「元毓說」開始刊登。

謝謝各位讀者過去的支持,不管我認識或不認識的朋友,我都很感謝。

未來很顯然,網站走向會更偏向經濟分析、法學分析與投資心得。時間允許的話,我也會開始寫一些個股評析的東西,且將不會侷限在台股範圍。

再次感謝,祝大家平安。

分類
公告

【翻譯】Mac OSX檔案系統

一如現今其他作業系統,Mac OSX使用物件導向的vnode層。XNU使用的VFS layer則是從FreeBSD而來。而這兩種檔案系統之間有點小小的不同(例如:FreeBSD使用mutexes,xnu使用simple locks)

本地檔案系統
HFS

HFS(Hierachical File System)過去是Mac上面的主要檔案系統,從Mac OS 8.1之後則改為HFS+。
這個小節將會去簡述Mac OSX上所支援的幾個主要檔案系統。

HFS+

HFS+是Mac OSX上面的預設檔案系統,它支援了日誌式檔案系統功能、磁碟配額功能、位元範圍鎖定、Finder的「後設資料索引(metadata)」功能、多重編 碼功能、實體與記號連結檔、別名檔、隱藏檔…等。HFS+內部式使用B-Tree架構。

就像是目前多數的日誌型檔案系統,Mac OSX只針對後設資料索引(metadata)作日誌化的動作。而日誌功能係透過在既有的HFS上面,以XNU裡一個獨立的日誌型檔案系統層級,引入此功 能到HFS+上。HFS+卷宗上的日誌檔檔名叫:.journal或.journal_info_block。這個檔案系統還支援了其他許多獨立的功能, 並在Apple上運行良好。

與HFS相似之處

HFS+在架構上其實跟HFS十分相 近,但是它另外有許多重要的改進:

  • 磁柱採用32位元(原本是16位元),HFS將磁碟空間分為等大的allocation-blocks,且最多支援到2的16次方個 allocation-blocks。因此使用32位元的檔案會是最節省磁碟空間的方法。
  • 檔名最長支援到255個字元
  • Unicode檔名編碼
  • 檔案/目錄的屬性都有可擴充性
  • 加入System Folder ID(用以啟動Apple作業系統),在開機過程中這個非常容易被系統找到的開機用檔案會加速開機程序。另外這檔案也支援非Apple作業系統透過HFS +檔案系統來開機。
  • 單一檔案最大支援到2的63次方位元。

別名檔(Aliases)

別名檔跟記號連結檔一樣可以同時指向多個檔案或是目錄,但是如果你今天將所指向的目標檔案搬移,記號連結檔就會失去連結,但是別名黨會自己去更改連結使得 其連結依然有效。這是因為在HFS+下面,所有的檔案都有一個獨一無二、永恆的認證,其中會包含它的路徑。如果二者之中有一個出錯(可能是路徑或是認 證),別名檔會自動去更新成對的(去檢視哪個能找到檔案)。這個功能就是為什麼你可以隨便搬移應用程式裡面的程式,但是Dock上面的icon永遠能連到 正確程式位置讓你輕鬆開啟程式。

最佳化
HFS+有個特殊的最佳化機制。當我們開啟一個位於HFS+卷宗上的檔案時,系統會自動進行下列測試程序:

  • 檔案小於20MB
  • 檔案並非處於使用忙碌中
  • 檔案不是唯讀
  • 檔案是破裂的(磁碟上非連續的)
  • 系統至少正常運作超過3分鐘

如果上述所有條件通通吻合,那系統將會針對這個檔案重新定位(Windows上叫這個為「磁碟重組」)。
另外一個最佳化方式就是「熱門檔案叢集」– 這是透過多重的定位(例如:DISABLE、IDLE、BUSY、RECORDING、EVALUATION、EVICTION和ADOPTION)方 式,找出什麼是熱門檔案並將其搬移到「熱門檔案磁碟區」(注意,日誌型檔案以及磁碟配額檔案會被排除)。而這機制將會使用磁碟上的B-Tree檔案加以追 蹤(/.hotfiles.btree)。

#ls -l /.hotfiles.btree
-rw——- 1 root admin 589824 Jul 23 2004 /.hotfiles.btree

補充一下,這個機制最多選入5000個檔案,而且必須 是大小小於10MB的檔案。

多重叉

HFS+/HFS上的檔案都有兩個「叉(fork)」– 傳統上同時有資料(data)和資源(resource)兩個叉,而可能其中一個會是“空“的。資源叉(resource fork)上面通常會記錄不同的東西像是圖標、偏好設定、認證資訊…等。而如預料之中的,這個檔案系統這樣的設置跟我們一般的Unix檔案系統架構是 不相容的。所以當你想要將這個檔案系統上面的資料搬移到Unix檔案系統上面時,你最好小心一點。Command Line Archival in Mac OSX這片文章中有針對這個問題加以作進一步的討論以及提供解決方案。
BSD得文字指令方式下,會這樣去處理資源叉:

% ls -l Icon
128 -rwxrwx— 1 amit amit 0 11 Jun 2003 Icon
#這表示資料叉是空的
% ls -l Icon/rsrc
128 -rwxrwx— 1 amit amit 65535 11 Jun 2003 Icon/rsrc
#這表示資源叉裡面有65535個位元

跟別名檔不一樣的地方在於,多重叉的被POSIX API支援。

Device Driver Partition

雖然說這部份比較跟HFS+沒關係,但是我稍微提一下:Mac OSX可以從各種地方去掛載鎖定型的裝置當作是卷宗—像是ROM、USB或Firewire裝置、固定式硬碟上的特殊磁區。為了能支援各種系統或是功 能,磁碟可以在他唯一的磁區上面安裝不同的裝置驅動程式。舉例來說,你可以透過/Applications/Utilities/Disk Utility.app(譯者:即磁碟工具程式)來檢視磁碟資訊,並從中得知Mac OS9的驅動程式也同時運行在這個磁碟上面。一台標準的PowerBook磁區規劃方式可能如下:

# pdisk /dev/rdisk0 -dump

Partition map (with 512 byte blocks) on ‘/dev/rdisk0’
#: type name length base ( size )
1: Apple_partition_map Apple 63 @ 1
2: Apple_Free 262144 @ 64 (128.0M)
3: Apple_HFS Untitled 156039270 @ 262208 ( 74.4G)
4: Apple_Free 10 @ 156301478

Device block size=512, Number of Blocks=156301488 (74.5G)
DeviceType=0x0, DeviceId=0x0

在上面的資訊裡面,我們可以看到Apple_partition_map是個描述硬碟上磁區的後設資料索引磁區。 而這個後設資料索引磁區在開機過程中也是最先被載入的部份。

遲鈍之處

注意一下,HFS+是個事件先占、事件遲鈍的檔案系統,也就是在下述這樣的情形下檔案系統會發生衝突:

#tar -tf freebsd.tar
FreeBSD.txt
freeBSD.txt
#tar檔案裡面同時包含兩個檔案
#tar -xvf freebsd.tar
FreeBSD.txt
freebsd.txt
#ls *.txt
freebsd.txt

Apple Technical Note有篇叫HFS Plus Volumes Format的文件,有詳細描述HFS+的內部技術。

ISO9660
ISO9660是個獨立 的檔案系統,主要適用於唯讀的資料CD。而事實上,你應該會想要在一片光碟上面同時使用Mac/ISO9660兩種檔案系統,因為這樣你就可以同時在 Mac或是其他作業系統上面讀取同一片光碟。

MSDOS
Mac OSX支援MSDOS的檔案系統格式(FAT12、FAT16、FAT32)

NTFS
Mac OSX支援NTFS檔案系統,但是僅僅唯讀。

UDF
UDF(Universal Disk Format)是DVD-ROM(包含DVD-video和DVD-audio)和許多CD-R/RW所使用的格式。Mac OSX 10.3 Panther在本文撰寫之時僅僅支援UDF 1.5而非UDF 2.0。

UFS
Darwin裡面的UFS跟*BSD很像,跟過去的NEXTSTEP也很像,但是它們絕對不是一樣的東西。目前僅有NetBSD完全支援。Apple的 UFS是big enidan(譯者註:這個詞我不知道怎麼翻,我將牛津字典上的意思放在後面),即便是在x86硬體上也一樣。這個檔案系統裡面包含新的目錄配 置演算法。這個演算法的作者在他的網站上面有更多相關資訊可供參考。(denoting or relating to a system of ordering data in a computer’smemory whereby the most sidnificant or least significant byte is fisrt.)

網路檔案系統

AFP
Apple Filling Protocol (AFP)是Apple主要用來進行網路上檔案分享的專有網路通訊協定。關於AFP或NFS兩者之間的比較,其實已經是在本文件所要討論的範圍之外的命 題,但Mac OSX上面有一些軟體可以讓兩者並存。(AFP檔案分享可以作得看起來用起來都很像是NFS。)

/usr/sbin/AppleFileServer是AFP的背景程序,當你在「系統偏好設定」–>「分享」裡面勾選「個人檔案分享」時,這程 序就會載入。

FTP
透過mont_ftp這個指令,你可以將遠端的FTP網站以目錄的方式掛載在你的Mac上面。注意一下,這指令目前僅支援唯讀的方式,而這功能可以透過 Finder或是網頁瀏覽器運作。

# mount_ftp ftp://user:password@hostname/directory/path node

NFS
Mac OSX上面同時內建BSD上面的NFS的client端與server端的程式(version 3),當然也包含NQ這個延伸套件。其幕後程序:rpc.lockd、rpc.statd、nfsiod…等。

SMB/CIFS
Mac OSX “Panther"內建Samba 3.0。

其他/偽裝的檔案系統

cddafs
cdda檔案系統主要是要用來讓音樂CD上面的音軌偽裝成aiff檔案格式。除此之外,如果音軌名稱可以順利嵌入,系統會自動地會音軌“檔案“找到一個對 應的檔名。
所以當你放入一片CD到你的Mac上時,Mac OSX會用cddafs將其掛載起來。你也可以透過指令模式完成:

# mount_cddafs /dev/disk /tmp/audiocd

deadfs
當底層的檔案系統跟vnode(在vclean()操 作下)分離時,他的vnode作向量將會導向dead filesystem。除了close()程序之外,其他程序都無法在dead filesystem裡面運行。如果你想要終止一個已經登出的使用者在幕後的執行程序,但是卻因為身分權限的關係而沒有這樣的控制權,你就可以透過 Terminla以deadfs來取代那個程序的vnode。

devfs
devfs,裝置檔案系統,一般都是掛載在/dev這個目錄底下。通常都會在BSD初始化過程中載入Mac OSX的核心,當然你也可以在開機完成之後用mount_devfs指令掛載:

# mount -t devfs devfs /tmp/dev

fdesc
fdesc檔案系統都掛載在/dev/fd目錄底下,功能角度來看它的角色很像是Linux上面的/proc//fd(或是 /proc/self/fd)。這玩意兒提供一個所有正在運行的程序的活動檔案描述子的清單。提醒一下,Linux上面/dev/fd是 /proc/self/fd的連結檔。
/etc/rc會在系統啟動過程中掛載fdesc:

# mount -t fdesc -o union stdin /dev

fifofs
fifofs功能目的跟specfs很相像。

loop
功能上很像是Linux上面的loop(或是Solaris的lofi),讓你可以簡單地在磁碟映像檔上面點兩下滑鼠,就自動地掛載起來。當然如果你願意 用指令模式,那功能會更多一點:

# hdid floppy.img
/dev/disk3

# hdid http://127.0.0.1/disk.img
/dev/disk4

disk3、disk4將會偽裝成像是普通的磁碟一樣。需要注意的是如果你是透過HTTP方式去掛載,那它會是個雙叉檔案,你需要比較多的技巧才能順利使用。
hdid還可以指向磁碟映像檔案底下的“影子檔“。

nullfs
null mount filesystem在4.4BSD裡是個可以堆疊起來的檔案系統,它允許將不同地方的磁區掛載成一個檔案系統。也就是將多個目錄整合成一個目錄樹,於是 乎,你可以將不同硬碟通通掛載成一個目錄樹,而底下的目錄樹還可以將可讀寫的權限設定為唯讀。
這東西跟union mount有個小小不同點,nullfs會完全跳過下列VFS/vnode讓他們保持原來的檔案格式:
vop_getattr()、vop_lock()、vop_unlock()、vop_inactive()、vop_reclaim()、 vop_print()。

null檔案系統層一樣是預設的標準檔案系統,而新建的層可以將null作為模板來使用。
最後,我想這是一定要強調的:雖然nullfs是Darwin核心原始碼中bsd子樹,但事實上Mac OSX並沒有使用它。

ramfs
ramfs可用以下方式在Mac OSX裡創建:

# hdid -nomount ram://1024
/dev/disk3

上面這指令會製造出一個1024個磁柱的記憶體磁碟(一個磁柱大小是512),並其後顯示掛載結果的磁碟名稱。之後,你就可以製作一個檔案系統在這個裝置 上面:

# newfs_msdos /dev/rdisk3
/dev/rdisk3: 985 sectors in 985 FAT12 clusters (512 bytes/cluster)
bps=512 spc=1 res=1 nft=2 rde=512 sec=1024 mid=0xf0 spf=3 spt=32 hds=16 hid=0

這磁碟還可以這樣掛載起來:

# mount -t msdos /dev/disk3 /tmp/msdos
# mount
/dev/disk0s3 on / (local, journaled)
devfs on /dev (local)
fdesc on /dev (union)
on /.vol
automount -nsl [148] on /Network (automounted)
automount -fstab [155] on /automount/Servers (automounted)
automount -static [155] on /automount/static (automounted)
/dev/disk2s10 on /Volumes/Firewire (local, nodev, nosuid, journaled)

如果你要卸載,請這樣作:

#hdiutil detach /dev/disk3
“disk3″ unmounted.
“disk3″ ejected.

specfs
裝置和FIFO可以存在於任何的檔案系統上面,這表示 它們的名稱或是屬性都可以被主檔案系統所接受;然而主檔案系統並不能完全掌管其運作,裝置還需要透過其底層的驅動程式驅動。也就是說,每個裝置化身還是需 要經過適當的驗證與控制。
specfs的功用就是將上述運作變得簡單容易。但是specfs本身是使用者看不見的檔案系統,並且它不會掛載 在任何地方。

synthfs
synthfs是個存在於記憶體裡面的一個偽裝型檔案系統,它的功用是建立一個任意型目錄樹。synthfs並非是出自於FreeBSD的產物。
掛載synthfs就像是掛載典型的偽裝型檔案系統一樣:

# mount -t synthfs synthfs /tmp/synthfs

union
關於4.4BSD的union檔案系統,在Union Mounts in 4.4BSD-Lite這篇文章裡面有相當詳盡的說明以及相類似檔案系統的簡史。用最簡單的解說方式:union檔案系統比 起null檔案系統,更進一步地步將檔案通通隱藏在已掛載的目錄底下。它將不同的目錄包裝成像一個一樣。
可以參考下列一連串指令,看看union基本內容:

# hdiutil create /tmp/msdos1 -volname one
-megabytes 1 -fs MS-DOS

created: /tmp/msdos1.dmg
# hdiutil create /tmp/msdos2 -volname two
-megabytes 1 -fs MS-DOS

created: /tmp/msdos2.dmg
# hdid -nomount /tmp/msdos1.dmg
/dev/disk3
# hdid -nomount /tmp/msdos2.dmg
/dev/disk4
# mount -t msdos /dev/disk3 /tmp/union
# echo “msdos1: a" > /tmp/union/a.txt
# umount /dev/disk3
# mount -t msdos /dev/disk4 /tmp/union
# echo “msdos2: a" > /tmp/union/a.txt
# echo “msdos2: b" > /tmp/union/b.txt
# umount /dev/disk4
# mount -t msdos -o union /dev/disk3 /tmp/union
# mount -t msdos -o union /dev/disk4 /tmp/union
# ls /tmp/union
a.txt b.txt
# cat /tmp/union/a.txt
msdos2: a
# umount /dev/disk4
# ls /tmp/union
a.txt
# cat /tmp/union/a.txt
msdos1: a
# umount /dev/disk3
# mount -t msdos -o union /dev/disk4 /tmp/union
# mount -t msdos -o union /dev/disk3 /tmp/union
# cat /tmp/union/a.txt
msdos1: a

真實案例:/etc/rc將一個descriptor檔案系統掛載成一個union

# mount -t fdesc -o union stdin /dev

volfs
volfs,卷宗檔案系統,是HFS+、 VFS上面的一個虛擬檔案系統,支援兩個不同的API(POSIX/Unix路徑名稱與Mac OS )。其存在目的就是為了能夠支援Carbon檔案管理員的API在BSD檔案系統上面運行。

支援volfs的檔案系統有:HFS+、HFS、ISO9660與UDF。

參閱下面例子:

# mount
/dev/disk0s9 on / (local, journaled)
devfs on /dev/ (local)
fdesc on /dev (union)
on /.vol

#ls -l /.vol
total 0

簡單說,就是掛載在/.下面的儲存裝置都會表示在/.vol下面
再以/mach_kernel檔案為例:

# ls -li /mach_kernel

這個檔案隨後會在/.volfs被接受(1045670是檔案的inode數字)

# ls -li /.vol/234881033/1045670

volfs通常是在系統啟動過程中掛載在/etc/rc底下

# mkdir -p -m 0555 /.vol && chmod 0555 /.vol && mount_volfs /.vol

關於XYZ?

雖然說Mac OSX已經支援了相當多的檔案系統,但是你或許還是會碰到沒被支援到的。像是Linux上面的ext2/3和Reiser就沒有支援,但是你還是能找到開放原始碼的工具—ext2 for Mac OSX—來解決問題。
有趣的是,BootX,Mac OSX的開機控制程式卻支援ext2檔案系統,甚至還可以從中載入核心來開機。
這邊遺漏了一個重點:proc檔案系統!關於這部份,請參考/proc on Mac OSX這篇文章吧。

本文由張元毓所翻譯,本人保有一切法律權利。
Copyright@ alan chang