2013年3月12日 星期二

使用 notebook 上的無線網卡來當無線 AP - arch linux 篇

以 notebook 上的無線網卡來當 ap ,讓其他行動裝置可以透過 notebook 上網
wireless ap 伺服器使用 hostapd 。
而自動配發 ip 的 dhcp server 使用 dnsmasq ,比較簡單設定。
步驟如下:
1. 設定 hostapd
2. 設定 dhcp server
3. 設定網路及 nat
4. 啟動
5. 以行動裝置連線測試

 

1. hostapd:

安裝 hostapd:

$ sudo pacman -S hostapd

設定 hostapd:

$ sudo vi /etc/hostapd/hostapd.conf
interface=wlan0
ssid=天氣很好喲
hw_mode=g
channel=1
wpa=2
wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

只要注意以上這幾個選項,其他的可以暫時不用管,基本上 hostapd 可以很複雜,配合 radius server 可以讓使用者先連上,再開啟瀏覽器來做認證的方式,這裡不使用那種方式。

#1 - wpa only
#2 - wpa2 only
#3 - both
wpa=3
允許的話,直接用 wpa2 是最好的,若是某些行動裝置並不支援 wpa2,可以將 wpa 也打開或甚至是用 wep,不過,你知道的,鄰居也可以跟你一起用。
wep_default_key=0
wep_key0=123456789a

ssid 可以使用中文耶。這裡設定認證方式為 WPA2,而密碼可以用 wpa_psk 或 wpa_passphrase 來設定,建議以 wpa_psk 的方式,因為有編碼過,無法從設定檔裡直接看到。
wpa_passphrase=this is a passphrase
以 wpa_passphrase 指令來產生 wpa_psk,以 ssid 加上密碼產生出的一段文字
$ wpa_passphrase 天氣很好喲 123456789a
network={
ssid="天氣很好喲"
    #psk="123456789a"
psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
}

因此,取出 psk= 後面的這串文字放到設定檔中即可
wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3

 

2. dhcp server 設定:

dhcp server 這裡是使用 dnsmasq,因為比較簡單,若要改用 isc dhcp server 當然也行,請自行設定。

 

安裝 dnsmasq:

$ sudo pacman -S dnsmasq

 

設定 dnsmasq:

$ grep -v -e ^# -e ^$ /etc/dnsmasq.conf
port=0
dhcp-option=6,168.95.192.1,168.95.1.1
interface=wlan0
listen-address=192.168.199.254
dhcp-range=192.168.199.101,192.168.199.150,12h
port=0
dns server listen 的埠,預設是 53,設為 0 表示將 dns server 關閉,dnsmasq 有 dns server 及 dhcp server 的功能,而我們只要用到 dhcp server。
dhcp-option=6,168.95.192.1,168.95.1.1
將 dns server 設成 168.95.192.1 及 168.95.1.1 (hinet dns server) 並送給 dhcp client

 

3.網路設定及 nat 功能:


新增一個設定檔,內容如下:
$ sudo vi /etc/network.d/hostapd
CONNECTION='none'
CONNECTION='ethernet'
DESCRIPTION="wireless ap in master mode with hostapd"
IP="static"
ADDR="192.168.199.254"
INTERFACE=wlan0
SKIPNOCARRIER="yes"

POST_UP="iptables -I FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -I FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -I POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=1; iptables -I INPUT -i wlan0 -p udp --dport 67 -j ACCEPT; systemctl start hostapd; systemctl start dnsmasq"

POST_DOWN="systemctl stop hostapd; systemctl stop dnsmasq; iptables -D FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -D FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -D POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=0; iptables -D INPUT -i wlan0 -p udp --dport 67 -j ACCEPT"


由於我們 wireless 的設定在 hostapd 中,所以在 netcfg 這邊,完全不要動 wireless 的部份,設成 CONNECTION='none',而系統預設沒有 none 這種 connections,所以我們自己手動建立。
$ cat << EOF > /tmp/none
#!/bin/bash
exit 0
EOF
按 ctrl-d

$ sudo chmod 755 /tmp/none
$ sudo chown root:root /tmp/none
$ sudo mv /tmp/none /usr/lib/network/connections/none

這樣即可產生 none 的 connections,內容是不做任何事,傳回 0
因此設成 CONNECTION='ethernet',將 wlan0 當做 ethernet 來啟動就好,不要套一些 wireless 的設定,如設定 essid 的東西。但由於 ethernet 的 script 中會去偵測網路線是否有插上,可是 wlan0 是無法取得目前狀態是否有插網路線,因此會失敗,無法完成,所以設定檔中要加上 SKIPNOCARRIER 來跳過偵測。

這裡範例對外介面為 ppp0,對內介面為 wlan0,表示在啟動 wlan0 介面後,再將 hostapd 及 dnsmasq 啟動,並設定好 firewall(包含打開 nat 功能、 kernel ip_forward 功能及 dhcp server listen udp port 67);於 wlan0 停止後,自動關閉 dnsmasq 及 hostapd,並關閉 nat 及相關功能。

 

4. 啟動及關閉:


啟動:
$ sudo netcfg hostapd
$ sudo systemctl start netcfg@hostapd

關閉:
$ sudo netcfg down hostapd
$ sudo systemctl stop netcfg@hostapd

開機時啟動:
$ sudo systemctl enable netcfg@hostapd

若無錯誤訊息,此時 wlan0 介面已經起來,hostapd 及 dnsmasq daemon 已在背景跑。

 

5. 連線測試:

這時以手機、平板或另一個無線裝置來連看看,若沒問題的話,應該就可以上網了。
基本上,只有幾個步驟而已,不過要注意的是,若同時有 network-manager 之類的工具,可能會來搶 wlan0,因此要注意將 network-manager 先關閉再進行測試比較不會出狀況。

總結:

arch linux 的 netcfg 功能非常強大且完整,在設定寫了一堆指令,看起來滿亂的,其實可以寫成另外的 script,再由設定檔中呼叫。這裡是為了解說方便,因此全部擠在一起。
原本是直接使用 wireless ad-hoc mode,不用額外裝 daemon,但是後來發現 android 不支援 ad-hoc mode,根本掃描不到 ap,無法使用。因此才改用 hostapd。結果用了 hostapd 後,才發現 hostapd 好強大,不過目前還沒用到其他功能就是。

