2011年11月17日 星期四

系統備份 script

紀錄一下半年前的筆記(快沒時間了...Orz)。

之前備份策略是每個禮拜將 /home , /etc , /var 備份到另一顆硬碟上,過兩個禮拜再存到外接硬碟,但有時候會忘記整理,就會碰到備份檔把整顆硬碟空間吃光的情形;現在改成先檢查硬碟空間再備份,如果空間不夠會在 terminal 上顯示訊息,等待十分鐘後再次檢查硬碟空間,如果要在 cron job 啟動 GUI 程式,只要在 cmd 前面加上 export DISPLAY=:0 就行了。

原本想說用 `wall` 或 `talk` 來送訊息,卻發現 rxvt-unicode 收不到廣播訊息,不信邪想翻翻 `walk` 的原始碼看看到底是怎麼寫的,結果發現原始碼內的輸出訊息不大一樣,才發現 Arch Linux 是用 sysinitv 裡面的 `wall` 而不是 util-linux 內的 `wall`,也因此發現有 pkgtools 這個好用的 package,只要下 pkgfile -s CMD 就可以知道是哪個 package 提供的程式。

看了 sysinitv 內的 dowall.c 發現是用 getutent() 來抓目前登入的使用者,但是抓不到 rxvt-unicode 登入的紀錄,還有 xterm +ut 也是抓不到,後來乾脆就直接去掃 /dev/pts/ ,用檔案擁有者來判斷登入者,也很方便, getutent() 測試原始碼如下,編譯完成後只要執行就會列出有抓到登入的使用者。

#include <sys/types.h>
#include <stdio.h>
#include <utmp.h>
#include <unistd.h>

int main(){

int type ,pid;
char *tty,*id, *user, *host;
struct utmp *utmp;
while ((utmp = getutent()) != NULL) {
type = utmp->ut_type;
pid = utmp->ut_pid;
tty = utmp->ut_line;
id = utmp->ut_id;
user = utmp->ut_user;
host = utmp->ut_host;

printf("%d - %d - %s - %s - %s - %s\n",type , pid, tty, id, user, host);
}
}


因為 dcron 有類似 anacron 的功能,所以只要把 script 丟進 /etc/cron.weekly 就會自動執行,這次還用到 logging 這個 module ,非常方便,有了這個 module 就不必自己辛苦刻 log 了 :)


Reference:

2011年10月28日 星期五

關機時一併將 VirtualBox 正常結束

平常開 VirtualBox 都是用

VBoxHeadless --startvm YOUR_VM_NAME --vrde=off


所以有一兩次關機時才想起 VirtualBox 還在背景執行
等於直接拔電源,下次重開就就會看到 Guest OS 開始跑硬碟檢查,現在直接把指令寫到 /etc/rc.local.shutdown 內就不必怕忘記了
因為 vm name 不是系統共用,而是根據使用者設定來找,所以要使用 su USER -c 來執行

#!/bin/bash
#
# /etc/rc.local.shutdown: Local shutdown script.
#

## stop Virtualbox
su YOUR_USER_NAME -c "VBoxManage controlvm YOUR_VM_NAME savestate"

2011年10月4日 星期二

Setup sftp for windows users to download BIG files

過去都是用 samba 在區網中分享檔案,方便,快速,又不必新增使用者(單純讀取不寫入),傳過 4GB 左右的檔案都沒問題。

但是上個月有個大檔 (13GB) 要傳到 Win 7,但是透過 samba 下載不到十分鐘就會跳網路錯誤,接著就從頭開始傳檔,搜尋了一下,似乎是 Windows 的問題,只好在 Linux 上架 sftp , Win 7 使用 WinSCP 來傳,速度至少有 5 MB/s ,偶爾可以衝到 6 MB/s (中間還有經過無線網路),就算斷線還可以續傳,對於傳大型檔案來說是不可或缺的功能,也有 log 可以看,但是有個缺點 — 檔案名稱除了正體中文外,還包含日文或簡體字時,在 WinSCP 上會顯示問號,沒辦法正常顯示。

原本要設 chroot sftp ,結果搞了半天,發現 openssh 對 chroot directory 的限制還挺嚴格的,後來還是決定有需要才開啟帳號,平常把 ssh 關掉比較沒有安全上的顧慮,順便紀錄一下設定過程。

Package:
  • openssh 5.9p1-3
  • WinSCP 4.3.4

sftp user name: sftptest
sftp server ip: 192.168.1.2

------

# Create user account
sudo useradd -m sftptest
sudo passwd sftptest

# Generate ssh key
# WinSCP only accept "rsa" and "dsa" ,not support for "ecdsa" yet (PuTTYgen)
su sftptest
cd /home/sftptest
ssh-keygen -C "$(id -un)@$(uname -n)-$(date --rfc-3339=date)"
cp .ssh/id_rsa.pub .ssh/authorized_keys

