顯示具有 HOW-TO 標籤的文章。 顯示所有文章
顯示具有 HOW-TO 標籤的文章。 顯示所有文章

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月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月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年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

2010年11月14日 星期日

讓 xpdf 能正常顯示無內嵌字型的檔案

之前有寫過一篇 讓 xpdf 能正常顯示中文 (Arch Linux);但是捐血中心寄來的檢驗報告一直都是亂碼,原本以為是捐血中心的問題,直到前幾天想下載 大家來學 Vim 一個歷久彌新的編輯器 的 pdf 才發現沒有內嵌字型的 pdf 也是亂碼,於是就用 shell 呼叫 xpdf 開檔案,再由錯誤訊息去 google ,找了一堆討論,發現 xpdf 的語言包可以解決這個問題;自己測試沒有問題後,再追到 Arch Linux 的 package 上面,發現最新的 PKGBUILD 沒有複製 Adobe-CNS1.cidToUnicode 到 /usr/share/xpdf/ 下面,丟了個 bug report ,隔天 trunk 的 PKGBUILD 就更新了,雖然不知道什麼時候才會移到正式版上面去,但是能貢獻自己小小心力,還有學到一丁點知識,有點開心 :)

Reference:
FreeBSD Chinese HOWTO - 6.9. 以 gs 觀看不內嵌的 pdf 檔
"資訊人權貴" 之家 - 字形/中文
Edward G.J. Lee 的 xpdfrc 範例檔
xpdf - Download
Arch Linux Package - xpdf-chinese-traditional
Arch Wiki - Creating Packages

2010年11月2日 星期二

mount /var to a new partition

當初安裝的時候沒有把 /var 獨立出一個分割區,最近發現 / 剩餘空間愈來愈少,利用
sudo du -h --max-depth=1 /
才發現 /var 就佔了超過 2G ,大部份都是被 Cache 這個目錄吃掉,這是 pacman 的暫存檔,雖然可以用
sudo pacman -Sc
清掉,但是身為一個懶惰的傢伙,加上不曉得什麼時候會需要 downgrade 某個套件,乾脆就另外準備一個分割區來放。


備份資料到隨身碟時,發現裡面中文目錄或檔案都變成亂碼,似乎是 xfce4 的問題,
修改 /etc/xdg/xfce4/mount.rc
在 [vfat] 下面增加一行
utf8=true
下次插入隨身碟時就可以正常顯示中文了。

使用 Gparted Live CD 以預設選項進入 X 時,螢幕會出現
Out of Range
無法顯示畫面,逼的我用 Alt + SysRq + [ U , B ] 來重開機,改手動設定解析度就可以正常進入 X,切好分割區並格式化後,mount 原本的 / 與 新切割給 /var 的分割區,複製舊資料,更改原本的 /etc/fstab 。
mkdir ~/rrt ~/new_var

mount /dev/real_root_partition ~/rrt
mount /dev/new_var_partition ~/new_var