使用 notebook 上的無線網卡來當無線 AP - debian wheezy 篇


以 notebook 上的無線網卡來當 ap ,讓其他行動裝置可以透過 notebook 上網
wireless ap 伺服器使用 hostapd 。
而自動配發 ip 的 dhcp server 使用 dnsmasq ,比較簡單設定。

步驟如下:
1. 設定 hostapd
2. 設定 dhcp server
3. 設定網路及 nat
4. 啟動
5. 以行動裝置連線測試


1. hostapd:


安裝 hostapd:

$ sudo apt-get install hostapd
$ sudo cp -p /usr/share/doc/hostapd/examples/hostapd.conf.gz /etc/hostapd/
$ sudo gzip -d /etc/hostapd/hostapd.conf.gz

debian wheezy上 hostapd 預設是不會啟動,要修改 /etc/default/hostapd 指定設定檔位置才行。
DAEMON_CONF="/etc/hostapd/hostapd.conf"

設定 hostapd:

$ sudo vi /etc/hostapd/hostapd.conf
interface=wlan0
ssid=天氣很好喲
hw_mode=g
channel=1
wpa=2
wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

只要注意以上這幾個選項,其他的可以暫時不用管,基本上 hostapd 可以很複雜,配合 radius server 可以讓使用者先連上,再開啟瀏覽器來做認證的方式,這裡不使用那種方式。

#1 - wpa only
#2 - wpa2 only
#3 - both
wpa=3
允許的話,直接用 wpa2 是最好的,若是某些行動裝置並不支援 wpa2,可以將 wpa 也打開或甚至是用 wep,不過,你知道的,鄰居也可以跟你一起用。
wep_default_key=0
wep_key0=123456789a

ssid 可以使用中文耶。這裡設定認證方式為 WPA2,而密碼可以用 wpa_psk 或 wpa_passphrase 來設定,建議以 wpa_psk 的方式,因為有編碼過,無法從設定檔裡直接看到。

wpa_passphrase=this is a passphrase
以 wpa_passphrase 指令來產生 wpa_psk,以 ssid 加上密碼產生出的一段文字
$ wpa_passphrase 天氣很好喲 123456789a
network={
ssid="天氣很好喲"
    #psk="123456789a"
psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
}
因此,取出 psk= 後面的這串文字放到設定檔中即可

wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3


2. dhcp server 設定:

dhcp server 這裡是使用 dnsmasq,因為比較簡單,若要改用 isc dhcp server 當然也行,請自行設定。

安裝 dnsmasq:

$ sudo apt-get install dnsmasq

設定 dnsmasq:

$ grep -v -e ^# -e ^$ /etc/dnsmasq.conf
port=0
dhcp-option=6,168.95.192.1,168.95.1.1
interface=wlan0
listen-address=192.168.199.254
dhcp-range=192.168.199.101,192.168.199.150,12h


port=0
dns server listen 的埠,預設是 53,設為 0 表示將 dns server 關閉,dnsmasq 有 dns server 及 dhcp server 的功能,而我們只要用到 dhcp server。

dhcp-option=6,168.95.192.1,168.95.1.1
將 dns server 設成 168.95.192.1 及 168.95.1.1 (hinet dns server) 並送給 dhcp client


3.網路設定及 nat 功能:

debian 本身有很完整的網路設定機制。
直接編輯 /etc/network/interfaces 檔案,然後以 ifupdown 來啟動或關閉介面即可。

$ sudo vi /etc/network/interfaces
iface wlan0 inet static
    address 192.168.199.254
netmask 255.255.255.0

post-up /etc/init.d/hostapd start
post-up /etc/init.d/dnsmasq start
    post-up iptables -I FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -I FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -I POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=1; iptables -I INPUT -i wlan0 -p udp --dport 67 -j ACCEPT

post-down /etc/init.d/dnsmasq stop
    post-down /etc/init.d/hostapd start
post-down iptables -D FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -D FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -D POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=0; iptables -D INPUT -i wlan0 -p udp --dport 67 -j ACCEPT

這裡範例對外介面為 ppp0,對內介面為 wlan0,表示在啟動 wlan0 介面後,再將 hostapd 及 dnsmasq 啟動,並設定好 firewall(包含打開 nat 功能、 kernel ip_forward 功能及 dhcp server listen udp port 67);於 wlan0 停止後,自動關閉 dnsmasq 及 hostapd,並關閉 nat 及相關功能。


4. 啟動及關閉:

啟動:
$ sudo ifup wlan0

關閉:
$ sudo ifdown wlan0

若要開機啟動,在 /etc/network/interfaces 中加上:
auto wlan0

若無錯誤訊息,此時 wlan0 介面已經起來,hostapd 及 dnsmasq daemon 已在背景跑。


5. 連線測試:

這時以手機、平板或另一個無線裝置來連看看,若沒問題的話,應該就可以上網了。

基本上,只有幾個步驟而已,不過要注意的是,若同時有 network-manager 之類的工具,可能會來搶 wlan0,因此要注意將 network-manager 先關閉再進行測試比較不會出狀況。



總結:


debian 的 ifupdown 功能非常強大且完整,在設定寫了一堆指令,看起來滿亂的,其實可以寫成另外的 script,再由設定檔中呼叫。這裡是為了解說方便,因此全部擠在一起。

原本是直接使用 wireless ad-hoc mode,不用額外裝 daemon,但是後來發現 android 不支援 ad-hoc mode,根本掃描不到 ap,無法使用。因此才改用 hostapd。結果用了 hostapd 後,才發現 hostapd 好強大,不過目前還沒用到其他功能就是。

2013年3月6日 星期三

遠端即時顯示 console 或 terminal 的工具