# copy .ssh/id_rsa to client machine

# Disable sftp user from login into shell
usermod -s /bin/false sftptest

# Test if able to establish sftp connection from other machine
# also verify user is unable to login from ssh
sftp -i id_rsa_from_sftp_server sftptest@192.168.1.2
ssh sftptest@192.168.1.2 -i id_rsa_from_sftp_server

# Setup Windows client
# WinSCP only accept the ssh-key generated by PuTTYgen
# In PuTTYgen menu, select Conversions -> Import to load id_rsa
# Save private key will create a *.ppk file, use it in WinSCP
# Also set UTF-8 Encoding for Filenames -> On in WinSCP
# for non-ANSCII file names


測試的時候被 sftp 的 chroot directory 搞了很久,錯誤訊息根本不對,最後是跑去看 /var/log/auth.log 才想到問題可能是出在那邊

Error message for chroot directory ownship problem :
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

這錯誤丟 Google ,大部分的解都是說要設定 TimeOut,進 /var/log/auth.log 一看,才發現問題是出在權限設定上
sshd[12399]: fatal: bad ownership or modes for chroot directory component "/path/of/chroot/directory/"
如果要設定 chroot sftp 路徑上所有目錄的擁有者都必須是 root ,而且其他使用者不能寫入,如果用家目錄 (%h) 當 chroot directory,還必須要注意使用者能夠讀取該目錄,不然 ssh 就會因為讀不到 key 跳 " Permission denied (publickey). " 錯誤,權限至少要 750

ls -l /home
drwxr-x--- 3 root sftptest 4.0K Sep 10 19:08 sftptest


Reference:

2011年9月9日 星期五

設定 chromium 將 ed2k 連結傳給 aMule 下載

DE: Xfce 4.8
chromium:13.0.782.220
aMule:10598-1

Firefox 很簡單就可以設定好 ed2k 連結的處理程式,但是 chromium 沒有類似的設定選項,找了好久都沒發現有簡單的解決方案,倒是看到 chromium issue 裡這個問題一直沒修……

chromium 預設會把 ed2k 連結傳給 xdg-open,而 xdg-open 針對每個桌面環境都有特殊設定,在 Xfce 裡面是直接傳給 exo-open 去處理,但是用不同參數測了快一個小時,exo-open 還是不能將 ed2k 連結傳給 aMule,正當要放棄的時候,看到 VLC wiki 上介紹可以用mimeinfo.cache 來設定預設程式,測試結果還真的可行,覺得前幾個小時真像個傻瓜 XD

設定範例放在 /home/dot.local/share/applications 裡面,如果只是個人設定的話,只要動到 ~/.local/share/applications/ 下的檔案:
  1. 先在 defaults.list 內加上一行 x-scheme-handler/ed2k=chromium-ed2k.desktop
  2. 再新增 chromium-ed2k.desktop,因為 chromium 傳的連結有經過 urlencode,所以要另外用程式來解碼後傳給 aMule,比較重要的是 exec 要用絕對路徑,否則會找不到程式
  3. 在 url_unquote.py 內解碼後再傳給 aMule 就搞定了,目前在 python 2.7 下測試過 OK,幾行程式碼就解決

試了兩三個網站都可以正常運作,但是 VeryCD 會有問題,點連結還是會跳開啟錯誤,最奇怪的是將整個網頁下載到電腦內再點連結就可以正常下載,不知道問題是出在那邊?目前暫時還是先用複製連結貼到 aMule 來解決。



# Update 2011-09-09
一直很好奇 exo-open 是從那個檔案抓設定檔來判斷使用者自訂開啟的程式,翻了 exo-open 的程式碼才發現是利用 exo-helper 傳參數給 exo-open,所以在 ~/.config/xfce4/helpers.rc 跟 ~/.local/share/xfce4/helpers/ 裡面就可以找到相關設定檔,之前看到以為只是說明檔,根本不會想到是藏在這裡面 XD

Reference:

2011年9月2日 星期五

目前使用的字型

Desktop Environment: Xfce 4.8
used font:ttf-arphic-ukai 、ttf-arphic-uming 、ttf-dejavu 、ttf-droid 、ttf-fireflysung 、ttf-liberation

Appearance:
  • Icons:Tango
  • Fonts:DejaVu Sans Mono Book 13 ( anti-aliasing 、no hinting)

Window Manager:
  • Title font:Liberation Sans 13
  • Theme:Smoothwall

Theme 本來想用 Xubuntu 11.04 預設的 greybird ,後來發現 Smoothwall 也不錯,很喜歡右上角視窗放大縮小的按鍵,整個視窗看起來也不會很突兀,有融為一體的感覺,系統字型原本想用 Droid ,可惜在 emesene2 裡面看起來有些字會變得很醜,還是改用 DejaVu,只有把 smplayer 和 VLC 字型改成 Droid ( qtconfig )。

