2008/11/29

[軟體] 用 Linux Kernel 的 Kbuild 來建立一個選單

在 Linux 上面要 make kernel 並不是一件很簡單的事情,常常我們都要調查一堆的選項才能很順利的「開始」 config 核心,然而這只是麻煩的開頭而已,接著下來,我們就要對數以千計的選項勾選,打上 yes or no , include or module 的選擇。這些個選擇題如果是在 console 底下用一個一個問的話,大概可以問上一兩個小時沒有問題,還好 Linux Kernel 的開發小組搞了一個 KBuild 的小玩意兒來玩,讓我們可以很快又很簡單的像下面的圖片裡面一樣,快速達成 config 的目標。



不過,這麼好玩的東西,怎麼會只能在 Kernel 底下使用呢?當然也就有人開始想要把這個小玩意兒套用在別的工作上面,像是一堆模組在 console 底下可以套用選擇的時候,如果有這樣的東西可以拿出來玩,該有多好?

筆者接著要介紹的,就是 Kbuild 的一個簡單的範例:
KBuild 需要的部份主要有三個部份:
* script/ # 主要軟體
* Config.in # 設定檔
* Makefile # make 文件檔

Makefile 的部份:
KCONFIG := script/kconfig
CONFIG_IN := Config.in

all: .config

.config:
$(MAKE) menuconfig

$(KCONFIG)/mconf:
$(MAKE) -C $(KCONFIG)

menuconfig: $(KCONFIG)/mconf
@$(KCONFIG)/mconf $(CONFIG_IN)


Config.in:
# General Options
menu "General Options"

config DL_DIR
string "Packages Directory"
default "$(PWD)/dl"
endmenu


再來就是把 kernel 裡面的 script 目錄打包過來就都到齊了。

config 模組再來要使用,就可以很簡單的用 make 來解決。

[Linux] Gnome 底下修改「位置」的名稱

在 四元 的部落格裡面有看到一點修改位置的改法,實際上用不到登入登出,在 Ubuntu-tweak 裡面也有可以修改的地方,不過還是不需要用到專門裝個軟體來處理這件事情。

實際上只要:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
unset LC_ALL

把 locale 換成 en_US 或其它英文語系,再執行:
xdg-user-dirs-gtk-update
就可以了。

這個位置其實也是 nautilus 裡面的書籤,實體位置放在:
$HOME/.gtk-bookmarks
長像是:
file:///home/anton/Documents
file:///home/anton/Music
file:///home/anton/Pictures
file:///home/anton/Videos
file:///home/anton/Desktop/Doc Doc

2008/11/27

[Linux] Ubuntu 底下編譯 ebtables 失敗

因為工作上的需求,所以要修改 ebtables ,就自已先用 apt-get source 下載 ebtables 的 source 下來 compile 。結果在 ebtables 還沒有修改的情況下就不能 compile 。

