進度緩慢,今年搞不好沒機會達到百片…
gdb 連到遠端 gdbserver 的指令
遠端先把 gdbserver 啟動,並指定 ip:port,例如:gdbserver 192.168.11.1:10000 hello
那麼本地端在啟動 gdb 以後,就可以用以下指令連到遠端:target remote 192.168.11.1:10000
再以 symbol-file 載入有除錯資訊的檔案,就可以進行 debug 了。
電影流水帳(2009/4/21~2009/4/24)
ecryptfsd
ecryptfs-utils 裡的 ecryptfsd 可以透過 netlink 或 misc 方式與 kernel 的 ecryptfs module 溝通,Ubuntu 有修改過 kernel 的 ecryptfs ,讓 ecryptfsd 以 misc 的方式溝通。
而我,就卡在這裡搞了好久,因為我始終用 kernel 的預設值,也就是 netlink 的方式。
照理來說,netlink 應該也是可以才對,只是在 ecryptfsd 裡有段 code(嚴格來說應該是 libecryptfs.so),在以 sendto 送出封包以後,檢查回傳值,如果大於 0 ,就當作錯誤。你可以查一下 sendto 函式的說明,裡面清楚地寫了,當傳送成功,會回傳 sendto() 所送出的 byte 數。ecryptfsd 以 sendto 送出了 16 bytes,收也收到了 16 bytes,這樣應該是要當作成功,但程式裡卻視為失敗。
我不知道修正這裡以後還會遇到什麼問題,所以我決定很鴕鳥地去改用 ubuntu 的 kernel …
電影流水帳(2009/3/28~2009/4/20)
這幾年好萊塢都在努力尋找新題材,除了重拍以外,還有找漫畫跟電玩的故事。不知道Dragonball好不好看…
- Dan in Real Life(IMDB, Wikipedia),中譯:老爸行不行。由Steve Carell跟Juliette Binoche主演,故事的前半其實很有趣,男主角不小心邂逅的 100% 女人,居然是弟弟要帶回家跟家族認識的女朋友,於是發生了很多衝突,到這邊,我都覺得很不錯,只是到最後來了一個快樂的 ending,顯得有點突兀。
- The Spirit(IMDB, Wikipedia),中譯:閃靈俠。視覺風格跟我沒緣看的Sin City很相似,都是以強烈的色彩來凸顯劇情,看過 IMDB,才知道是同一個導演拍的。故事還可以。Scarlett Johansson扮演的角色跟怪怪的主角-The spirit 尤其有趣~而Eva Mendes在片裡把她的好身材完全展現,超正~
- Fast & Furious 4(IMDB, Wikipedia),中譯:玩命關頭4。女主角很正,但故事就乏善可陳…沒什麼好說的。
- INKHEART(IMDB, Wikipedia),中譯:墨水心。相較於哈利波特系列電影,差了些,或許原著小說會比較精彩,但我沒看過小說,無從比較起。台灣有出中譯本,而且還有好幾個版本…等明年去圖書館借…
- The day The earth stood still(IMDB, Wikipedia),中譯:當地球停止轉動。這部片子其實是重拍 1951 年的版本:The Day the Earth Stood Still。女主角是很正的Jennifer Connelly,她是1970 年生的…只比我大五歲…而且還是童星,7歲就開始演戲了…;而男主角Keanu Reeves實在是很適合這種角色…裡面的小男孩則是 Will Smith 的兒子,我看了好一會才認出來。嚴格來說,我覺得拍得並不好,不過特效倒是還可以。5x分的時候有一段以普通話(漢語)的對話,很令人發噱~。
直接設定密碼免提示輸入
用 passwd 設定密碼是免不了要回答提示問題的,有方法可以省掉嗎?
如果可以省掉,在大量設定密碼的情況下會很方便。
方法說穿了很簡單,先用 mkpasswd 產生密碼,再用 usermod 來變更使用者密碼。
以下節錄自 call useradd and passwd through no prompt script – LinuxQuestions.org
#!/bin/bash ## Set a default password and perform a password reset l_user=$1 if [ "$l_user" != "" ] then l_password="Reset" l_encrypted_pass=$(mkpasswd -s --hash=md5 ${l_password}) echo "/usr/sbin/usermod -p ${l_encrypted_pass} ${l_user}" fi
感恩啦!本來已經想用 sed/awk 去硬改 passwd/shadow 檔案了說…
TPM 與 ecryptfs
基本都是參考:
- [Ecryptfs-users] Ecryptfs with TPM via Trousers on Centos 5.2
- Encrypting file systems using eCryptfs
- Create an Encrypted Private Directory with eCryptfs | Tombuntu
- How to use a TPM with Linux – GrouNation
另外遇到問題可以參考 IBM 的 troubleshooting,最近 IBM 不知道是網站改版還怎樣,之前留的網址都失聯了,你可以用 ibm ecryptfs troubleshooting 去 google 找。
下面的步驟最好全部以 root 或 sudo 來執行:
- 進 BIOS 把 TPM clear 掉
- 我的環境正好是用 infineon 的,所以用 modprobe tpm_infineon,一般好像是用 tpm_tis 就行了。
- 啟動 trousers:tcsd -f,不用 -f 的話,會掛…這個 daemon 提供 tspi 服務並且與 TPM device 溝通。
- 取得 ownership:tpm_takeownership ,這個步驟裡,SRK password 跟其後的 Confirm password 不要輸入!!否則要回到步驟 0 重設。SRK 是 Storage Root Key 的縮寫,不使用密碼保護的原因是為了 ecryptfs 取用方便。
- 掛載 ecryptfs:modprobe ecryptfs
- 啟動 ecryptfsd
- 產生 UUID:ecryptfs-generate-tpm-key -p 1 ,這個 UUID 是提領 key 用的,實際的 key 會透過 PCR 1 的 key 來取得(如果我沒理解錯的話)。
至此,準備工作已經完成,接下來就是操作,這裡我假設 private 是放置要加密的資料的地方:
- 先建立:mkdir private
- 進行掛載:mount -t ecryptfs private private
- 依序回答問題,第一個先選 tspi,第二個問題(cipher)選 aes,第三個問題(key bytes)選 16 bytes,第四個問題(passthrough)選 n,最後問題照預設值。第一個問題是加密方式,你也可以使用其他方式,但這樣就用不到 TPM 了;cipher 跟 key bytes 可以視需要自行調整。這樣就能 mount 上,mount 以後,ecryptfs 會把 UUID 存到 keyring (用 keyctl show 可以看 keyring 內容)裡。
在 private 資料夾裡的操作,基本上不能複寫,只能複製、貼上,但 vim 可編輯。
umount 之前,最好先輸入 mount,把參數記下。
umount 之後,可以直接以參數來掛載,這樣就不用再次回答問題:mount -t ecryptfs -o sig=UUID,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=n private private
參數裡,有個 sig,這個 sig 就是填 UUID,不過你輸入 mount 時,看到的卻不是 UUID,而是一個較短的字串。這字串其實是一個提領 UUID 的鑰匙,ecryptfs 會用這個鑰匙去 keyring 裡(用 keyctl show 可以看到),取出 UUID,再以 UUID 去掛載。keyring 主要存放在 kernel 的某個地方,所以重開機以後就會消失,我還不知道怎麼把 keyring 內容存起來。
好吧,以上就是我這幾天跟 TPM 奮戰的紀錄…
Seed(4) – Database
Seed 也支援對資料庫的存取,目前只支援 SQLite。
用法也超級簡單…
基本上只有 constructor 跟用來執行 SQL 的 exec()。以下代碼來自源碼裡 (modules/sqlite/example.js):
[javascript]
#!/usr/local/bin/seed
Seed.import_namespace(“sqlite”);
d = new sqlite.Database(Seed.argv[2]);
d.exec(“create table t1 (t1key INTEGER PRIMARY KEY,data TEXT,num double,timeEnter DATE);”);
d.exec(“insert into t1 (data,num) values (‘This is sample data’,3);”);
d.exec(“insert into t1 (data,num) values (‘More sample data’,6);”);
d.exec(“insert into t1 (data,num) values (‘And a little more’,9);”);
d.exec(“select * from t1”, function(results){Seed.print(JSON.stringify(results))});
[/javascript]
取出資料的作法則是將 callback 傳入,以處理一筆 record。上面是用 JSON 輸出整筆 record 內容,其實你也可以將欄位名稱代入 indexer 來取得該欄內容:
[javascript]
d.exec(“select * from t1”, function(results){Seed.print(results[“data”])});
[/javascript]