qtconfig:
  • Default Font:Droid Sans Normal 14



Browser:
其實看久了還是有點不舒服,忘記之前是怎麼設定的了……

Opera:
  • Webpage normal text:DejaVu Sans

其他語言好像會自動選擇,像中文是文泉驛正黑,片假名是 AR PL New Kai





Chromium:
  • DejaVu Sans




Firefox:
  • Proportinal:Sans Serif 16
  • Serif:文鼎 PL 新宋 Mono
  • Sans-serif:sans-serif
  • Monospace:文泉驛等寬正黑



PcmanX:
  • Font & ASCII Font:Sans




Terimal:
  • Terminal:DejaVu Sans Mono Book 14 ( anti-aliasing )
  • rxvt-unicode:DejaVu Sans Mono:Book:pixelsize=16

不知道為什麼 rxvt-unicode 的中文字看起來就是特別醜,如果要編輯有中文的檔案,我還是會用 Terminal。

2011年9月1日 星期四

利用 archiso 和 aif 搭配 chroot 安裝 Arch Linux


因為硬碟出問題,系統碟在 error.log 裡面跳了一堆 UNC error,跑 S.M.A.R.T. 測試也是 read failure,用 Live USB 撐了幾天,把重要資料備 份以後,買了兩個大容量的隨身碟來當外接硬碟使用(7年前的電腦,要更換零件不如換整台,預算有限,就先湊合著用,用久了有感情也是一個原因 ^^),主要系統還是灌在硬碟上,/var 和 /home 及一些暫存的資料就丟到隨身碟上。


因為要重灌,就順便試試之前在 Arch Wiki 上看到用 archiso 配上 chroot 安裝的方法,沒想到 8/19 出了新的 image,wiki 的內容已經不能適用,花了將近一天測試順便寫了個 script,丟在之前開的 repository 內( utils/unarchfs.sh ),改天有空再更新 Arch Wiki。

新的 iso 包含了 5 個檔案,mount archiso 後再一一解壓縮或 mount 到 chroot 目錄內,步驟簡單描述如下,因為記憶體有 1.5G,所以就全部都丟到 /tmp/archinstall 下面


# mount archlinux iso

mkdir -pv /tmp/archinstall/image
mount -o loop archlinux-2011.08.19-core-i686.iso /tmp/archinstall/image

# create directory for chroot
mkdir -pv /tmp/archinstall/archlinux

# start to extract
cd /tmp/archinstall/image/arch/i686/

# root-image
unsquashfs -dest /tmp/archinstall/root-image root-image.fs.sfs
mount -t ext4 /tmp/archinstall/root-image/root-image.fs /tmp/archinstall/archlinux

# create directories in chroot env for other fs to mount
mkdir -pv /tmp/archinstall/archlinux/lib/modules
mkdir -pv /tmp/archinstall/archlinux/usr/share
mkdir -pv /tmp/archinstall/archlinux/repo/core/{i686,any}

# lib-modules
unsquashfs -dest /tmp/archinstall/lib-modules lib-modules.fs.sfs
mount -t ext4 /tmp/archinstall/lib-modules/lib-modules.fs /tmp/archinstall/archlinux/lib/modules

# repo-core-i686
mount -o loop -t squashfs repo-core-i686.sfs /tmp/archinstall/archlinux/repo/core/i686

cd /tmp/archinstall/image/arch/any/

# usr-share
unsquashfs -dest /tmp/archinstall/usr-share usr-share.fs.sfs
mount -t ext4 /tmp/archinstall/usr-share/usr-share.fs /tmp/archinstall/archlinux/usr/share

# repo-core-any
mount -o loop -t squashfs repo-core-any.sfs /tmp/archinstall/archlinux/repo/core/any

接著 cd /tmp/archinstall/archlinux/ ,再進入 chroot 下 aif -p interactive 就可以開始安裝,比起用 pacman 安裝要方便許多,不必自己準備 /dev 下的檔案, aif 也會幫忙跑 mkinitcpio、locale-gen、設定 Grub ……等,十分輕鬆,不過有一點要注意的是安裝完後要在 chroot 環境內把 aif 自動掛載的磁碟卸載掉,否則離開 chroot 後會發現沒辦法卸載 root-image,可是又找不出有其他程式使用這個檔案。

目前系統已使用快一個禮拜,/home 掛在 USB 3.0 的隨身碟上插 2.0 的接口,傳大檔可以跑到 15 mb/s,只是瀏覽器的 cache 要設到記憶體下(預設丟在 /home/$USER 內),否則開新分頁會很卡,大概是頻繁寫入小檔案,寫到隨身碟效率變差。