有時候,我們必須透過網路,由遠端以語音或文字來指示某人操作某些指令來達成一些事或者幫朋友除錯、排除故障,可是又無法使用 ssh 登入該主機或是根本沒帳號。由於看不到目前遠端的螢幕,無法詳細知道目前狀況,所以要一直請對方執行幾個指令,並將結果 post 上來,實在有點麻煩;或有時對方並沒有確實按照你的指令來做,有漏掉一些,這都會導致無法順利分析出問題來,所以介紹 gems 這個可以即時顯示遠端 console 的工具。

我知道可以開個帳號,二邊都以 ssh 登入,然後使用 “screen -x” or “tmux attach” 來分享畫面,但是,有時只是為了幾個指令就開個帳號什麼的,太麻煩了啦。

gems 是採 client server 架構,可執行 gems-server 於 console 下或 terminal 中,接著可以在本機或別台機器以 gems-client 連過來,即可看到所有 gems-server 中所看到的 console 或 terminal 中的東西,client 只能觀看,無法操作,就類似是 vnc 開啟觀看模式,但是沒有整個圖形介面,只有 console 或 terminal 中的內容。


安裝:

 

debian, ubuntu 安裝:

$ sudo apt-get install gems

在 debian 中的 gems-server 必須以 root 來執行,因為 lock 檔放在 /var/lock 中,可以簡單的以 root 執行,再 su 到一般使用者,或者對 /usr/bin/gems-server 設定成 setuid 即可用一般 user 來執行,不過這樣很危險,萬一 gems-server 有漏洞,就可以遠端取得 root 了;最好的方式是,直接修改原始碼,將 /var/lock/gems-server.6666 改到 /var/tmp/gems-server.6666,重編即可。

於原始碼中 server/source/defaults.h
change
#define LOCK_PREFIX "/var/lock/gems-server."
to
#define LOCK_PREFIX "/var/tmp/gems-server."
重編再安裝即可

更新: (2013/03/10)
debian 或 ubuntu 的 /var/lock 是連結到 /run/lock,而 /run/lock 權限是 1777, 所以任何人都可以寫入,所以以一般使用者執行 gems 即可。
而 arch linux 的 /run/lock 755,因此只有 root 可以寫入,所以在底下 arch linux 中有用 sed 將 /var/lock/gems-server.6666 改到 /var/tmp/gems-server.6666,這樣就可以用一般使用者來執行。

arch linux 安裝:

由於 gems 並不在 arch 中,連 aur 也沒有,所以這裡提供 PKGBUILD,請自行編出並安裝。
產生 PKGBUILD 檔案

$ cat < PKGBUILD
# Author: Diego Essaya
# Author: Emiliano Castagnari (aka Torian)