# 複製原本 var 下的檔案到新分割區
# 重新命名原本的 var,避免重新開機後掛載到內有檔案的資料夾
sudo cp -ax ~/rrt/var/* ~/new_var/
sudo mv ~/rrt/var ~/rrt/var.old
sudo mkdir ~/rrt/var

sudo cp ~/rrt/etc/fstab ~/rrt/etc/fstab.old

# 利用 blkid 來查 uuid 資料並更新 fstab 資料
blkid > ~/uuid.txt
cat ~/rrt/etc/fstab ~/uuid.txt > ~/fstab.new
# 使用 vi 修改完畢後覆蓋回原本的 /etc/fstab
sudo cp ~/fstab.new ~/rrt/etc/fstab
# 重新開機,測試是否有成功掛載
# 自己重新開機後有碰到一個問題,blkid 顯示的還是舊的分割區資料
# 後來 man blkid 才知道是讀取 cache 的問題
# 使用 blkid -g 就可以清除 ( 但是要用 root 權限去跑,否則沒用 )
sudo blkid -g
sudo blkid

Reference:
ArchWiki:Xfce
Ubuntu Forums:I want to move /var to a new partition

2010年11月1日 星期一

Hide Opera system tray icon with Opera 10.63

過去都是使用
opera -notrayicon
來隱藏 Opera 的圖示,現在已經沒有這個 argument,改成直接在 opera:config 裡面設定



取消勾選 Show Tray Icon 就行了。

2010年10月28日 星期四

在 linux 下的 UTF-8 termial 使用 telnet 連上中文 bbs 與 mud

目前是使用 PCMan X 上 bbs,在巴哈洽特上看到有人推廣 doommud,連過去卻無法輸入任何字元,在 termial 裡使用 telnet 連上去則是中文全變亂碼,google 了一下才發現解法,只要使用 luit 就行了


luit -encoding big5 telnet doommud.twbbs.org 4000


在 Xfce Terminal Emulator 和 rxvt-unicode 測試過,拿來上 bbs 也行,只是不在 big5 範圍內的文字會無法顯示,一些 ascii art 也會跑掉,單純看文章應該是夠用的,但是只能在 X window 下的 terminal emulator 使用,一般的 terminal 大概要使用 zhcon 才能正常顯示? (沒試過)

參考:
[Tips]解決utf8環境下,telnet bbs亂碼
Luit -- locale and ISO 2022 support for Unicode terminals

2010年7月10日 星期六

mount DVD and windows share folder with chinese characters

在 Windows 下有燒錄一些光碟,裡面資料包含了中文檔名,換用 Linux 讀取時發現全部變成問號,網路上搜尋後發現要在 /etc/fstab 內設定 iocharset=utf8 就能正常顯示中文

/dev/dvd /media/dvd auto ro,user,noauto,unhide,iocharset=utf8 0 0


家中有台 windows 開分享資料夾,要丟資料到那台列印前,先使用

smbclient -L //WINDOWS_SERVER_NAME_OR_IP -U username

輸入正確密碼後,就會列出該台電腦上有分享的服務,確認要連線的分享資料夾後

sudo mount -t cifs -o iocharset=utf8,username=USER_NAME //WINDOWS_SERVER_NAME_OR_IP/SHARE_FOLDER /mnt/SHARE_FOLDER

一樣驗證密碼後就能使用分享資料夾。

在測試的時候才發現不輸入帳號密碼也可以看到 XP 上面的所有磁碟分割和服務,嚇了一跳,趕快把 guest 的帳號停用,另外建帳號作分享之用;查了一下,XP 預設會共用所有磁碟分割 (連線還是要輸入帳號密碼) , 雖然只要管理者有設密碼,就不會隨便被連進去,遠端管理也很方便,但還是覺得不太安心,如果要隱藏共用磁碟的話,可以參考下方第四個連結。

Reference:
如何讓ubuntu顯示ms燒入光碟的文字
[分享] 在 ubuntu 下使用 big5 編碼的光碟片的注意事項

Mount a Windows Shared Folder on Linux with Samba
如何防止 Windows NT Server 4.0 的系統管理共用的建立

2010年2月24日 星期三

設定開機時自動 fsck 的頻率

Reference:設定常規檔案系統檢查 (Filesystem Check, fsck)、忽視fsck 當mount filesystem達到指定的數量

指令:dumpe2fs、tune2fs

因為電腦用途為個人使用,每天開開關關,沒幾個禮拜就會跑 fsck 檢查硬碟,實在很煩,可是又不想把這功能關掉,就來把檢查的掛載次數設多一點。

相關資訊利用

sudo dumpe2fs -h device

來查詢,Maximum mount count 就是設定這個磁區掛載幾次後,下次掛載時便執行 fsck 檢查,修改方式:

sudo tune2fs -c [ Maximum mount count Number] device

另外 Check interval 代表多久檢查一次,修改方式:

sudo tune2fs -i [ interval-between-checks ] device

如果在 /etc/fstab 內設定不檢查的話,用 dumpe2fs 來看上面的數值就是 -1 和 0

這些指令只對 ext2/ext3/ext4 有效,其他格式如果在 /etc/fstab 內設定要檢查的話,不知道有沒有辦法設定檢查時間,還要查一下相關資訊。

2010年1月6日 星期三

搞定不正確的系統時間

忘記從去年的什麼時候開始,每次開機時,系統時間都不準,必須要手動下 sudo ntpd -ds 才能校正,但下次開機時又是一樣的情形,查看 /var/log/daemon.log ,上次關機時 ntpd 明明都有 adjtime ,就覺得很奇怪,原本想說是不是 BIOS 電池沒電,但也不會每次都慢個一兩天,而且在 開機過程中 ntfs-3g 的時間是正常的,非常神奇,明明前後的時間都不對,就只有 ntfs-3g 跑的那段時間是正確的,昨天晚上突然想到 /etc/rc.conf 裡面似乎有 hardwareclock 的選項,才想到用 hwclock 指令查查看,果然問題就出在這邊,上網 google 了一下,才發現解決方法:

先 rm /var/lib/hwclock/adjtime (開機後會再重新產生,所以不用備份)

利用 ntpd -ds更新系統時間 (我是用 openntpd)

再下 hwclock -w

下次開機時間應該就正常了,不過問題出在哪我還不是很清楚,或許要翻翻 hwclock 的 document 或是上次更新時有將新的rc.conf 安裝到 rc.conf.pacnew,我還沒更新內容的關係?

Reference:
Arch Linux Forum:
My hw clock is randomly off even though I set it right...

吃葡萄不吐葡萄皮:
archlinux无厘头的时间错乱问题

2009年12月3日 星期四

[Link] Python Speed

Python Speed
PerformanceTips
Python Patterns - An Optimization Anecdote

可以用 profile 來檢視執行效率

看了以上幾篇,讓我想法改變不少,不過如果完全照裡面的作法來寫,程式碼會變得不怎麼好看而且不好維護,感覺跟 zen of python 有相抵觸

另外還翻到在 lambda 裡面用 if / else 的方法:
  1. Boolean Operations:利用 and, or
  2. x if C else y:會先判斷 C ,再決定要執行 x 或 y
感覺上第一個比較不直覺,但是第二個似乎也不怎麼好看...

2009年11月22日 星期日

Superblock last mount time is in the future

今天下午電腦當機後, 等到能重開機起來時出現錯誤,紀錄一下如何解決:

CMOS Check Sum Error - Default loaded,
表示 BIOS 恢復原始設定,如果之前有動過,要重新調整,進入 Linux 開機流程後,又出現

Filesystem Check Error : Superblock last mount time is in the future,
這是因為 BIOS 時間重設所造成的問題,只要 mount -a , 重新掛載磁區,等 ntpd 起來再更新時間即可,

另外為了保險起見,用 fsck 檢查一下各個磁區,
先編輯 /etc/fstab ,將各個磁區的 pass 改為 2 ,
下 shutdown -Fr now ,就會重新開機並執行 fsck 了
如果沒有出現錯誤再將 /etc/fstab 修改為原本狀態

另:
fdisk -l 顯示目前有抓到哪些磁區
blkid 可列印出各磁區的 uuid 供檢查