此外還有遇到 gdm 的小問題:舊系統是用 xfce 4.8 配上 .xinitrc 來設定 gcin ,但是換成 gdm 來登入(沒安裝 gnome)就沒辦法搞定,會把全部的 locale 改成 zh_TW.UTF-8,我只是想用中文輸入法,不想全部介面都變成中文,搞到最後還是換回 xdm。

另外困擾我兩天的問題是字型,隨身碟系統上是用 Gnome 3,切回 xfce 後預設字型完全不同,讓我眼睛痛了整整一天,平常應該要定期紀錄常用字型,晚點要再寫一篇來紀錄目前使用的字型。

Reference :
Arch Wiki - Install_from_Existing_Linux
archiso - README


2011年8月9日 星期二

更改 Gnome 3 的螢幕解析度

# Update 2011-08-19
# 要安裝 nouveau-dri 才能啟動 gnome-shell,否則只會進入 fallback mode

在隨身碟上面裝了 Arch Linux + Gnome 3 來玩,前幾天把顯卡驅動程式由原本的 nvidia 換成 nouveau ,重開機發現沒辦法進入 X ,修改 /etc/X11/xorg.conf
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
EndSection

將 nvidia 改成 nouveau 就可成功 startx,但是進到 Gnome 跳出警告變成 fallback mode
解析度變得很奇怪,比之前設定的 1024x768 還要小,開 System-Settings 想看一下問題出在哪,但是......


System-Setting 的視窗沒辦法調整大小啊!幹!


chromium 跟 Terminal 、dconf-editor 都可以調整視窗大小,就是 System-Settings 他媽的不能調整視窗大小,就只能傻傻的看著視窗的上半部顯示目前 Monitor 名稱,下面的選項完全拉不到!



這 screenshot 還是恢復正常解析度後拍的,不然 Gnome 3 的 Take Screenshot 也是沒辦法調整視窗!難怪 Gnome 3 剛釋出的時候就有人在說視窗少了放到最大的功能很不方便,在 fallback mode 把視窗拉到最上層不會自動調整大小到符合螢幕,看著只剩一半的設定畫面,就只能在心裡問候這些開發者的老媽。

幸好隨身碟上面還有裝 xfce4 ,開進去一看,發現解析度只剩下 640x480,720x400 這兩種,才能找到解法,在原本 nvidia-xconfig 產生的 /etc/X11/xorg.conf 中把 "Monitor" Section 全部 comment ,重新 startx 就可以找到正常的解析度,如果沒有裝 xfce4 ,我就不知道該怎麼辦了......

後來發現還有 xrandr 可以用,可以參考 Ubuntu Wiki 上的說明

Reference:
[solved] Setting screen resolution with nouveau/lucid
[solved] How to get rid of nouveau?

2011年7月28日 星期四

Setup moinmoin wiki with lighttpd

OS: Arch Linux
Package:
  • python2: 2.7.2-2
  • moinmoin: 1.9.3-2
  • lighttpd: 1.4.29-1
Install Path: /srv/http/





# edit /etc/lighttpd/lighttpd.conf to enable fastcgi

cp -v /usr/share/moin/server/moin.fcgi /srv/http/bin_path/moin.fcgi

# edit moin.fcgi

cp -r /usr/share/moin/{data,underlay} /srv/http/wiki/

# in lighttpd.conf, server.username is "http", change directories owner to http
chown -R http /srv/http/wiki/{data,underlay}
cp -v /usr/share/moin/config/wikiconfig.py /srv/http/wiki/

# edit wikiconfig.py, add superuser account

# Start wiki, register superuser account
/etc/rc.d/lighttpd start

# go to http://localhost/wiki/, register superuser account
# http://localhost/wiki/LanguageSetup to install page packages

# Install theme
# Download theme from http://moinmo.in/ThemeMarket
# if using the built-in static server
# static files are stored in /usr/lib/python2.x/site-packages/MoinMoin/web/statc/htdocs/
# I prefer the moniker theme :)

mv theme file to /usr/lib/python2.7/site-packages/MoinMoin/web/static/htdocs/
mv theme.py to /srv/http/wiki/data/plugin/theme/

# test config
/etc/rc.d/lighttpd restart

2011年6月4日 星期六

Ignore tracked file in Mercurial without removing it

hgignore only ignore files that have not been tracked before, if you add some files to the repository at previous commits, then you changed your mind, don't want to track those files, list them in .hgignore won't stop Mercurial from tracking them, you need to use `hg rm -Af FILENAME` to remove files from the repository ( files will still exist in the directory ), after commit, Mercurial will really stop tracking those files.

Step by step:
  1. list files in .hgignore ( eg. echo "glob:FILENAME" >> .hgignore )
  2. hg rm -Af FILENAME
  3. hg ci -m "Stop track FILENAME"