pkgname=gems
pkgver=1.1.1
pkgrel=1
pkgdesc="The gems system is a client/server application that allows one to show a single console session in different computers or terminals in real time. "
arch=('any')
url="http://gforge.lug.fi.uba.ar/projects/gemsd/"
license=(GPL)
# because the homepage can not be reached, so grab source from debian.
source=(http://ftp.de.debian.org/debian/pool/main/g/gems/$pkgname"_"$pkgver.orig.tar.gz)

build() {
cd $srcdir/$pkgname-$pkgver/
sed -i 's/lock/tmp/' server/source/defaults.h
make PREFIX=/usr MANPATH=/usr/share/man
}

package() {
cd $srcdir/$pkgname-$pkgver/
make PREFIX=/usr MANPATH=$pkgdir/usr/share/man DESTDIR=$pkgdir install
}

md5sums=('1b4eb9b19c7c7bb570721354ffde74f7')
# vim:set ts=2 sw=2 et:
EOF

由於年代久遠,官方網站已連不上,所以原始碼是從 debian 那裡來。


以 PKGBUILD 來下載並編譯
$ makepkg

安裝打包好的 package
$ sudo pacman -U gems-1.1.1-1-any.pkg.tar.xz


使用:

 

伺服器端:

$ gems-server

gems-server 會 listen tcp port 6666,所以要開啟給客戶端連。
預設最多可同時25個 client 連線,可用 -maxconn 調整

結束 gems-server
於 gems-server session 中打指令 exit 或按鍵 ctrl-d 都可結束
也可直接使用 kill pid 的方式,從別的地方結束 gems-server
$ kill $(cat /var/tmp/gems-server.6666)

客戶端:

$ gems-client server-address

如果有如下錯誤:
gems-client: Terminal size too small (minimum required: 65x32).

使用 -i 參數來忽略終端機大小。
$ gems-client -i server-address

在任何時間按 ‘q’ 可結束客戶端程式。

gems 除了能傳送 console 及 terminal 外,也可用來即時傳輸其他資料,只要下 -noscript 參數即可。


註:gems 傳輸過程並沒有加密,使用上請注意,不要傳輸密碼或隱私資料。

2013年2月24日 星期日

保護隱私的社交圈 RetroShare 基本安裝及使用

在這個各大廠商及政府均視個人隱私為糞土的時代,還在為了能和朋友一起分享些許資料或為了和朋友分享資料,必需將資料上傳到第三方的伺服器中,導致隱私外洩,這都是不必要的,因為現在有了 retroshare,不需要再妥協,立刻使用,馬上可以安心的和朋友分享各種資料。

retroshare 是跨平台的,分散式的社交軟體,retroshare 並沒有中央伺服器,而是存在於每個人的個人電腦中。

retroshare 支援很多功能:

- instant message: 即時訊息,類似 msn 或 gtalk

- chat: 多人聊天室,類似 irc

- voip: 一對一語音聊天,類似 skype

- message: 訊息,類似 email

- file share: 從硬碟中直接分享檔案,類似 BT

- channel: 頻道,建立頻道和朋友直接分享相片或短影片等等

- forum: 論譠


這邊介紹在 debian wheezy 中使用, retroshare 官方有提供很多 distribution 的 package,但是少了 debian x86_64 的 deb,因此這裡要從原始碼開始編。

首先裝上編譯 retroshare 需要的檔案
$ sudo apt-get install libghc-bzlib-dev libgpg-error-dev libupnp-dev libssl-dev libgnome-keyring-dev libxss-dev subversion gnupg-agent libupnp6 libqt4-dev g++ libgpgme11-dev

由 retroshare 官方網站下載原始碼
http://retroshare.sourceforge.net/downloads.html

解開原始碼
$ tar xvf RetroShare-v0.5.4d.tar.gz

$ cd trunk/libbitdht/src
$ qmake
$ make

$ cd ../../libretroshare/src
$ qmake
$ make

$ cd ../../openpgpsdk/src/
$ qmake
$ make

$ cd ../../retroshare-gui/src
$ qmake
$ make

上面四個部份都完成沒問題後,將之打包成 deb 檔
$ cd ../../build_scripts/Debian/

不過,由於在 debian wheezy 和 debian squeeze 有些不同,因此我們要改其中的相依性,將 control file 中的 libunpn3 改成 libupnp6、將 libssl0.9.8 改成 libssl1.0.0,這樣打包出來的 deb 檔才能在 wheezy 中安裝。
$ tar xvf retroshare.tgz
$ mv retroshare.tgz retroshare.tgz.backup
$ sed -i 's/libupnp3,libgpgme11,libssl0.9.8/libupnp6,libgpgme11,libssl1.0.0/' retroshare/DEBIAN/control
$ tar zcvf retroshare.tgz retroshare

$ sudo ./make.sh
會在目前目錄下產生一個 RetroShare_0.5.4.5995_debian_amd64.deb,直接安裝即可。

$ sudo dpkg --install RetroShare_0.5.4.5995_debian_amd64.deb

安裝時若還有錯誤,說缺少 libqt4-core, libqt4-gui 之類的,用下列指令會自動安裝幫忙安裝並解決相依性問題。
$ sudo apt-get -f install


安裝完成後,第一次執行會要求產生一組 pgp key ( 私鑰及公鑰),若你之前已有使用 pgp 來加、解密文件及驗證 email,想直接拿來給 retroshare 用,抱歉,現在 retroshare 0.5.4d 版無法支援由 gnupg 所建立的 pgp key。

因為 gnupg 於產生金鑰時,會建立一個 master key,一個 sub key,master key 用來簽署文件及別人的 public key 用,而 sub key 則專門用來加、解密。但是 retroshare 是則採用 openpgp-sdk 來產生金鑰,而 openpgp-sdk 並不支援 sub key,所以 retroshare 的 pgp key 只有一個 master key ,而全部功能(包括簽署及加、解密)都使用這個 master key。

產生 pgp key 時,
Name 是讓朋友能認出你的名字,可用中文
Email 就填入你的 email.
password 在此不是一般的密碼,而是 pass phrase,也就是說,可以輸入一整個英文句子,中間可以有空格,幫助記憶。(不過千萬不能忘了這個 pass phrase,否則這個 pgp key 就沒用了)
Location: 電腦的位置,一個人可有多台電腦,但是都要用同一個 pgp key,因此,location 就可以區分不同電腦,如 laptop、desktop 等等。

資料都輸入完整後,按最下方的 Generate new Identity 按鈕,會再確認一次你的 pass phrase,跟著出現另一個小視窗,寫著 “RetroShare has detected an unregistered plugin. This happens in two cases:” ,說 voip plugin 有變更過,由於是第一次,所以會問要不要授權外掛程式,若沒用到 voip 及 linkscloud 二個外掛,則可選 No,之後反悔可到設定中修改,完成後即會自動進入 retroshare 的 GUI。

進入後可看到最上方一排大圖示橫向工具列,左方有一排小圖示縱向工具列,這二個工具列都可以按住開頭地方有很多小細線地方來移動,以調整工具列位置。

剛進來是位於第一個 Network 這個功能,目前都還沒加任何朋友,因此只能看到自己,沒有朋友就失去 retroshare 的樂趣了,先加個朋友吧。要加朋友首先要將朋友的憑證滙入,然後自己也要將自己的憑證寄給朋友讓他匯入他的電腦,憑證是由 openssl 將一開始產生的 pgp public key 加上一些個人資訊,如姓名、email 編碼後所組成。要能和朋友溝通前,必須雙方都滙入憑證加成朋友後才能開始溝通。

按下左方工具列第一個圖示來加朋友,選第三個 “Send an Invitation by Email” 將自己的憑證寄給朋友,若朋友只收到信而沒看到憑證的話,就改用第二個 ”You got a certificate file from your friend” -> “Export my certificate” 將自己的憑證存成檔案,再將憑證檔寄給朋友。收到朋友寄來他的憑證後,一樣從這個匯入朋友的憑證。

主選單第二個功能是 Friends ,成功加了朋友後,就可以從這裡查看目前朋友是否有上線。在朋友名字上方按滑鼠右鍵,點選 chat 即可開始和他一對一聊天,點選 chat lobbies 可建立一個多人的聊天室。

在一開始還不大熟介面時,可以用左方工具列第五個按鈕 “Quick Start Wizard” 來幫忙設定 "網路連線方式及上下傳頻寬“、”分享哪些目錄“ 等等。


主選單上第三個功能是 Search,從這裡可以用關鍵字來搜尋檔案。

主選單上第四個功能是 Transfers,查看目前檔案下載、上傳的狀況。

主選單上第五個功能是 Files,直接瀏覽朋友分享的檔案,下方為自己分享的,檢查看看有沒有設錯,是否分享了不想分享的檔案。

主選單上第六個功能是 Messages,可留訊息給離線的朋友。

主選單上第七個功能是 Channels,建立頻道和朋友分享一些檔案,若朋友訂閱這個頻道,則會自動下載頻道中的檔案,當然也可以將自動下載的功能關掉。不過要特別注意,channels 的運作方式是,一旦你訂閱了此頻道,在頻道有新的發布,就會自動送到你的電腦來,要特別注意,因此覺得,頻道不適合發布大的檔案,用於一些短片或照片就好。

主選單上第八個功能是 Forums,和外面的論譠功能類似,可以設定成只有受邀者才可看,也可設定匿名發言之類的。

主選單上第九個功能是 LinksCloud,感覺是個檔案熱門度排行榜,可將想分享的檔案連結 post 到此,也可匿名發佈,然後,可對別人發佈的檔案加分或減分。


左方工具列第一個功能 Add a friend wizard,新增朋友及匯出自己的憑證。

左方工具列第二個功能 Add share,可以設定哪些檔案要分享,按下左方工具列第二個圖示 ”Add Share” 會彈出 Share Manager 視窗,預設裡面已經有一個分享目錄,就是預設的下載目錄。按 Share Manager 左下方 “Add” 鈕來新增目錄,瀏覽要分享的目錄,例如 /media/share/wallpaper,接著 Virtual Folder 則填入 wallpaper 即可。再來就是分享權限,預設是任何人都不能直接瀏覽你的目錄,只能透過匿名通道來搜尋,若此目錄想讓朋友可以直接從主選單 “Files” 中從你的名字來瀏覽你的檔案,就要打開權限。

左方工具列第三個功能 Messenger,和朋友二個人聊天,在聊天視窗的右下方可以看到麥克風圖示,從這裡可以用語音和朋友聊天。

左方工具列第四個功能 About,關於,在這視窗上按滑鼠按鍵,可玩俄羅斯方塊 :) 。

