2013年8月28日 星期三

在 Ubuntu 上面 Linux Container 的使用心得

Linux Container (以下簡稱為 lxc) 是一個輕量級的虛擬化系統,介於 VirtualBox/VMWare/... 以及打過類固醇的 chroot 之間,簡單來說 lxc 建立了一個 chroot 的環境,但是這個 chroot 的環境卻可以做資源控制,像是 CPU 用量、硬碟空間、記憶體空間、網路還有其它資源等等。

我們可以在上面安裝其它 Linux Distribution 的環境,看看 /usr/share/lxc/templates 這個目錄底下有支援 Arch, Debian, Fedora, openSUSE, Ubuntu 還有其它。

lxc 也可以用來建立雲端作業環境,又或者用來玩 Steam(TM) 上面的遊戲。

參考 LXC LXC 這兩份線上文件也許是個不錯的入門起點。

在 Ubuntu 上面使用只要安裝 lxc 這個軟體套件就可以了。

sudo apt-get install lxc

如果是在 Ubuntu 12.04 上面,建議使用 precise-backports 裡面的 lxc 效果會比較好,如果想要在 x86 上面建立 arm 的虛擬環境就要借助安裝使用 qemu-user-static 這個軟體套件。

sudo apt-get install qemu-user-static

在使用 lxc 之前可以先執行 `lxc-checkconfig` 來檢查環境。

然後就可以開始建立一個 lxc 的實體了,例如想要建立 Ubuntu 12.04 i386 就可以執行以下指令。

sudo lxc-create -t ubuntu -n myLXC -- -r precise -a i386

當中的 precise 可以換成 quantal/raring/saucy/... 而 i386 則可以換成 amd64/armel/armhf/... 然後 myLXC 則是這個 lxc 實體的名稱。

等待一段時間後,等到它建立完成就可以執行以下指令在背景啟動它。

sudo lxc-start -n myLXC -d

如果想要登入就可以執行:

sudo lxc-console -n myLXC

如果想要離開就要使用特殊的指令組合 <Ctrl+a q>

`sudo lxc-list`
可以看到每個 lxc 的情況。
`sudo lxc-stop -n myLXC`
停止 myLXC 這個 lxc 實體。
`sudo lxc-destroy -n myLXC`
刪除 myLXC 這個 lxc 實體。
`sudo lxc-start-ephemeral -o myLXC -d`
從 myLXC 建立並啟動一個暫時用完即丟的 lxc 實體

大概就是這樣。:-)

P.S. 執行 `sudo SUITE=sid MIRROR=http://ftp.tw.debian.org/debian/ lxc-create -t debian -n sid` 可以用來建立一個 Debian sid 的環境。

2013年8月26日 星期一

使用 git-buildpackage 維護原本就是使用 Git 維護的上游軟體的 Debian package

首先是將上游軟體的原始碼庫抓回來。

git clone https://github.com/fourdollars/x11-touchscreen-calibrator.git

然後是進到該原始碼目錄底下匯入已經釋出的 tarball

git-import-orig --upstream-vcs-tag=0.0 --upstream-branch=master --pristine-tar ../x11-touchscreen-calibrator_0.0.orig.tar.xz

上面這個指令會建立一個 commit 將 tarball 的內容 import 進去,並且建立一個 upstream/0.0 的 tag,只不過 master 也會指過去,所以再執行以下的指令倒回。

git reset --hard HEAD^

接下來是開始製作 Debian package 的部份,先建立一個 debian 的分支。

git checkout -b debian

然後在將 debian/ 這個目錄所需要的檔案都準備好,最後再 commit,然後就可以使用下面的指令來產生 Debian source package。

git-buildpackage --git-pristine-tar --git-debian-branch=debian -S --lintian-opts --profile debian

上面指令中的 `--lintian-opts --profile debian` 是在 Ubuntu 上面才需要加入的,如果在 Debian 裡面應該不需要使用。

另外,在還沒有完全準備好 debian/ 底下的檔案之前,也可以加入使用 `--git-ignore-new` 先試試看產生出來的 Debian source package 的品質如何,再決定要不要 commit。

等到這個 Debian package 已經成功被放進 Debian 官方套件庫裡面,就可以執行以下指令建立 debian/0.0-1 的 tag。

git-buildpackage --git-tag --git-pristine-tar --git-debian-branch=debian -S --lintian-opts --profile debian

最後就可以執行

git push --tags
將所有的 commit 跟 tag 都送回原本的 Git Repo 裡面。

參考文件:

2013年8月7日 星期三

使用 GDB 追縱執行中程式裡面的變數值

首先是要安裝 debug symbols 的套件來使用。

Debian 可以參考 HowToGetABacktrace - Debian Wiki
Ubuntu 可以參考 DebuggingProgramCrash - Ubuntu Wiki

例如目標是 Ubuntu 12.04 中的 Xorg 裡面的 positionSprite() 函式在執行時傳入的變數值,所以先用

$ ps aux | grep X
root      1044  0.4  1.0 127440 21524 tty7     Ss+  18:44   0:06 /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none
u         2633  0.0  0.0  13616   928 pts/2    S+   19:11   0:00 grep --color=auto X
來找出 Xorg 的 PID