My test:
[lefthaha@HOST work]$ mkdir test
[lefthaha@HOST work]$ cd test/
[lefthaha@HOST test]$ hg init
[lefthaha@HOST test]$ touch abc.txt
[lefthaha@HOST test]$ hg ci -Am 'abc.txt'
adding abc.txt
abc.txt
committed changeset 0:1949cce3893d

[lefthaha@HOST test]$ hg st
[lefthaha@HOST test]$ hg head
changeset: 0:1949cce3893d
tag: tip
user: left < lefthaha >
date: Sat Jun 04 17:18:02 2011 +0800
files: abc.txt
description: abc.txt

[lefthaha@HOST test]$ echo "glob:abc.txt" > .hgignore
[lefthaha@HOST test]$ echo ".hgignore" >> .hgignore
[lefthaha@HOST test]$ echo "cde" >> abc.txt

[lefthaha@HOST test]$ hg st
M abc.txt
[lefthaha@HOST test]$ hg ci -m "modify abc.txt"
abc.txt
committed changeset 1:76446b6f8d7f
[lefthaha@HOST test]$ ls
abc.txt
[lefthaha@HOST test]$ hg rm -Af abc.txt
removing abc.txt
[lefthaha@HOST test]$ hg st
R abc.txt
[lefthaha@HOST test]$ ls
abc.txt
[lefthaha@HOST test]$ hg ci -m "hg rm abc.txt"
committed changeset 2:b07e13f2dd28

[lefthaha@HOST test]$ echo "ijk" >> abc.txt
[lefthaha@HOST test]$ hg st
[lefthaha@HOST test]$ echo "ijk" >> abc.txt
[lefthaha@HOST test]$ hg st
[lefthaha@HOST test]$ cat abc.txt
cde
fgh
ijk
ijk
[lefthaha@HOST test]$ hg ci
nothing changed

[lefthaha@HOST test]$ cd ..

# clone the repository
[lefthaha@HOST work]$ hg clone test/ test2
updating to branch default
resolving manifests
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
[lefthaha@HOST work]$ cd test2/
[lefthaha@HOST test2]$ ls
[lefthaha@HOST test2]$ hg st
[lefthaha@HOST test2]$ hg head
changeset: 2:b07e13f2dd28
tag: tip
user: left < lefthaha >
date: Sat Jun 04 17:20:12 2011 +0800
files: abc.txt
description:
hg rm abc.txt

[lefthaha@HOST test2]$ hg log
changeset: 2:b07e13f2dd28
tag: tip
user: left < lefthaha >
date: Sat Jun 04 17:20:12 2011 +0800
files: abc.txt
description:
hg rm abc.txt

changeset: 1:76446b6f8d7f
user: left < lefthaha >
date: Sat Jun 04 17:19:34 2011 +0800
files: abc.txt
description:
modify abc.txt

changeset: 0:1949cce3893d
user: left < lefthaha >
date: Sat Jun 04 17:18:02 2011 +0800 1 123
files: abc.txt
description:
abc.txt

[lefthaha@HOST test2]$ hg update -r 1
resolving manifests
getting abc.txt
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
[lefthaha@HOST test2]$ ls
abc.txt



There is another trick on Mercurial wiki to ignore multiple files in one line command, not tried yet.

Tips and Tricks - 34. Remove files that are matched by .hgignore but were added in error


Reference:
superuser - Can you remove a file from Mercurial without removing it from the filesystem like Git?
hg(1)
hgignore(5)

2011年5月26日 星期四

sha1 hash encoded in base64

到了報稅的季節,幫家人安裝報稅軟體的時候發現有提供 SHA1 驗證檔,點進去一看,應該是以 base64 編碼,在 Windows 下有安裝 Python 2.7 ,就直接解碼看看( 沒想到 Python 內建的 IDLE 那麼難用,已經習慣 shell 裡按上下鍵叫出之前的指令了... ),解開一看發現真的是 hash (註一),沒有轉成一般可見的文字,跟以前看過的驗證碼(註二)不一樣 ,還以為是我下錯指令或編碼不是 base64 ,翻了說明文件才發現是我見識淺薄,用 hashlib 的 hash.digest() 就可以得到相同結果,使用 hash.hexdigest() 才會得到一般的驗證碼,但是這串文字又不能直接 decode("hex"),在 Python 裡面 decode("hex") 或 encode("hex") 都是已經轉碼好了(註三),身為一個懶得思考的傢伙,就直接跑去看人家 hashlib 原始碼是怎麼寫的,結果人家是用 C 寫的,後來又發現 binascii 這個 module 可以直接用 hexlify 這個 function 轉換字串,又跑去看原始碼,看到註解還真有點囧
/* make hex version of string, taken from shamodule.c */