左方工具列第五個功能 Quick Start Wizard,快速設定精靈。

左方工具列第六個功能 Options,設定,選項很多,僅挑幾個重要的說明。
General -> Start Minimized 啟動後就將視窗最小化。
Server -> Dynamic DNS 可配合 DDNS 來使用。
Ttansfer -> Default Chunk Strategy ,預設為 random,這樣就可以從很多 node 同時下載,加快下載速度;streaming 的話,就是從頭開始抓,優點是若是影片,可以預覽。
VOIP: 可設定語音通話的模式,連續、語音偵測或 push to talk, 預設為連續。

左方工具列第七個功能 Quit,結束 retroshare。


感覺上少了一個相簿的功能,因為和朋友間滿常分享相片的說。


要於第二台電腦上同時執行 retroshare,不要使用 retroshare 的工具,因為在另一台新電腦第一次執行時,並沒有匯入的功能,變成都要再重新產生一組 pgp key,這樣是不對的。

作法如下:
直接將 ~/.retroshare/pgp 整個目錄拷貝到另一台機器上,只要 pgp 那個目錄就好,然後在第一次啟動 retroshare 時,會出現 “Create a new location” 視窗,在 Location 中填入資料,如 Desktop,然後再按下方 Generate new Location 即可,接著會問之前設定好的 pgp pass phrase,完成後就會進入。


通常我們執行 retroshare 必須在 X window 下才行,這樣滿耗資源的,沒問題,在原始碼中也有另一個 retroshare-nogui,編出執行檔,由於 retroshare-nogui 沒有設定介面,因此,要先用 retroshare 在 X window 中將一切都設定好後,結束 retroshare,以後都改用 retorshare-nogui,這樣就可以在一開機沒開 X window 的狀況下執行 retorshare-nogui,省很多資源。

retroshare 滿複雜的,在此只做基本的介紹。


參考文件:
1. http://newtoypia.blogspot.tw/2012/03/retroshare-pgp.html
2. http://retroshare.sourceforge.net/wiki/index.php/Documentation

2013年2月21日 星期四

從 linux 裡設定電腦自動開機

通常,要設定電腦自動時間開機,要從 BIOS 裡設,但是,像我的 notebook 的 BIOS 找不到可設定的地方,但是沒關係,可以直接從 linux 裡直接設定。

要能定時自動開機,核心要先有支援 RTC,不過大部份的 linux 預設都有支援就是。

檢視目前狀況,若是有這個檔案,核心就是有支援 RTC。
$ cat /proc/driver/rtc
rtc_time : 20:43:36
rtc_date : 2013-02-21
alrm_time : 01:41:19
alrm_date : 2013-02-22
alarm_IRQ : no
alrm_pending : no
update IRQ enabled : no
periodic IRQ enabled : no
periodic IRQ frequency : 1024
max user IRQ frequency : 64
24hr : yes
periodic_IRQ : no
update_IRQ : no
HPET_emulated : yes
BCD : yes
DST_enable : no
periodic_freq : 1024
batt_status : okay

只介紹前五個,其他的目前沒用到
rtc_time 目前 realtime clock 的時間
rtc_date 目前 realtime clock 的日期
alarm_time 設定開機的時間
alarm_date 設定開機的日期
alarm_IRQ 是否有設定鬧鐘(若有設定成功,這個一定會變成 yes)

要設定開機時間,要從 /sys 裡動手:
$ cat /sys/class/rtc/rtc0/wakealarm

內容是空的,沒有輸出任何東西,若有設定,值為設定開機時間的 unix time.
設定方式很簡單,只要將要開機的時間以 unix time 寫入 wakealarm 這個檔案即可。

設定十分鐘後開機:
$ echo $(date +%s -d “now + 10 minutes”) | sudo tee /sys/class/rtc/rtc0/wakealarm

檢查看看有沒有值了:
$ cat /sys/class/rtc/rtc0/wakealarm

還是沒東西,再檢查一下另一個檔
$ cat /proc/driver/rtc
rtc_time : 21:06:58
rtc_date : 2013-02-21
alrm_time : 21:11:46
alrm_date : 2013-02-21
alarm_IRQ : no

看前面 5 行就好,1-4 行看起來沒問題啊,不過,第 5 行是 no,所以沒成功。

原來設定這個要以 UTC 來設定,因為我是設成 localtime,但由於 taiwan 時區是 GMT+8 所以 rtc_time 會自動加上 8 小時,所以我們設鬧鐘時間也要加 8 小時,如果系統時鐘是設成 UTC 就沒這問題。

設定 8 小時 10 分鐘後開機:
$ echo $(date +%s -d “now + 8 hours 10 minutes”) | sudo tee /sys/class/rtc/rtc0/wakealarm

檢查看看,果然有值了
$ cat /sys/class/rtc/rtc0/wakealarm
1361482760

$ head -n5 /proc/driver/rtc
rtc_time : 21:30:26
rtc_date : 2013-02-21
alrm_time : 21:39:20
alrm_date : 2013-02-21
alarm_IRQ : yes