錯誤訊息是:

  /usr/bin/ld: ebtables: hidden symbol `__stack_chk_fail_local' in /usr/lib/libc_nonshared.a(stack_chk_fail_local.oS) is referenced by DSO
  /usr/bin/ld: final link failed: Nonrepresentable section on output
  collect2: ld returned 1 exit status


在這邊 有看到解答:
在 gcc/g++ compile code 的時候沒有加上 -shared flag ,所以後來的 libebtc.so 會出問題。

另外 ubuntu 上面 init.d 也不會是在 /etc/rc.d/ 底下, config 的部份也有搞錯。
這邊包的很馬虎。(小抱怨一下)
--
附上可以 compile 的 Makefile patch:
make 時請下 make LD=gcc


--- Makefile.orig 2008-11-28 15:29:24.000000000 +0800
+++ Makefile 2008-11-28 15:28:44.000000000 +0800
@@ -11,8 +11,8 @@
MANDIR:=/usr/local/man
BINDIR:=/usr/local/sbin
ETCDIR:=/etc
-INITDIR:=/etc/rc.d/init.d
-SYSCONFIGDIR:=/etc/sysconfig
+INITDIR:=/etc/init.d
+SYSCONFIGDIR:=/etc/default
DESTDIR:=

CFLAGS:=-Wall -Wunused
@@ -85,7 +85,8 @@

.PHONY: libebtc
libebtc: $(OBJECTS2)
- $(LD) -shared -soname libebtc.so -o libebtc.so -lc $(OBJECTS2)
+# $(LD) -shared -soname libebtc.so -o libebtc.so -lc $(OBJECTS2)
+ $(LD) -shared libebtc.so -o libebtc.so -lc $(OBJECTS2)

ebtables: $(OBJECTS) ebtables-standalone.o libebtc
$(CC) $(CFLAGS) $(CFLAGS_SH_LIB) -o $@ ebtables-standalone.o -I$(KERNEL_INCLUDES) -L. -Lextensions -lebtc $(EXT_LIBSI) \
@@ -152,13 +153,14 @@
tmp2:=$(shell printf $(SYSCONFIGDIR) | sed 's/\//\\\//g')
tmp3:=$(shell printf $(PIPE) | sed 's/\//\\\//g')
.PHONY: scripts
-scripts: ebtables-save ebtables.sysv ebtables-config
+#ebtables-config
+scripts: ebtables-save ebtables.sysv
cat ebtables-save | sed 's/__EXEC_PATH__/$(tmp1)/g' > ebtables-save_
install -m 0755 -o root -g root ebtables-save_ $(DESTDIR)$(BINDIR)/ebtables-save
cat ebtables.sysv | sed 's/__EXEC_PATH__/$(tmp1)/g' | sed 's/__SYSCONFIG__/$(tmp2)/g' > ebtables.sysv_
install -m 0755 -o root -g root ebtables.sysv_ $(DESTDIR)$(INITDIR)/ebtables
- cat ebtables-config | sed 's/__SYSCONFIG__/$(tmp2)/g' > ebtables-config_
- install -m 0600 -o root -g root ebtables-config_ $(DESTDIR)$(SYSCONFIGDIR)/ebtables-config
+# cat ebtables-config | sed 's/__SYSCONFIG__/$(tmp2)/g' > ebtables-config_
+# install -m 0600 -o root -g root ebtables-config_ $(DESTDIR)$(SYSCONFIGDIR)/ebtables-config
rm -f ebtables-save_ ebtables.sysv_ ebtables-config_

$(MANDIR)/man8/ebtables.8: ebtables.8



--
參考連結:
ebtables 的官網文件

2008/11/24

[Linux] SVN 跑 http 加上 MySQL auth

這個方案只差一個 https 就可以變成我心中最麻煩的 svn 方式了。
不過麻煩的還不在這裡,最麻煩的地方,在這台機器架在 FC5 上面。
(O.S 如果是 FC 晚近的版本,至少軟體差異不會那麼大咩~)
在 auth mysql 裡面的 param 改了好幾次的樣子,每個版本都不大一樣,使用前後﹑更新的時候都要特別小心。

步驟:

1. a2enmode 把 auth_mysql ﹑ subversion 都 enable 起來。
2. mysql 跑起來。 # default db 我設到 http_auth
3. 加入 mysql auth table # 我把 UserTable 跟 GroupTable 都設在一起
drop database http_auth;
CREATE DATABASE http_auth;
USE http_auth;

CREATE TABLE `clients` (
`username` varchar(25) NOT NULL default '',
`passwd` varchar(25) NOT NULL default '',
`groups` varchar(25) NOT NULL default '',
PRIMARY KEY (`username`),
KEY `groups` (`groups`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
use http_auth;
INSERT INTO `clients` VALUES ('anton', encrypt('1234'), 'admin');

3. /etc/init.d/mysql start # 啟動 MySQL
4. vi /etc/httpd/conf.d/subversion.conf 加入:
<Location /svn>
DAV svn
SVNParentPath /home/svn
SVNListParentPath on
AuthzSVNAccessFile /home/svn/svn.authz
AuthName "SVN Repository"
AuthType Basic
AuthMySQLEnable On
AuthMySQLHost "localhost"
AuthMySQLPort 3306
AuthMySQLUser "id"
AuthMySQLPassword "password"
AuthMySQLDB "http_auth"
AuthMySQLUserTable "clients"
AuthMySQLGroupTable "clients"
AuthMySQLNameField "username"
AuthMySQLPasswordField "passwd"
AuthMySQLPwEncryption crypt
AuthMySQLAuthoritative On
require valid-user
</Location>

5. /etc/init.d/httpd restart # apache 再啟動
6. 寫個 chpasswd 的 php script。

這樣 svn 就可以順利使用 http 連線了。 (而且改密碼就直接在 mysql 裡面改了)
* 對了,要小心 mysql encrypt function 是 "encrypt" 不是 "crypt" 喔。

--
附上我的 Ubuntu 8.10/apache2.2.8-1ubuntu0 的 config:
# 這個版本的 mysql auth 是寫在 auth_mysql.conf 裡面,用 Auth_MySQL_info hostname mysql_id mysql_pass 來連的。
# 感覺比較簡潔有力。
# 至於 AuthUserFile 為什麼兩邊設不一樣... 這是我實際運作後的結果,還不知道為什麼上面不能設到 null 去。
<Location /svn>
DAV svn
SVNParentPath /home/svn
SVNListParentPath on
AuthType Basic
AuthName "Subversion repository"
AuthBasicAuthoritative Off
AuthMySQL_DB "http_auth"
AuthMySQL_Password_Table "clients"
AuthMySQL_Group_Table "clients"
#setting authfile to /dev/null stop apache error log
AuthUserFile /dev/null
AuthzSVNAccessFile /home/svn/svn.authz
Require valid-user
</Location>


--
參考網頁:
* mod_auth_mysql
* http 認證使用 mysql

[軟體] Ubuntu 8.10 更新 VirtualBox 2.0.6 失敗

一早打開電腦,我的 VirtualBox 就跟我提醒說要更新版本了。想說, VirtualBox 又要更新了啊?不知道什麼時候才會更新到 opengl 的支援的部份? 算了,這個功能還是慢慢等好了,反正已經有了眉目,應該不會等太久的。

結果下載下來之後,不疑有它有就直接安裝了。
結果就跑出來:
* Look at /var/log/vbox-install.log to find out what went wrong
馬上去 Google 找 VirtualBox 更新失敗的情況:
在 這邊 也有看到幾乎是一模一樣的回報。(別看了,這篇是什麼外國人寫的,不是英文﹑俄文﹑義大利文﹑荷蘭文﹑泰文我就連找人幫忙都不行了~) <-- 這邊好像是講出來現的~

再回去看 VirtualBox download 的官網查看,果然發現問題的徵結點: (好啦,其實是我自已沒注意~)
原來, VirtualBox 自動下載的是: virtualbox-2.0_2.0.6-39765_Ubuntu_hardy_i386.deb
但是我的系統根本不是 hardy 啊~
所以再下載 正確 的版本下來更新就好了。

真糟,我太相信自動下載了~

而且,明明看 ChangeLog,跟 Linux 有關的部份,就那麼一點點而已...:

* Linux/Solaris/Darwin hosts: verify permissions in /tmp/vbox-$USER-ipc
* Linux hosts: fixed assertion on high network load (AMD64 hosts, fix for Linux distributions with glibc 2.6 and newer (bug #616)
* Linux hosts: don’t crash during shutdown with serial ports connected to a host device
* Linux additions: fixed compilation of vboxvfs.ko for 64-bit guests (bug #2550)


這次的更新,一點都不建議做上。

2008/11/20

[Programming] 犯錯 + BUG ==> PHP5 計時亂掉

這個問題應該是只發生在 php5 上面的問題。

話說一個 php 計時的 script 發生了多了八個小時的問題,所以開始追蹤這個 bug ,結果發現到:
$ echo $TZ

$ cat /etc/php5/cli/php.ini|grep timezone
; Defines the default timezone used by the date functions
;date.timezone =
$ cat /etc/timezone
Asia/Taipei
$ echo "<? echo date_default_timezone_get(); ?>"|php
Asia/Chongqing

哇勒?!我明明系統設 Taipei 啊?幹嘛給我丟到對岸的中國去?這個應該是 php 的臭蟲吧?

再下
$ echo "<? echo time()%86400; ?>"|php
6210

... (恍然大悟) time() 回復的是 UTC 的時間。所以如果你是用 time() 來計算時間,在使用時就要注意,不能和帶有時區的函式一起使用。像是如果 time() 和 strftime 混用,那麼你計算出來的時間就會相差 8:00 (台灣的時差)。

2008/11/18

[Kernel] Procfs Hello World

Linux Kernel Module Programming 這邊有簡單的 kernel module 教學跟範例的部份,感覺還蠻簡單就可以入門的。

配合之前讀的 Linux 核心開發指南做的簡摘,就可以做為入門的一個記錄了。

中斷

程序的建立

程序的排程

系統呼叫

核心同步

--
順便一提,
proc_root undeclared 的問題在這邊 有提了一下,簡單的說,先把這個變數改做 NULL 來處理就可以。
不過我還不清楚為什麼要這樣。

另外 2.4 的 kernel 的部份也可以參考 Wilson 老大翻譯的文章。

[Windows] git-bash 底下的工具

因為工作轉到 Windows 平台上的關係,所以很多工具改到 Windows 上面運作,跟著在 TortoiseGit 底下使用 git-bash 來維護自己的專案原始碼。結果就是裝了前面提過的 auto-hotkey 使用熱鍵來提昇自己的平台操作速度; 但除了 hotkey...