for(i=j=0; i<sizeof(digest); i++) {
char c;
c = (digest[i] >> 4) & 0xf;
c = (c>9) ? c+'a'-10 : c + '0';
hex_digest[j++] = c;
c = (digest[i] & 0xf);
c = (c>9) ? c+'a'-10 : c + '0';
hex_digest[j++] = c;
}

沒想到我連這麼簡單的字元轉換都記不起來,還用
bin( ord("a") >> 4 & 0xf )
配合 ascii 表查了一下才瞭解這段程式
算 hash 的時候還忘記要用 binary mode 讀檔...Orz

後來寫了一小段 script 來比對驗證碼是否符合,如果明年幫忙安裝報稅軟體的時候可以拿來用 ( 感覺機會不大 XD ),最後要抱怨一下,這 "個人綜合所得稅電子結算申報程式" 真是他媽的難用,難用到我只是幫家人操作讀取檔案和列印單據就想摔滑鼠的程度。


註一\xe6@\x0e\x86\xdeD\xdeW\x87\xf8\t\x9c=o\xee\xd3\xdcw\xdc
註二
60e6400e86de44de5787f8099c3d6feed3dc77dc
註三"abc".encode("hex") == "616263"

2011年5月9日 星期一

Arch Linux Live USB

一直很想弄個 Live USB Stick 來玩玩,但是試了 UNetbootin 和 Universal USB Installer,不管是 GNOME 3 Live CD、Ubuntu、Xubuntu、Mint 都沒辦法成功開機,不然就是畫面有問題,進入 X 後變成模糊畫面,燒到 CD 來測試卻是正常,後來又看到了 Debian Live Project,翻了文件發現要搞定一套可以用的系統得花上更多的時間,乾脆就直接把 Arch Linux 安裝到 USB Stick 上面,對 Arch Linux 比較熟悉,操作起來會比較順手一點,要保存資料和設定也很方便

OS: Arch Linux
USB Stick minimal disk space: 4G ( About 3.1G after GNOME 3 installed )

因為希望這隨身碟還是能拿來存一些資料,所以有另外切一個 vfat 的分割,而且這個分割的順序必須是第一個,Windows 才讀的到
fdisk -l
Disk /dev/sdd: 8032 MB, 8032092160 bytes
248 heads, 62 sectors/track, 1020 cylinders, total 15687680 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xdacf2b24

Device Boot Start End Blocks Id System
/dev/sdd1 * 2048 1435647 716800 c W95 FAT32 (LBA)
/dev/sdd2 1435648 9824255 4194304 83 Linux
/dev/sdd3 9824256 15687679 2931712 83 Linux

系統安裝在 /dev/sdd2 ,type ext4,掛載的時候時候加上 noatime 這個 flag

這次是用 pacman -r /mnt/arch_live 的方式去安裝,要手動設定一些 /dev 的 nodes ,有點麻煩,不知道利用 CD Image 的 AIF 會不會比較簡單

裝完需要的 packages ,像 xorg-server、nvidia、gnome 後,要記得在 /etc/mkinitcpio.conf 裡的 HOOKS 加上 usb,因為 grub-install 失敗,所以是用手動安裝的方式,沒搞清楚設定檔,結果卡了一天都沒辦法進入系統...Orz

整體上來講,照著 wiki 上的指示安裝,再依 Beginner's Guide 做設定,應該是沒什麼大問題,另外網路頻寬也要夠,否則下個 pacman -Syu 大概會抓到睡著

常常用 sudo ,下指令和複製本機設定檔的時候要再三檢查路徑,搞錯的話就要跟太陽公公說再見了;還有之前沒試過 chroot ,每次 sudo mount proc, sys, dev 都有點怕打錯,也有寫個 bash script 來幫忙,倒是 umount 還要自己 key,還要再研究一下怎麼寫,最怕的就是沒辦法 umount ,就要回想剛剛是不是下了什麼指令動到 /dev 下面的東西...