果然 alarm_time 在 10 分鐘後,而且 alarm_IRQ 為 yes

因此,趕快收一收在 10 分鐘內關機,等到 10 分鐘後看會不會自動開機,理論上是沒問題了。

不過,關機要用軟體關機,不可以按電源開關來關機就是。


參考文件:
1. http://jamyy.dyndns.org/blog/2012/12/4259.html

2013年1月28日 星期一

Linux Control Group 介紹

Control Group 簡稱 cgroup,是 linux kernel 裡的一個功能, 用來限制、記錄、隔離資源使用。
最早於 2006 年由 google 工程師開發,後來合併到 kernel 2.6.24 中。

cgroup 的特點有以下幾種:

1. 限制資源的使用:執行某個應用程式,卻佔掉大部份的系統資源,導致別的程式根本無法執行,或在多核心的機器上,讓某應用程式只能使用某些核心,保留一些給其他程式用,或限制某程式最多使用 2G 的記憶體。

2. 使用資源的優先權:有沒有辦法調整讓 A 程式比 B 程式多用一些 cpu 呢?

3. 記錄 cpu 使用量以收取費用:對某些公司來說,cpu 的使用是要收費的,但要如何算出使用者到底使用了多少 cpu 呢? 早期這類的工作是很繁雜的,一般是透過 psacct 來收取整個系統上所有指令使用的 cpu 時間,再寫一些 scripts 來分析出各個使用者的 cpu 使用量,產生報表,現在透過 cgroup 可以很容易的抓出資料。

4. 隔離不同群組的 process:對於不同群組的 process 做到隔離,可用於 lxc (linux container)。

5. freezing groufreezing groups or checkpointing and restarting: 假設一個程式執行要 8 小時 cpu 時間才能完成,但跑到 7.3 小時卻因為某狀況導致失敗,等故障排除後,要再重頭開始跑 8 小時,這樣很沒效率。若在中間有做 checkpoint,假設每小時一次,則可以從 7 小時的部份接續下去跑,理論上是很完美,只是不知道現在 cgroup 能做到什麼程度就是。

這邊以實例來操作 cgroup ,目前在 debian wheezy 上有遇到一些問題,只能使用 root 使用者來分配資源,而無法以一般使用者,還沒找出問題在哪,所以先用 arch linux 為例,基本上,目前 cgroup 的實作,試過幾個 distribution,都大同小異,fedora、ubuntu、arch linux,都是類似,試過都沒問題,但 debian wheezy 則有點不同。


進入系統後,首先檢查 cgroup 是否有掛載起來:
$ mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

在 arch linux 中,可看到 cgroup 掛載於 /sys/fs/cgroup/ 底下,接著檢查系統的 cgroup 支援哪些 controller.

$ cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset      2     3     1
cpu           3     14   1
cpuacct    3     14   1
memory    4     1     1
devices     5     1     1
freezer     6     1     1
net_cls     7     1     1
blkio         8     1     1

debian wheezy 預設 memory 是沒啟動的,可在開機時 grub 加入 cgroup_enable=memory 來開啟。

由於 cgroup 的 controller 滿多,功能也很廣,這邊只針對幾個做說明。
cpuset: 設定使用那幾個 cpu core.
cpu 和 cpuacct 是同一個:設定 cpu shares,share 值越大,能用 cpu 的時間越多。
memory:限制記憶體使用量。


要使用 cgroup,可透過底下幾個方法:
1. 直接以命令列指令存取 /sys/fs/cgroup 來達到。
2. 使用 libcgroup 的一些指令,像 cgcreate, cgexec, cgclassify 來操作。
3. 透過 LXC 來實作。

這邊介紹 1, 2 種方法,lxc 則留著以後再分享。


以命令列指令存取 cgroup:

操作前準備:
以 root 來建立 low 群組,low 繼承了 cpu controller 的所有屬性
$ sudo mkdir /sys/fs/cgroup/cpu/low

將權限開給 behappy 使用者
$ sudo chown behappy:users -R /sys/fs/cgroup/cpu/low

cpu share 預設為 1024
$ cat /sys/fs/cgroup/cpu/low/cpu.shares
1024

以一般使用者將之 low 群組設成 512
$ echo 512 > /sys/fs/cgroup/cpu/low/cpu.shares

重覆上面,建立 high 群組,cpu share 設為 2048
$ sudo mkdir /sys/fs/cgroup/cpu/high
$ sudo chown behappy:users -R /sys/fs/cgroup/cpu/high
$ echo 2048 > /sys/fs/cgroup/cpu/high/cpu.shares

另外建立 first_core、second_core 群組,為 cpu 第一個核心及第二核心,位於 cpuset controller 底下。
$ sudo mkdir /sys/fs/cgroup/cpuset/first_core
$ sudo chown behappy:users -R /sys/fs/cgroup/first_core

$ sudo mkdir /sys/fs/cgroup/cpuset/second_core
$ sudo chown behappy:users -R /sys/fs/cgroup/second_core

檢視原本 cpuset 裡的設定:
$ cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1
有二個 cpu core 0 和 1

而我們建立的 first_core 及 second_core 裡的設定是空的
$ cat /sys/fs/cgroup/cpuset/first_core/cpuset.cpus

將 first_core 群組設成第一個 cpu core:
$ echo 0 > /sys/fs/cgroup/cpuset/first_core/cpuset.cpus

將 second_core 群組設成第二個 cpu core:
$ echo 1 > /sys/fs/cgroup/cpuset/second_core/cpuset.cpus

這樣大致上準備完成,接著開始試驗。

拿 /usr/bin/yes 這指令來操 cpu,為了易於閱讀,設置二個執行檔:
$ cp /usr/bin/yes /tmp/yes_low
$ cp /usr/bin/yes /tmp/yes_high

另外開個 top 在旁邊觀看 cpu 使用情形,按 1 來顯示各別 cpu core 使用情形
$ /tmp/yes_low &>/dev/null &
$ /tmp/yes_high &>/dev/null &