然後執行以下指令:

$ sudo gdb /usr/bin/Xorg 1044                                                                                                                                                                         
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /usr/bin/Xorg...Reading symbols from /usr/lib/debug/usr/bin/Xorg...done.
done.
Attaching to program: /usr/bin/Xorg, process 1044
Reading symbols from /lib/x86_64-linux-gnu/libudev.so.0...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libudev.so.0
... [省略]
(gdb) set height 0
(gdb) break positionSprite
Breakpoint 1 at 0x7fedc71d1140: file ../../dix/getevents.c, line 940.
(gdb) c
Continuing.

Breakpoint 1, positionSprite (dev=0x7fedc94105d0, mode=0, mask=0x7fff3c6e6780, devx=0x7fff3c6e6770, devy=0x7fff3c6e6778, screenx=0x7fff3c6e6760, screeny=0x7fff3c6e6768) at ../../dix/getevents.c:940
940     ../../dix/getevents.c: 沒有此一檔案或目錄.
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>print *devx
>print *devy
>print *screenx
>print *screeny
>continue
>end
(gdb) c
Continuing.

接下來移動滑鼠就可以看到以下的訊息。

Breakpoint 1, positionSprite (dev=0x7fedc94105d0, mode=0, mask=0x7fff3c6e6780, devx=0x7fff3c6e6770, devy=0x7fff3c6e6778, screenx=0x7fff3c6e6760, screeny=0x7fff3c6e6768) at ../../dix/getevents.c:940
940     in ../../dix/getevents.c
$45 = 1023.4510981145139
$46 = 757.60130195816362
$47 = 1366.6023460649326
$48 = 758.58904811456273

Breakpoint 1, positionSprite (dev=0x7fedc94105d0, mode=0, mask=0x7fff3c6e6780, devx=0x7fff3c6e6770, devy=0x7fff3c6e6778, screenx=0x7fff3c6e6760, screeny=0x7fff3c6e6768) at ../../dix/getevents.c:940
940     in ../../dix/getevents.c
$49 = 1022.651098102593
$50 = 757.60130195816362
$51 = 1365.5341153549775
$52 = 758.58904811456273

可以將設定好的 breakpoints 的動作儲存成一個腳本檔

(gdb) save breakpoints break.cmd
Saved to file 'break.cmd'.

腳本的內容是:

set height 0
break positionSprite
  commands
    print *devx
    print *devy
    print *screenx
    print *screeny
    cont
  end

只是第一行的 set height 0 是手動加上去的,目的是不要訊息過長就停下來。

下次再使用 GDB 時就可以執行 source 載入使用。

(gdb) source break.cmd 
Breakpoint 1 at 0x7fedc71d1140: file ../../dix/getevents.c, line 940.
(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00007fedc71d1140 in positionSprite at ../../dix/getevents.c:940
        print *devx
        print *devy
        print *screenx
        print *screeny
        cont

只是前面有一個找不到原始碼的小問題,可以執行以下指令來下載原始碼:

$ apt-get source xserver-xorg-core-lts-quantal
或是:
$ pull-lp-source xorg-server-lts-quantal precise

然後再執行:

$ sudo gdb /usr/bin/Xorg 1044 -d xorg-server-lts-quantal-1.13.0

最後 GDB 有其它的 Frontend 可以使用,像是 cgdb 以及 ddd 在這裡就不多提了。

2013年8月5日 星期一

COSCUP 2013 第一天晚上的 Key Signing Party 之後要做的事情

大致上需要的工具在以前的文章就有提到了,所以先參考 利用 caff 來加速 GPG sign 的過程加入 GnuPG 的信任簽章進自己的金鑰圈裡 以及 利用 ssmtp 透過 Gmail 在文字模式下寄信

然後就是以下的四大步驟:

一、首先是簽署所有信任的簽章寄給對方
$ caff 3860D2A5 CEC6AD46 FEBFB7FE 3D058888 54D0F048 642EC1C5 24FF2AE5 0914A01A 03F4552D B6A93879 012596EC 3C728A5D 4A293CBD 35D0CEF2 206AFB69 F37883B4 E9D4AEB6 1478504E 524E09E7
二、然後是匯入所有人的簽章
$ gpg --recv-keys 3860D2A5 CEC6AD46 FEBFB7FE 3D058888 54D0F048 642EC1C5 24FF2AE5 0914A01A 03F4552D B6A93879 012596EC 3C728A5D 4A293CBD 35D0CEF2 206AFB69 F37883B4 E9D4AEB6 1478504E 524E09E7
三、再來是匯入別人對我簽署過的簽章

因為我用的是 Gmail 所以我是執行

$ gpg -d | gpg --import
然後從 Gmail 上面來一個一個的複製貼上 (過程中需要按下 Ctrl-D 產生一個 EOF 來完成)

四、最後就是將別人對我的信任簽章上傳到網路上
gpg --send-keys E9EC46F5A547F31E

最後的三跟四步驟就是等別人寄他的信任簽章過來,再不斷地重覆上傳到網路上。