碰到卡比較久的問題:
  1. GRUB 出現 Error 15: File not found:
    問題是在 menu.lst 的設定,當初安裝 GRUB 的時候是安裝到 MBR,設定的 root 是 (hd0,0) ,但是我的系統是安裝在第二個分割,所以必須要改成 (hd0,1);由於 /boot 沒有獨立一個分割區給他,所以 kernel 和 initrd 前面必須加上 /boot/ ,GRUB 才知道要到 boot 這個資料夾下尋找 kernel image
    ## /boot/grub/menu.lst
    # (0) Arch Linux
    title Arch Linux [/boot/vmlinuz26]
    root (hd0,1)
    kernel /boot/vmlinuz26 root=/dev/disk/by-uuid/544dccdf-2aaf-4843-973c-f04c305f5e1f ro vga=792
    initrd /boot/kernel26.img

  2. 開機後無法進入 X:
    錯誤訊息有好幾個,條列如下:
    # 開機以後進入 X ,畫面閃了幾下出現類似
    gdm-binary[3684]: WARNING: GdmDisplay: display lasted 0,858447 seconds
    gdm-binary[3684]: WARNING: GdmDisplay: display lasted 0,864611 seconds
    gdm-binary[3684]: WARNING: GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors
    # 進 console 裡下 `startx` 則是出現以下錯誤
    (EE) USB USB Keyboard failed to initialize for relative axes.
    # 在 Xorg.0.log 除了上面鍵盤的問題之外還有一些其他的錯誤訊息
    (WW) Open ACPI failed (/var/run/acpid.socket) (No such file or directory)
    (WW) `fonts.dir' not found (or not valid) in "/usr/share/fonts/X11/100dpi/".
    Entry deleted from font path.
    (Run 'mkfontdir' on "/usr/share/fonts/X11/100dpi/").

    ### 解決方法:不太確定是哪個方式解決的,只好把做過的修改一樣樣列出來 ###
    # 1.在 /etc/rc.conf 的 DAEMONS 中加入 hal 和 acpid
    DAEMONS=(syslog-ng dbus hal acpid @network netfs crond @openntpd @alsa)
    # 2.依錯誤訊息指示,在 /usr/share/fonts/X11/... 中執行 mkfontdir
    # 另外也安裝了一些字型像 ttf-fireflysung, wqy-zenhei, ttf-dejavu 之類...
    # 3.Reinstall xorg-server,gdm,並檢查 ~/.xinitrc 是不是有加上
    exec ck-launch-session gnome-session

  3. 網際網路無法連線:
    區網是使用 DHCP,一開機就會啟動,網際網路連線則是使用 PPPoE 手動啟用
    ping 區網上的電腦沒有問題,但是對外像 www.google.com, 168.95.1.1 都 ping 不到,後來才想到可能是 route table 的問題
    # 預設的 gateway 是 eth0 ,照理說 PPPoE 啟動應該會把預設改成 ppp0 才對
    [left]$ route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    h254.s98.ts.hin * 255.255.255.255 UH 0 0 0 ppp0
    192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
    default * 0.0.0.0 U 0 0 0 eth0

    # 手動更改 gateway 就正常了
    [left]$ sudo route del default
    [left]$ sudo route add default ppp0

    # 測試確定是 route 的問題的話,可以在 /etc/ppp/ 下面新增名為 ip-pre-up 的 script
    # 這樣 pppd 在啟動的時候就會去執行它,內容如下 ( 記得要 chmod +x 才能執行)

    [left]$ cat /etc/ppp/ip-pre-up
    #! /bin/sh
    /sbin/route del default

    [left]$ sudo chmod +x /etc/ppp/ip-preup

在 bitbucket 上面開了 repository 放些設定檔,有興趣的可以參考看看。


Reference on Arch Linux Wiki:
Installing Arch Linux on a USB key
Install from Existing Linux
Change Root
Tips for Minimizing SSD Read/Writes
Beginners' Guide

2011年4月8日 星期五

log cron jobs output

之前在看 /var/log/crond.log 的時候常會看到以下類似的訊息
Mar 20 18:37:01 `hostname` crond[1234]: FILE /var/spool/cron/root USER root PID 9999 job sys-daily
Mar 20 18:37:16 `hostname` crond[5678]: mailing cron output for user root job sys-daily
Mar 20 18:37:16 `hostname` crond[5678]: unable to exec /usr/sbin/sendmail: cron output for user root job sys-daily to /dev/null
Arch Linux 預設不會安裝 sendmail,所以 cron jobs 所產生的訊息沒辦法傳給使用者,但是又懶得去安裝與設定 postfix ,乾脆就寫個 script 把這些訊息存到 /var/log/cron_output/ 這個目錄下面,沒想到這一寫也是花了不少時間,我果然是個遜泡...

因為 crond 執行 cron jobs 時會把權限切換到該使用者一樣,寫入 log 的時候會有權限問題,如果 root 沒有幫忙在 /var/log/cron_output/ 下面建立 ${USER}.cron_output.log,會改成存到使用者的家目錄。

開放讓使用者能寫入 /var/ 下的檔案雖然有點危險,如果帳號被盜可能會把硬碟空間吃光導致其他 log 寫不進去,雖然可以用 quota 或另外準備一個 cron job 來偵測硬碟剩餘空間判斷要不要砍掉這個檔案或拿掉寫入權限,但身為一個不喜歡分開看 log 檔的懶惰傢伙,就讓他隨風而去吧~
把這支 script 丟到 /var/log/cron_output/ 後

sudo mkdir -v /var/log/cron_output/
sudo touch /var/log/${USER}.cron_output.log
sudo chmod 600 /var/log/${USER}.cron_output.log
sudo chattr +a /var/log/${USER}.cron_output.log

再修改 /etc/conf.d/crond,將
CROND_ARGS="-S -l info"
改成
CROND_ARGS="-S -l info -M /var/log/cron_output/cron_output_to_log.sh"

順便利用 logrotate 來管理這些 log

結果隔天馬上就發現有兩個問題要改,還是去年的問題,一堆 pacnew 檔案到現在都還沒 merge XDD~

Reference:
dcron man package
鳥哥的 Linux 私房菜:登錄檔的輪替 (logrotate)

2011年3月4日 星期五

stop X from listening on Port 6000

OS: Arch Linux
Display Manager: xdm
Desktop Environment: Xfce 4.8

之前用

netstat -tnlp

都會看到一個 6000 的 Port 開著,雖然知道那是 X 啟動的,而且 iptables 有設定好應該也不會出什麼問題,但還是有點討厭,查了一些資料,設定 ~/.xinitrc 也沒用,今天突然想到從 xdm 這邊下手,果然一試就成功。

目前是照 ArchWiki 上所寫,修改 /etc/inittab 來啟動 xdm,要關閉 6000 的 Port 必須在啟動 X 的時候傳個參數 -nolisten tcp ( 請參考 man xserver ),需要修改的檔案是 /etc/X11/xdm/Xservers

將原本的
:0 local /usr/bin/X :0

改成
:0 local /usr/bin/X -nolisten tcp :0

接著 sudo init 3 關閉 X ,sudo init 5 重新啟動 X 應該就不會看到 6000 Port 開著了 :)


Reference:
How Do I Prevent X From Exposing A TCP Port?
Arch Linux Forums: X is listening on port 6000?

2011年2月21日 星期一

use `tree` to list current directory contents

想要看某個目錄下面的目錄和檔案結構,但是用 `ls` 一層層列出來實在是太麻煩了,而且也很不直觀,用 `tree` 可以過濾不想要的 pattern,也可以設定 level,寫了支小 script 來處理各項變數;將查詢的 script 放在同一個目錄下面,方便管理,將每次的查詢結果加上日期儲存起來。

放在 bitbucket 上的 repository 裡,以後如果寫些 script 也會丟進裡面( 年輕人就是要玩 HG ! )


#!/bin/bash
# using `tree` to list current directory
# extract current directory name, record time and append to output file
# original: tree -L 3 -I "porn*|tree*" --noreport ./ >> ./tree.txt

LEVEL=3
EXCLUDE_PATTERN="porn*|tree*"
DIRNAME=`basename $PWD`
OUTPUT_FILE="tree.txt"

echo "Using \`tree\` to list contents of \"" $DIRNAME "\" to" $OUTPUT_FILE

echo >> $OUTPUT_FILE
echo "********" >> $OUTPUT_FILE
echo `date` >> $OUTPUT_FILE
echo "********" >> $OUTPUT_FILE
echo >> $OUTPUT_FILE

cd ..
tree -L $LEVEL -I "$EXCLUDE_PATTERN" --noreport $DIRNAME >> $DIRNAME/$OUTPUT_FILE
script download

Reference:
tree man page
Four ways to extract the current directory name

2011年1月25日 星期二

fix emesene 1.6.3 login error

一兩個月前開始,登入 emesene 1.6.3 版的時候都會跳出下列錯誤:
emesene error
Exception
You are using emesene 1.6.3 - "Uberlândia" so you're free to complain here:
http://forum.emesene.org/index.php/board,19.0.html
Check already existing tickets for duplicates first, please.
Traceback (most recent call last):

File "/usr/share/emesene/emesenelib/soap/manager.py", line 139, in process
return process()

File "/usr/share/emesene/emesenelib/soap/manager.py", line 76, in process
response.callback(response, *response.args)

File "/usr/share/emesene/emesenelib/ProfileManager.py", line 155, in onGetProfile
photo = response.body.split('&lt;/Photo>')[0].split('&lt;Photo>')[1]

IndexError: list index out of range
接著 MSN 暱稱變成註冊信箱,個人狀態一片空白,在官方論壇看到討論說這是 MSN 傳回的內容有改變,造成 emesene 抓不到暱稱和狀態,只要更新到最新的 SVN 版本就可解決。

因為懶得再去找 SVN 版本下來安裝,就直接上 Repository 抓 ProfileManager.py 下來產生 patch,反正有問題再用 patch -R 就可以更改回來,目前使用起來一切正常,不知道 emesene2 什麼時候才會發佈 stable 版本?

diff -u /usr/share/emesene/emesenelib/ProfileManager.py ~/ProfileManager.py > emesene_profile.patch
patch -v /usr/share/emesene/emesenelib/ProfileManager.py emesene_profile.patch