$ top
top - 13:14:41 up 3:34, 2 users, load average: 0.85, 0.34, 0.16
Tasks: 119 total, 3 running, 114 sleeping, 2 stopped, 0 zombie
%Cpu0 : 99.3 us, 0.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 3951368 total, 1223052 used, 2728316 free, 150640 buffers
KiB Swap: 3145724 total, 0 used, 3145724 free, 531504 cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9860 behappy 20 0 7120 356 284 R 99.9 0.0 0:11.32 yes_low
9861 behappy 20 0 7120 356 284 R 98.6 0.0 0:08.98 yes_hig

下方可看到二個程式,各佔 cpu 99%,而上面則顯示目前二個 cpu core 都是 99% 使用率,這是正常的狀況下。

接著我們將 yes_low 加入到 low 群組
$ echo 9860 > /sys/fs/cgroup/cpu/low/tasks

將 yes_high 加入到 high 群組
$ echo 9861 > /sys/fs/cgroup/cpu/low/tasks

理論上 top 所看到的 cpu 使用狀況應該有變化,但是並沒有,因為有二個 cpu core,而使用 cpu 的程式也是二個而已,所以在夠用的情況下,二個程式都可以取得所需的資源,因此一樣佔用 99%,所以我們要讓二個程式使用同一個 cpu core 才行。

$ echo 9860 > /sys/fs/cgroup/cpuset/first_core/tasks
-bash: echo: write error: No space left on device

哦哦,失敗,要先設定 cpuset.mems 才行,不知道為什麼 :)
$ echo 0 > /sys/fs/cgroup/cpuset/first_core/cpuset.mems

再設定一次就可成功
$ echo 9860 > /sys/fs/cgroup/cpuset/first_core/tasks

將 yes_high 也加入 first_core 群組
$ echo 9861 > /sys/fs/cgroup/cpuset/first_core/tasks

過個三秒後,應該可看到 top 上的變化
$ top
top - 13:14:41 up 3:34, 2 users, load average: 0.85, 0.34, 0.16
Tasks: 119 total, 3 running, 114 sleeping, 2 stopped, 0 zombie
%Cpu0 : 99.8 us, 0.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 1.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 3951368 total, 1223052 used, 2728316 free, 150640 buffers
KiB Swap: 3145724 total, 0 used, 3145724 free, 531504 cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9861 behappy 20 0 7120 356 284 R 79.9 0.0 0:11.32 yes_high
9860 behappy 20 0 7120 356 284 R 20.2 0.0 0:08.98 yes_low

很明顯上方可看到,第一個 cpu core 用了 99.8%,而第二個就只有 1.7%,因為我們設定 yes_high 及 yes_low 都只使用第一個 cpu core;接著下方,由於 yes_low 比重是 512,yes_high 是 2048,為 1:4,因此 cpu loading 也趨近於 1:4 ( 20.2 : 79.9 )。

這樣空下一顆 cpu core 可以用來做其他事情,而不會導致系統變得很頓。

cpuacct 的部份,在剛建立一個 cpu 或 cpuacct 群組時,cpuacct.usage 為 0,像剛才建立的 high 群組
$ cat /sys/fs/cgroup/cpu/high/cpuacct.usage
0

經過執行了 yes_high 並加入 high 群組後,cpuacct.usage 就會開始累計,所以看內容就可知道用了多少 cpu time,單位為 ns (nano second,十的負九次方秒)。
$ cat /sys/fs/cgroup/cpu/high/cpuacct.usage
22493005441
這樣大概就是 22.5 秒,但觀察 cpuacct.stat 可看到,這 22.5 秒是 user + system 全部總合,因此要看 cpuacct.stat 裡面 user 的部份才是真正 user 使用的 cpu time,約 22.44 秒。

$ cat /sys/fs/cgroup/cpu/high/cpuacct.stat
user 2244
system 7

另外,由於只用到第一個 cpu core,因此在 cpuacct.usage_percpu 中看到第二個 cpu core cpu time 為 0
$ cat /sys/fs/cgroup/cpu/high/cpuacct.usage_percpu
22493005441 0

memory 的部份,一樣先建立一個群組,設定好限制,再將程式加入此群組即可。
以 root 建立一個 mymemory 群組
$ sudo mkdir /sys/fs/cgroup/memory/mymemory
$ sudo chown -R behappy:users /sys/fs/cgroup/memory/mymemory

用一般使用者設定記憶體上限為 10M Bytes
$ echo 10000000 > /sys/fs/cgroup/memory/mymemory/memory.limit_in_bytes

在旁邊先開個 terminal 來監控記憶體運作情形,使用 free,來觀察記憶體變化
$ watch free

然後開啟一個 shell,並將 shell 加入 mymemory 群組,這樣從這個 shell 裡所執行的程式,都屬於 mymemory 群組。
$ bash

找出剛才執行 bash 的 pid
$ echo $$
5312

將 bash 加入 mymemory 群組
$ echo 5312 > /sys/fs/cgroup/memory/mymemory/tasks

加入後,執行一個超過 10M 記憶體的程式,如 libreoffice、或看看影片,可立刻看到記憶體監控視窗中,已開始用到 swap 了,因為只給 10M,但不夠用,會自動使用 swap,印證我們限制記憶體使用是成功的。

操作上大致是如此,但是若每次都以存取 /sys 來動作,似乎很麻煩,因此有 libcgroup 的工具可用。


以 libcgroup 存取 cgroup:


fedora 是 libcgroup,直接裝上即可,而 debian 及 ubuntu 除了安裝 libcgroup1 還要再加上 cgroup-bin。

arch linux 從 AUR 中裝上:
$ yaourt -S libcgroup

以 libcgroup 來重覆上面建立 first_core, second_core, high, low 群組的指令。
建立 first_core 群組
$ sudo cgcreate -a behappy:users -t behappy:users -g cpuset:/first_core

建立 second_core 群組
$ sudo cgcreate -a behappy:users -t behappy:users -g cpuset:/second_core

建立 high 群組
$ sudo cgcreate -a behappy:users -t behappy:users -g cpu:/high

建立 low 群組
$ sudo cgcreate -a behappy:users -t behappy:users -g cpu:/low

