2009年8月29日 星期六

dm-crypt 與加密磁區容器

因為之前我新買不到一年的硬碟毫無預警地(HDD SMART 都還在良好)就壞掉了,所以我現在對所有的硬碟商都抱持不信任的態度,硬碟只能當作耗材。所以我昨天我又去買了一個隨身硬碟用來備分我的重要資料。不過隨身硬碟有一個問題就是為了要讓 Windows 也能讀取,所以我必需要讓隨身硬碟本身的檔案系統是 NTFS 或 FAT32,可是我又希望我在 Linux 之下的檔案屬性、權限不要亂動,所以我只好使用一個折衷的方案:建立一個容器,再把這一個容器當成 device,mount 到我的系統樹上面。在 Linux 之下,這很容易。

建立步驟:
  1. dd if=/dev/zero of=TARGET bs=1G count=40
  2. sudo mkfs.ext3 TARGET

使用步驟:
  1. sudo mkdir /media/DISKNAME
  2. sudo mount TARGET /media/DISKNAME -o loop
  3. ... (做你想做得事)
  4. sudo umount /media/DISKNAME
  5. sudo rmdir /media/DISKNAME


不過我後來又想到我想要把資料加密,因為我不想要我的資料被偷看。印象中有一個叫 dm-crypt 的 Linux 2.6 的模組可以把一個普通檔案映射成一個加密硬碟,只要 umount 之後,沒有你的密碼,誰也不能讀取。

事前準備:
  1. sudo aptitude install dmsetup cryptsetup
這二個套件一定要先安裝起來,dmsetup 是 device mapper 的工具;cryptsetup 是 dm_crypt 的工具。另外因為我用得 Linux 發行版是 Ubuntu (9.04),Ubuntu 有把 aes 還有 dm_crypt 編譯成模組,如果你的系統沒有把這二個功能編入核心,也沒有編為模組,你可能需要重新編譯你的 Linux Kernel。


掛載系統模組:
  1. sudo modprobe aes
  2. sudo modprobe dm_crypt


建立步驟:
  1. sudo dd if=/dev/zero of=TARGET bs=1G count=40
  2. sudo losetup /dev/loop0 TARGET
    備註: 這個步驟的 /dev/loop0 可以用任何一個 LOOP device 取代。
  3. sudo cryptsetup -y create CRYPTDEVNAME /dev/loop0 -c aes
    備註: 你必須要輸入密碼二次。
  4. sudo mkfs.ext3 /dev/mapper/CRYPTDEVNAME
  5. sudo cryptsetup remove CRYPTDEVNAME
  6. sudo losetup -d /dev/loop0


使用步驟:
  1. sudo losetup /dev/loop0 TARGET
  2. sudo cryptsetup create CRYPTDEVNAME /dev/loop0 -c aes
    備註: 即使你輸入的密碼是錯誤的也不會有任何提示。
  3. sudo mkdir /media/MNTNAME
  4. sudo mount /dev/mapper/CRYPTDEVNAME /media/MNTNAME
    備註: 如果這時有錯誤,不要急著修復檔案系統,如果亂動,資料就一去不復返了。這一個錯誤有可能是因為之前在 cryptsetup 的時候,你輸入的密碼是錯誤的,使用 cryptsetup remove,然後回到 2 重新輸入一次你的密碼。
  5. ... (做你想做得事)
  6. sudo umount /media/MNTNAME
  7. sudo rmdir /media/MNTNAME
  8. sudo cryptsetup remove CRYPTDEVNAME
  9. sudo losetup -d /dev/loop0
我稍微講解一下,losetup 是用來把一個檔案「掛載」成為 LOOP device 的指令,我們一開始要先把檔案「掛載」成一個「裝置」。然後,cryptsetup 是利用 device mapper (裝置對映) 功能來進行加密,所以經過一次對映之後,我們的裝置會出現在 /dev/mapper 之中,我們可以用 sudo dmsetup ls 來觀察。剩下的就是我們要把 /dev/mapper 之中的那一個裝置,mount 到我們的系統樹,也就是 / 的上面,我遵照 Ubuntu 的習慣把它 mount 在 /media 之中的一個子資料夾。

另外,第 8, 9 二步是不能少的,不然有 root 權限的有心人士不用輸入密碼也可以 mount 你的資料。

備註: 用 losetup mount 起來的 device,其根目錄是只有 root 才有寫入權限的,解決方法是在根目錄用 sudo mkdir 建立一個子目錄,然後用 sudo chown 把使用權轉移給其他使用者。


後讀工作(可選):
  1. sudo modprobe -r dm_crypt
  2. sudo modprobe -r aes
這二個步驟是要用來卸載 dm_crypt 還有 aes 這二個系統模組。

2009年8月26日 星期三

C++ concept 與 Haskell type class

今天開始看《泛型程式設計與STL》這一本書,一開始我看到了 concept,他在 STL 之中,只是一個概念,在 C++ 之中沒有真正與之對應的程式語法。concept 代表的是一種概念,例如: 我們說 Iterator(迭代器)是一個 concept,Iterator 可以進行 dereference, increase, 之類的操作,而 pointer 就是一個 Iterator concept 的 model。

而在 C++0x 之中,本來有一個很振奮人心的提案,就叫 concept,就是要用來對映 STL 之中 concept 的語意,並提供編譯器更好的解析工具,使得我們對各種型別可以有更嚴謹的定義。可惜好像不會在 C++0x 推出,而且被 Delay (但還沒有被放棄)。

我在看 C++ concept 的時候,我腦海忽然想到之前在 Haskell 學得type class,我覺得他們的目的還有語意都十分相似,上網搜尋一下,還真得有期刊是在寫 Haskell type class vs C++ concept。

想一想還真有趣!

2009年8月25日 星期二

新網站

今天我越看越覺得我的原來的個人網站長得很醜,當時那一個網頁是為了寫計概作業趕工寫出來的。所以沒有什麼設計感,大部分都是長方型,以及深底白字的色塊。這一次我就走不同的風格,我是以淡藍色當作底色,輔以有一點夢幻的紫色,再加上一支羽毛,希望可以讓整個網頁看起來清爽一點,比較不會有一種沉重的感覺。

不過我還沒有完全寫好就是了。有一些資料也還沒有整合起來,不過樣版大概是這樣不會變了吧!

新網站的網址: http://w.csie.org/~b97073

2009年8月24日 星期一

網誌開張

雖然在 ptt2 有一個個版(版名: logan)可是 ptt2 有一些缺點,例如 Google 搜尋不到,其次有時候有一些東西用 bbs 來呈現不太容易,所以我現在再開一個部落格。

當然還有一個目的是要取得一個屬於我的網域,這樣開發 Mozilla Firefox 的套件的時候,才可以指定我的網域。

以下是其他聯絡我的方法:
以後我想我會把一些比較完整的文章發佈到這裡,方便大家觀看以及追縱我的近況。