設定 first_core 群組的 cpuset.cpus 為第一個 cpu core
$ cgset -r cpuset.cpus=0 /first_core

設定 second_core 群組的 cpuset.cpus 為第二個 cpu core
$ cgset -r cpuset.cpus=1 /second_core

設定 high 群組的 cpu.shares 為 2048
$ cgset -r cpu.shares=2048 /high

設定 low 群組的 cpu.shares 為 512
$ cgset -r cpu.shares=512 /low

指定 yes_high 到 first_core 群組
$ cgclassify -g cpuset:/first_core 9861

指定 yes_low 到 first_core 群組
$ cgclassify -g cpuset:/first_core 9860

指定 yes_high 到 high 群組
$ cgclassify -g cpu:/high 9861

指定 yes_low 到 low 群組
$ cgclassify -g cpu:/low 9860

cgclassify 是用於將已執行中的程式指到一個群組,而 cgexec 則用來執行一個程式,並將之加入一個群組。
執行 /tmp/yes_high &>/dev/null & 這指令,並將之加入 first_core 及 high 群組
$ cgexec -g cpu:/high -g cpuset:/first_core /tmp/yes_high &>/dev/null &

執行 /tmp/yes_low &>/dev/null & 這指令,並將之加入 first_core 及 low 群組
$ cgexec -g cpu:/low -g cpuset:/first_core /tmp/yes_low &>/dev/null &

檢視 yes_low 使用了多少 cpu time:
$ cgget -r cpuacct.usage /low
/low:
 cpuacct.usage: 22493005441

memory 的部份:
$ sudo cgcreate -a behappy:users -t behappy:users -g memory:/mymemory
$ cgset -r memory.limit_in_bytes=10000000 /mymemory


還不錯用,至少比 echo xx > 什麼的方便多了不是嗎?


但我們建立的群組,重新開機後就會不見,因此要寫在 /etc/cgconfig.conf 中,然後開機時啟動 cgconfig service
$ cat /etc/cgconfig.conf
group first_core {
        perm {
                task {
                      uid = behappy;
                }
                admin {
                      uid = behappy;
                }
        }
        cpuset {
                cpuset.mems = "0";
                cpuset.cpus = "0";
        }
}

group second_core {
         perm {
                task {
                        uid = behappy;
                }
                admin {
                        uid = behappy;
                }
         }
         cpuset {
                  cpuset.mems = "0";
                  cpuset.cpus = "1";
         }
}

group low {
         perm {
                   task {
                           uid = behappy;
                   }
                   admin {
                            uid = behappy;
                   }
          }
           cpu {
                  cpu.shares = "512";
           }
}

group high {
           perm {
                     task {
                               uid = behappy;
                     }
                     admin {
                               uid = behappy;
                     }
            }
            cpu {
                     cpu.shares = "2048";
            }
}

group mymemory {
            perm {
                       task {
                               uid = 1000;
                       }
                       admin {
                               uid = 1000;
                        }
             }
             memory {
                        memory.limit_in_bytes = "10000000";
             }
}

$ sudo systemctl start cgconfig

可是,若每次執行程式,都要手動加入到某個群組,還是很麻煩啊?沒問題,有 cgrulesengd 這個 daemon 來幫助我們,依照 /etc/cgrules.conf 所指定的,自動在程式執行後加入群組中,開機時要啟動 cgred service。
$ cat /etc/cgrules.conf
#《user》                                  《controllers》《destination》
#《user》:《process name》   《controllers》《destination》
behappy:yes_high                      cpuset              first_core
%                                                  cpu,cpuacct     high

behappy:/tmp/yes_low                cpuset              first_core
%                                                  cpu,cpuacct     low


$ sudo systemctl start cgred

排除註解總共 4 行,第 1 行是將使用者 behappy 執行的 yes_high 加入 cpuset controller 中的 first_core 群組
第 2 行前面是 %,表示接續第一行過來,若前面寫得和第一行一樣,則在找到第一行符合條件套用後就會離開,加 % 表示第 2 行和第 1 行是同一行指令,所以會 1,2 行都套用後才離開。

所以 1,2 行一組,表示將 behappy 的 yes_high 加入 first_core 及 high 群組。
3,4 行表示將 behappy 的 yes_low 加入 first_core 及 low 群組。

記得,在 cgrulesengd 啟動後,先前已執行的程式並不會變動,只有從 cgrulesengd 啟動後才執行的程式會自動加入群組。

另外,libcgroup 還有幾個指令:
$ cgdelete: 刪除某個群組
$ sudo cgdelete -g cpuset:first_core

cgclear: 清除所有群組 (這指令儘量不要下,否則全空了),若全部不見了,寫個 /tmp/cgconfig.conf,內容如下,並以 cgconfigparser 來載入:
mount {
     cpuset = /sys/fs/cgroup/cpuset;
     cpu = /sys/fs/cgroup/cpu,cpuacct;
     cpuacct = /sys/fs/cgroup/cpu,cpuacct;
     memory = /sys/fs/cgroup/memory;
     devices = /sys/fs/cgroup/devices;
     freezer = /sys/fs/cgroup/freezer;
     net_cls = /sys/fs/cgroup/net_cls;
     blkio = /sys/fs/cgroup/blkio;
}

cgconfigparser: 檢查 cgconfig.conf 設定檔的格式錯誤,若沒問題則載入。
$ cgconfigparser -l /tmp/cgconfig.conf

cgsnapshot: 將目前 cgroup 狀態 dump 下來,可存成設定檔。
$ cgsnapshot > /tmp/cgconfig.conf


總結:
Cgroup 是非常複雜的東東,這邊只做基本介紹,有興趣可到 /sys/fs/cgroup 裡去看看每個檔案的內容。
現在 linux 有了 cgroup 後,簡直是如虎添翼,擁有早期只有大型主機 + 商用unix 才有的功能,現在 linux + PC 就可達到,真是越來越強了。


參考文件:
1. http://en.wikipedia.org/wiki/Cgroup
2. https://wiki.archlinux.org/index.php/Cgroups
3. http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt
4.  https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/index.html