2010年11月1日 星期一

CentOS 5.5 編譯核心

CentOS 5.5 的 kernel 版本是 2.6.18, 新版本是 2.6.35.7, 好久沒編譯核心了, 來大展身手一番 (事實證明還差得遠)

編譯好後重開機, 結果不意外 panic, 成堆錯誤訊息, 第一個就搞不懂了

insmod: error inserting '/lib/dm-region-hash.ko': -1 File exists 

這甚麼(尛)? 谷歌一下還真的有解, 方法是解開 initrd-2.6.35.7.img 這個檔

zcat initrd-2.6.35.7.img | cpio -i

然後修改 init

echo “Loading dm-region-hash.ko module”
insmod /lib/dm-region-hash.ko

上面兩行會重複(搞甚麼?竟然會重複?), 把重複的刪掉, 再把檔案壓回去: 先把所有解出來的東西包成一個檔案

find . | cpio -c -o > ../initrd

再壓縮這個檔案

gzip -9 < initrd > initrd-2.6.35.7.img

重開機, 真的沒有原先的錯誤了, 但還有下一個 (尛)?

could not find filesystem '/dev/root'


有人說是沒抓到硬碟, 有人說是 label 有問題, 試過都不行, 最後解法是修改 .config的一個參數


CONFIG_SYSFS_DEPRECATED_V2=Y


就可以了, 看來這個參數是對舊的檔案系統的支援, 原本 CentOS 用的是檔案系統要淘汰的

2010年9月27日 星期一

linux 刪除檔名包含dash - 的檔案

發現要刪除一個檔名有 - 在裡面的檔案, 例如 -123, 刪都刪不掉, 用

rm -123 當然不行, 用

rm /-123 看起來刪掉了, 但其實檔案還在, 最後方法原來是... 要加一點

rm ./-123 就可以了, 但這是什麼道理? 如果要產生檔名包含 -, 也是一樣要加一點. 例如

touch ./-123

2010年9月26日 星期日

linux 檔案加密

Linux 要怎麼把檔案加密呢? 谷歌一下, 有人說用 openssl 就行, (key 是用 dd if=/dev/random of=crypt.key bs=256 count=1 做出來的)

openssl enc -e -bf -k crypt.key -in file -out file.crypt

那我有一堆檔案呢? 總不能全手動吧? 有人結合 tar 的指令, 可是這樣不就產生一個超大的檔案?我只要每個檔案加密就好, 可是要怎麼結合 openssl 指令呢? 因為有兩個地方要有東西, 一個 in, 一個 out, 谷歌好久都沒看到有人這麼做, 不過看到類似的指令就吧它拼起來, 結果像這樣

#!/bin/bash

TAR=/home
find $TAR -type f > cryptfile
find $TAR -type d > dir



for DIR in $(cat dir)
do
mkdir /tmp/$DIR
done


for FILE in $(cat cryptfile)
do
echo $FILE
openssl enc -e -bf -k crypt.key -in $FILE -out /tmp/$FILE.cypt
done

先把要備份的檔案存成一個文字檔 cryptfile, 再來產生個文字檔放目錄, 再來用兩 for 迴圈, 在 /tmp 建一樣的目錄來放加密過的檔案, 就大功告成了. 但是...但是...遇到有空白的目錄或檔名就完蛋了, 因為 for 迴圈是用空白來換行的, 這該如何是好? 該不會要搬出 sed, awk 吧? 谷歌了好久, 終於看到一線曙光, 有人也有相同的問題, 原來用 whlie 就行了, 結果像這樣


#!/bin/sh
TAR=/home
find $TAR -type f > cryptfile
find $TAR -type d > dir


cat dir | while read DIR
do
#echo $DIR
mkdir -p "/tmp/$DIR"
done


cat cryptfile | while read FILE
do
echo $FILE
openssl enc -e -bf -k crypt.key -in "$FILE" -out "/tmp/$FILE.cypt"
done


大功告成, 真是太神奇了, 可是為什麼呢?

2010年9月14日 星期二

Acer T230H 觸控螢幕

Ubuntu 10.04 可以支援觸控螢幕嗎? 有人說可以, 但只限於某些硬體, 那 Acer 出的 T230H 呢? 有人說可以, 那來試試看吧

Linux kernel 版本(uname -a) :
2.6.32-24-generic-pae #42-Ubuntu SMP


Xorg 版本(Xorg -version) :
X.Org X Server 1.7.6
Release Date: 2010-03-17
X Protocol Version 11, Revision 0
Build Operating System: Linux 2.6.24-27-server i686 Ubuntu


裝置名稱 (lsusb) :
Bus 005 Device 002: ID 0408:3000 Quanta Computer, Inc.

裝置明細 (lshal) :
udi = '/org/freedesktop/Hal/devices/usb_device_408_3000_noserial_if0_hiddev'
  hiddev.application_pages = {'Unknown page 0xd0004'} (string list)
  hiddev.device = '/dev/usb/hiddev0'  (string)
  hiddev.product = 'Acer T230H'  (string)
  info.capabilities = {'hiddev'} (string list)
  info.category = 'hiddev'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_408_3000_noserial_if0'  (string)
  info.product = 'Acer T230H'  (string)
  info.subsystem = 'usb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_408_3000_noserial_if0_hiddev'  (string)
  linux.device_file = '/dev/usb/hiddev0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'usb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/usb/hiddev0'  (string)

這裡我們可以看到 '/dev/usb/hiddev0' 與 'Acer T230H' 這兩個會用到的資訊, 照別人說的建立一個檔案 /etc/udev/rules.d/99-touchscreen.rules

SUBSYSTEM=="usb", ATTRS{idVendor}=="0408", ATTRS{idProduct}=="3000", SYMLINK+="usb/quanta_touch"
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{idVendor}=="0408", ATTRS{idProduct}=="3000", SYMLINK+="input/quanta_touch"

看到 0408 與 3000 跟先前看到的裝置名稱 (lsusb)是一樣的, 看來有機會成功? 這一步會在 /dev/usb 目錄產生一個 link : quanta_touch -> hiddev0 (但不知是否必要, 改天再來試)

最重要的驅動 hidtouch


記得把 hid-device-dump 也抓回來, 都裝起來
dump 一下裝置

hidDeviceDump /dev/usb/quanta_touch 13

這裡 13 是很重要的, 看下圖


每次的觸控都是 13 個東西吐出來, XY座標在第5(10030),6(10031)個欄位, 這裡(X, Y)就是 (1433, 552), 但Acer 的 T230H 是支援兩點的, 因此可以同時吐兩個座標出來

再來就是新增 /etc/X11/xorg.conf 這個檔案了


Section "InputDevice"
 Identifier   "Acer T230H"
 Driver       "hidtouch"
 Option       "SendCoreEvents"     "true"
 Option       "ReportingMode"     "Raw"
 Option       "Device"             "/dev/usb/quanta_touch"
 Option       "PacketCount"       "13"
 Option       "OpcodePressure"     "852034"
 Option       "OpcodeX"           "65584"
 Option       "OpcodeY"           "65585"
 Option       "CalibrationModel"   "1"
 Option       "CornerTopLeftX"     "0"
 Option       "CornerTopLeftY"     "0"
 Option       "CornerTopRightX"   "1920" # 1920 for 23"
 Option       "CornerTopRightY"   "0"
 Option       "CornerBottomLeftX" "0"
 Option       "CornerBottomLeftY" "1080"  # 1080 for 23"
 Option       "CornerBottomRightX" "1920" # 1920 for 23"
 Option       "CornerBottomRightY" "1080"  # 1080 for 23"
 Option       "CornerScreenWidth" "1920" # 1920 for 23"
 Option       "CornerScreenHeight" "1080"  # 1080 for 23"
EndSection


Section "ServerLayout"
     Identifier "Touchscreen"
     InputDevice "Acer T230H" "SendCoreEvents"
EndSection

看到了嗎 "PacketCount"是"13"而
"OpcodeX"            "65584"
"OpcodeY"            "65585"
分別就是XY座標(10030)(10031)的兩個欄位 (別問我怎麼換算的, 我也不會)

看來相當有希望吧? 可是我重開機, 不會動, 就是不會動啊...
是哪裡錯了嗎? 檢查好幾遍都沒錯啊, 只好開始K文件了
看到

2. What's new
=============

This release fix the compilation problem, for the time being.

There was 2 notable new features in v10.05.18 :

- supporting screen rotation (only in 'four corner' calibration mode) whatever
the screen orientation (left, right, inverted, and normal), touching the screen
will place the cursor at the correct location.

- compatible with some multitouch device (THIS DOES NOT MEANS THAT THIS DRIVER
WILL SEND MULTITOUCH EVENT !) : when a device sends for each supported pointer
the same group of report, it is possible to take into account only the first
group.
Add the following to your xorg.conf, in the hidtouch section (in this sample
we suppose that the subgroup has 6 report) :

---8<------8<------8<------8<---
     Option "PacketManagement_HasSubgroup"     "1"
     Option "PacketManagement_SubgroupPacketCount"  "6"
     Option "PacketManagement_Strategy"             "0"
---8<------8<------8<------8<---



難不成要加這三行?加就加 (/etc/X11/xorg.conf), 結果真的會動了, 好感動...雖然只有單點
雖然會動是會動, 但常常冒出第二點, 看來要試試能不能支援兩點了.

2010年9月6日 星期一

Avast 5 無法更新病毒碼

Avast 5 有一段時間都沒辦法更新病毒碼,











就算手動更新也是一樣, 會卡住, 卡很大, 卡不用錢, 免費沒好貨?




今天想來處理一下, 谷歌了一下, 有人說是防火牆擋住了, 但防火牆關了還是一樣, 有人說是伺服器忙碌, 但也好好...好幾天了, 有人說反安裝再重新安裝, 這個嘛...留到最後才試. 有人說是中毒, 不不...不會吧? 而且還是超強的 Conficker 病毒? 因為此病毒會封鎖已知的防毒網站, 這這...這麼厲害, 嚇嚇...嚇死我了.  害我還很緊張的拔網路線, 抓解毒程式

結果全錯, 都不是, 解決方法還真爛...



"自動偵測"???不會吧!!!但這是真的, 原來我也不相信, 但改回"直接連線"還真的又不能更新, 嚇到了吧!

2010年8月24日 星期二

selinux 應用實例 xguest

看到一個 selinux 的應用實例 xguest, 也就是一個 guest 帳號, 而且是沒有密碼的, 根據文件的說明, 這個帳號只能瀏覽網路, 且所有的變更 (包含設定與新增檔案) 在登出後都會還原, 這應該是只有 selinux 才辦的到吧?

在 Fedora 13 上可以安裝 xguest, (在 Debian 5 就沒有這東西)

yum install xguest

裝好後就會出現 kiosk, 但實際的名稱是 xguest?






















點進去後, 隨便新增一個檔案, 登出再登入還真的不見了.

但是這到底是怎麼弄的?而且看到的東西不一樣?












































到底東西是藏哪呢? 難不成是類似 chroot 的效果?

2010年7月29日 星期四

Synology DS409+ 之 cron

Synology DS409+  的 cron 設定檔在  /etc/crontab, 可是我編輯好後怎麼時間到了也不會動作呢? 連 log 都沒有, 那我怎麼知道是哪裡出問題呢? 連想要重起 cron, 在  /etc/init.d/ 空空如也, 甚麼也沒有, 這也改的太徹底了吧? 還好有學過 signal, 那來試試 SIGHUP 好了, 先查 PID, ps | grep cron

2430 root   760 S   /usr/sbin/crond

再來 SIGHUP

kill -1 2430

結果, 終於會動了. 可是我記得 cron 不用重新啟動也可以吧?

2010年7月26日 星期一

中文編碼

中文編碼還真是混亂, 不過使用 UTF-8 應該是趨勢吧? 可是明明在頭 (head) 已經標明

meta http-equiv="Content-Type" content="text/html; charset=UTF-8"

可是用瀏覽器還是要手動選 UTF-8 才行, IE 自動選也不行, 用 Chrome 也是一樣, 難不成 apache 也要作甚麼設定嗎?

果然要加 AddDefaultCharset UTF-8, 就正常了, 原來 server 端也要配合.

但還是有另外的問題, 明明輸入的時候顯示是正常的,


可是儲存再開啟卻是不正常的,


putty 我也有改 UTF-8 啊,


難不成是 vi 判斷錯誤嗎? 果然如此, 要得知 vi 的編碼方式可以在文件開啟後輸入 :set fileencodings


也可在設定檔 vimrc 加上 set fileencodings=utf-8,


但文件都要重打, 還好要改的不多, 不然就頭大了, 或者有不用重打的解決方法?

2010年7月14日 星期三

Debian 5 之 se_apt-get

se_apt-get? 這是甚麼? man 一下 se_apt-get 說甚麼 psuedo terminal, physical terminal 的, 都看沒有, which 一下, 路徑是 /usr/sbin/se_apt-get, file 一下, 是 se_dpkg 的 symbolic link, which 一下, 路徑是 /usr/sbin/se_dpkg, file 一下, 是 shell script, vi 一下



意思是執行 se_apt-get 就是執行 /usr/sbin/run_init apt-get, 這有甚麼差? man 一下 run_init 只說 run an init script in the proper SELinux context, 這未免也講的太簡單了吧, 看得懂才有鬼. 另一個類似的指令, se_aptitude 也是一樣. 原來如果直接下指令, 例如 aptitude, 那 ps aZ 看到的 context 會跟下指令的使用者, 有一樣的 context, 但這應該不太對, 因此透過 /usr/sbin/run_init 就會有正確的 context


好像有點了解 man 裡面所講的 psuedo terminal 的用意了.

之前執行 se_apt-get 都會出現 execvp: Permission denied 也不知原因為何, 谷歌也找不出所以然, 但拼湊的結果似乎解決了, 但還是充滿著疑惑. 先來裝一下 auditd, 把 selinux 的訊息吐到 /var/log/audit/audit.log, 再來問一下為何 audit2why -i /var/log/audit/audit.log, 出來的結果或許有用, 再來製作"允許", 先看一下"允許"了甚麼 audit2allow -l -i /var/log/audit/audit.log -o local.if, 產生 local.if

#============= unconfined_t ==============
allow unconfined_t initrc_t:process transition;

接著 audit2allow -M local -i /var/log/audit/audit.log, 產生 policy 檔案, local.pp, 最後載入 semodule -i local.pp, 就成了, 但這有甚麼意義, 被 selinux 擋, 然後 allow? 這樣會有什麼保護的作用?

2010年7月8日 星期四

cwrsync - Rsync for Windows

想找 windows 裡類似 rsync 的好用工具, 谷歌一下, 還真的有, 很高興的按下 Download Now, 抓下來安裝好後, 疑? 怎麼沒有 cwrsync server 呢? 喔! 原來是要抓另一個 cwRsyncServer



裝好後, 有 cwRsyncServer 了, 但怎麼沒有 "Start a Unix BASH Shell" 呢? 不要鬧了, 谷歌出來的結果, 我看大家都有啊? 怎麼我抓的就沒有? 感覺少了很多東西? 難不成又抓錯?


不相信, 直接去安裝的路徑找 C:\Program Files\ICW\Bin, 還真的有 rsync, 也有 bash; 直接 bash 還真的有反應, 但都找不到指令? 原來還要設定路徑 C:\Program Files\ICW\Bin
這樣打指令就有反應了, 趕緊來試試 rsync, 但硬碟在哪呢? 原來硬碟都在 /cygdrive 底下. 先來複製一個檔案 rsync.exe --progress /cygdrive/d/test.txt /cygdrive/e/, 還真的會動, 感動呢!











2010年7月4日 星期日

Debian 5 安裝 selinux

阿哩, Debian 5 預設沒有安裝 selinux? 那來裝一下吧. 啟動亂裝大法, apt-cache search selinux, 看看有沒有可以裝的, 恩, selinux-utils, 這個看來有像, 裝! 還是沒有? 恩, selinux-policy-default 這個看來有像, 再裝! 這次裝了一堆東西, getenforce 顯示 Disabled, 還是沒有 selinux? 可是已經有 /etc/selinux/config 了, 難道要改成 SELINUX=enforcing? 好吧只好讓專業的來, 有請谷歌大神! 喔, 原來還要裝 selinux-basics (奇怪剛剛怎沒看到?). 裝好後還要啟用 selinux-activate

Activating SE Linux
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.26-2-686
Updating /boot/grub/menu.lst ... done

SE Linux is activated. You may need to reboot now.

對 grub 動手腳? 我瞧瞧, 原來是加了個東西, selinux=1

kernel /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro selinux=1 quiet

還要請出呂布(reboot)...
重新啟動後, 指令 getenforce, 有了! 顯示 Enforcing.
疑? 怎麼 SSH 連不進去? 這也保護的太好了吧!

問題又來了, 在 selinux 啟用的狀況下, SSH 要如何能連線? 再請谷歌大神! 搞了老半天原來不是 SSH 連不進去, 而是連網卡 eth0 都沒有啟動, 這果然是終極的保護啊! 可奇怪了, 這是甚麼道理? selinux 我真搞不懂你啊! 把 selinux 關掉, 重開機 eth0 是會啟動的. 可是為什麼 /etc/init.d/networking 卻不能把 eth0 給啟動呢, 看了一下 script, 應該是用 ifup -a 來啟動的, 可是執行 ifup -a 一點反應也沒有? man 一下 ifup, man 說 -a 這個參數是 "If given to ifup, affect all interfaces marked auto", 要有 auto 才會啟動? 奇怪了? 原先沒加開機時也會啟動啊? 沒關係我加, 在 /etc/network/interfaces 加上 auto eth0

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet dhcp


執行 ifup -a 還真的有反應, /etc/init.d/networking start 也會動, 那重開機呢? 見鬼了, 在 selinux
enforcing 的狀況下, eth0 也會啟動了! 真是活見鬼. 那為什麼原先不加 auto? 加了 auto 甚麼事都沒有了.

不過好像還是怪怪的, ls -Zd /var/www/

system_u:object_r:var_t:s0 /var/www/

這不太對吧? 果然還需要動些手腳, 原來針對在 selinux 安裝後才裝的服務 (daemon), 還要這一步, 例如 apache

semodule -i /usr/share/selinux/default/apache.pp

然後對相關目錄 restorecon

restorecon -R -v /etc /usr/sbin /var/run /var/log /var/www

結果 ls -Zd /var/www/

system_u:object_r:httpd_sys_content_t:s0 /var/www/

這樣才對吧? 但這也太麻煩了吧? 我怎知是否有遺漏? 看到 /usr/share/selinux/default/ 還有一堆服務可套用, 但我怎知那些目錄要 restorecon? 而且如果我裝了奇怪或少見的軟體呢? 又或者我自己寫的程式呢? selinux 要如何才能提供適當的保護作用呢?

先試試 selinux 幾個相關的指令, ls -Z, 有; id -Z 有; ps -Z, 有; netstat -Z, 疑? 沒有? 不會吧? 難道是版本太舊? 但我要如何能看 netstat 的版本? 先試試 apt-cache search netstat, 恩, 可能是藏在 net-tools 裡面, 看一下版本, apt-cache show net-tools, 是 1.60-22, 谷歌一下, 沒錯 netstat 是屬於 net-tools, 但 1.60-22 已經是 stable 最新的版本了, 難道要試 unstable? 試就試! 抓下來裝好後, 版本是 1.60-23, 那 netstat -Z 呢? 挖哩! 還是沒有? 看來 debian 對 selinux 的支援還沒完全? 這麼顯而易見的問題都沒改進? 對 debian 有些失望了.

那我自己重新編譯 netsata 看看能不能把 selinux 給編進去. 好, 開始了, 以下是花了三天兩夜才搞出來的. 一開始問題就來了, 要如何取得 netstat 的原始碼呢? apt-get source net-tools 就行, 那要怎麼取得 patch 呢? Debian 自己家的都找不到, 只好把別家的拿來用, 抓了 net-tools-1.60-81.el5.src.rpm, 那 debian 可以直接裝 rpm 檔嗎? ㄟ, 還真的可以, apt-get install rpm, 我裝 rpm -ivh net-tools-1.60-81.el5.src.rpm, 可是 source 裝在哪兒呢? 我找, 原來藏在這 /usr/src/rpm/SOURCES, 看目錄裡面有啥, 發現早在 2006-01-17 就有 selinux 的 patch 了! 檔案名 net-tools-1.60-selinux.patch, 那我要如何 patch 呢? 把 net-tools-1.60-selinux.patch 放在 net-tools-1.60 目錄的前面, 指令

patch -p 0 < net-tools-1.60-selinux.patch

直接 make

netstat.o: In function `prg_cache_load':
netstat.c:(.text+0x26c2): undefined reference to `getpidcon'
netstat.c:(.text+0x2734): undefined reference to `freecon'
netstat.o: In function `main':
netstat.c:(.text+0x3229): undefined reference to `is_selinux_enabled'
collect2: ld returned 1 exit status
make: *** [netstat] Error 1

有 error, 我就知道沒那麼容易, 看來還缺東西, 但 getpidcon 是甚麼鬼? man getpidcon 也沒有東西, 但是有 getpidcon 這個指令, 原來 netstat 就是用 getpidcon 取得 context 的. 搞了好久是缺這東西 libselinux1-dev, 我裝, apt-get install libselinux1-dev, 裝好後, selinux 的頭 (header) 終於出來了, 藏在這 /usr/include/selinux/selinux.h, 這下可以 make 了吧? 結果還是出現一樣的錯誤訊息, 又搞了好久, 原來是 Makefile 沒有 patch 到, 缺了這幾行

ifeq ($(HAVE_SELINUX),1)
LDFLAGS += -lselinux
CFLAGS += -DHAVE_SELINUX
else
endif

難怪 link 不到, 這下可以 make 了吧? 終於成功了! netstat -Z 有東西了. 這中間有在 config.h 設定一行 #define HAVE_SELINUX 1, config.h 可執行 make config 先產生出來.

那如果直接把別家的 netstat 拿來用呢? 神奇了, 把 CenOS 5.5 的 netstat 拿到 Debian 5 還真的可以執行, netstat -Z 也有東西.

2010年7月1日 星期四

Synology DS409+ 硬碟更換記

收到一封 Synology DS409+ 寄來的一封信 "XXX的本機硬碟4已毀損,請置換新硬碟。" 不會吧, 才用一年多就有一顆硬碟掛掉? 趕緊連線至 web 管理介面, 果然有一顆硬碟顯示未連接, 那不就有可能是電源或是傳輸線的問題嗎? 還是不相信硬碟有這麼容易故障, 那顆可是死雞的 500 G 硬碟也, 之前雞瘟的時候還特別留意有沒有中獎, 型號是 ST3500418AS, 還好沒有, 可是還是讓我心跳了一下! 千萬不要給我連續爆啊, 雖然有三顆 RAID 5 加一顆 hot spare, 可也經不起連續的轟炸啊!

好吧, 問題來了, 要怎麼換硬碟? 直接換上就好了嗎? 不要太衝動, 還是先谷歌一下好了? 發現原來 DS409+ 是用 mdadm 做出來的 RAID. SSH 連線, 先 df -h

Filesystem Size Used Available Use% Mounted on
/dev/md0 2.3G 421.1M 1.9G 18% /
/tmp 252.0M 14.5M 237.6M 6% /tmp
/dev/md2 911.0G 400.0G 510.9G 44% /volume1
/volume1/@optware 911.0G 400.0G 510.9G 44% /opt

再來 mdadm --detail /dev/md0

/dev/md0:
Version : 00.90
Creation Time : Fri Jan 30 10:16:38 2004
Raid Level : raid1
Array Size : 2489920 (2.37 GiB 2.55 GB)
Used Dev Size : 2489920 (2.37 GiB 2.55 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Thu Jul 1 17:54:43 2010
State : active, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0

UUID : ab1840d1:08eb1608:578f8f46:aeede710
Events : 0.3123

Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 2 active sync /dev/hdc1
3 0 0 3 removed

4 8 49 - faulty spare /dev/sdd1

果然第4顆有問題, 再來 cat /proc/mdstat

Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md2 : active raid5 sda3[0] sdb3[1] sdc3[2] sdd3[3](S)
970486400 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid1 sda2[0] sdb2[1] sdc2[2] sdd2[4](F)
522048 blocks [4/3] [UUU_]

md0 : active raid1 sda1[0] sdb1[1] sdc1[2] sdd1[4](F)
2489920 blocks [4/3] [UUU_]

unused devices:

這就看不太懂了. 沒關係, 那就換一顆吧? 正疑惑間, 可是這顆真的壞了嗎? 拔下來接到其他台電腦, 疑? BIOS 抓的到啊, 進作業系統, ㄟ? 分割區也抓的到啊, 看起來這顆沒問題啊?? 那把原來這顆接回去? 還是直接換新的? 不管了先把這顆接回去, 電源按下去, 恩, 開機有點久, 4顆硬碟燈怎麼還沒亮? 緊張緊張刺激刺激, 不要全掛啊! 呼, 硬碟燈終於亮了, 結果第4顆還是亮橘燈. 先看看東西還在不在, 好險都還在. 看一下 message

kernel: end_request: I/O error, dev sdd, sector 14143
kernel: raid1: Disk failure on sdd1, disabling device.
kernel: ^IOperation continuing on 3 devices
kernel: end_request: I/O error, dev sdd, sector 16703
kernel: end_request: I/O error, dev sdd, sector 16959
kernel: end_request: I/O error, dev sdd, sector 17215
kernel: end_request: I/O error, dev sdd, sector 17343
kernel: end_request: I/O error, dev sdd, sector 17471
kernel: end_request: I/O error, dev sdd, sector 17727
kernel: end_request: I/O error, dev sdd, sector 17983
kernel: end_request: I/O error, dev sdd, sector 18239
kernel: end_request: I/O error, dev sdd, sector 18367
kernel: end_request: I/O error, dev sdd, sector 19647

看來是硬碟有壞軌, 好吧, 換一顆. 換好後, 電源按下去, 恩, 開機有點久, 4顆硬碟燈怎麼還沒亮? 緊張緊張刺激刺激, 呼, 硬碟燈終於亮了, 第4顆也終於亮黃燈了, 可是 RAID 會自動重建嗎? 進系統看 mdadm --detail /dev/md0

/dev/md0:
Version : 00.90
Creation Time : Fri Jan 30 10:16:38 2004
Raid Level : raid1
Array Size : 2489920 (2.37 GiB 2.55 GB)
Used Dev Size : 2489920 (2.37 GiB 2.55 GB)
Raid Devices : 4
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Thu Jul 1 18:56:28 2010
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

UUID : ab1840d1:08eb1608:578f8f46:aeede710
Events : 0.3868

Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 2 active sync /dev/hdc1
3 0 0 3 removed

看來沒有自動重建? 連線到 web 管理介面, 看來要手動重建 RAID


轉換按下去, 只能選第四個

選擇硬碟

重建中......

看一下指令 cat /proc/mdstat

Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md2 : active raid5 sdd3[3](S) sda3[0] sdb3[1] sdc3[2]
970486400 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid1 sdd2[4] sda2[0] sdb2[1] sdc2[2]
522048 blocks [4/3] [UUU_]
resync=DELAYED

md0 : active raid1 sdd1[4] sda1[0] sdb1[1] sdc1[2]
2489920 blocks [4/3] [UUU_]
[=======>.............] recovery = 38.1% (949440/2489920) finish=0.2min speed=86312K/sec

unused devices:

有 recovery 也, 真感動. 重建好後 cat /proc/mdstat

Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md2 : active raid5 sdd3[3](S) sda3[0] sdb3[1] sdc3[2]
970486400 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid1 sdd2[3] sda2[0] sdb2[1] sdc2[2]
522048 blocks [4/4] [UUUU]

md0 : active raid1 sdd1[3] sda1[0] sdb1[1] sdc1[2]
2489920 blocks [4/4] [UUUU]

unused devices:

原來那些 UUU 代表的是使用中的硬碟啊. 不過終於搞定了, 呼.

2010年6月23日 星期三

網芳開啟不能

偶爾會有網路芳鄰不能開啟的問題, 明明昨天可以, 今天就不行, 明明剛剛可以, 現在就不行, 重開機後也不行, 總是跳出要輸入密碼的視窗, 明明輸入是對的卻連不進去, 實在是有夠奇怪的


谷歌了一下也沒找到答案, 我還找到了微軟出的 tool, 可以顯示 kerberos tickets, 也沒甚麼幫助


結果竟然是對時的問題, 也就是與 windows domain controller 的時差不能夠超過 5 分鐘; 奇怪了windows domain 的環境不是都自動對時的嗎? 怪我勒?

對了一下時間還真的連進去了, 真是見鬼了; 還說甚麼"不明的使用者名稱或錯誤密碼", x軟的錯誤訊息盡然也是錯的, 搞屁啊! 那如果日期不一樣呢? 又見鬼了, 還是連的進去. 那如果"時"不一樣, 但是"分"一樣呢? 又見鬼了, 還是連的進去. 顯然它的判斷標準是以"分"為主, 奇怪了那樣的標準又有何意義? 真的會被x軟搞死, 今天看到太多鬼了, 該去收驚了.

2010年6月22日 星期二

openwebmail 安裝記

openwebmail 的安裝還真是簡單, perl 裝好後, 執行 /var/www/cgi-bin/openwebmail/openwebmail-tool.pl --init 就成了, 但我麼看到奇怪的錯誤訊息


阿哩, 是怎樣, 谷歌了老半天有人說是 perl 版本不對, 趕緊看一下版本, perl --version, 是 5.10.0, 難道是版本太新?

再來看一下 apache 2 的 log, /var/log/apache2/error.log, 會有這樣的錯誤訊息

YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!
FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!
Premature end of script headers: openwebmail.pl

天啊, 這甚麼? 這跟 kernel 有甚麼關係? 有人說要重編 perl, 不會吧, 哪要這麼麻煩, 我以前有裝過 openwebmail, 不用啊. 再仔細檢視一下安裝過程, 都沒問題啊? 但其中有一個變更檔案權限的的步驟 chmod 4555 /usr/bin/suidperl , 為什麼會有個 4, 好奇看了一下, 這個檔案是連結到 /usr/bin/perl, 結果弄了老半天居然是這個步驟出問題, 趕緊改回來, chmod 555 /usr/bin/suidperl, 中獎了, openwebmail 的登入畫面就這麼的出來了, 真是感動, 可我是照著官網的步驟做的, 是怎樣, 有 4 沒 4 差這麼多.

OS : Debian 5.0
openwebmail : 2.53
perl : 5.10.0



郵件儲存格式

假若是個人郵件的備份那或許有很多種方式, 例如用 outlook 匯出就行, 但是我們也知道匯出後的檔案是微軟發明的 pst, 重點是它很容易壞掉, 連修復 pst 檔案的工具都有出, 不只如此, 連 outlook 本身也會掛, 救都救不回來; 這也沒甚麼, 程式都會掛, 但你掛掉我的郵件也要留著啊, 那難道沒有通用的郵件儲存格式嗎?

依稀記得在 linux, 當郵件收下來後是存成一個文字檔, 那這個文字檔是否就是一個通用的郵件儲存格式呢? 而且存成一個文字檔用文字編輯器就可以看了, 就算檔案壞掉一部分應該還是可以看到沒壞的部分吧?

谷歌了一下, 原來這個文字檔的檔案格式叫 mbox, 是一個公開的郵件儲存格式, 像 Thunderbird 就是把郵件存成 mbox 的檔案格式, 當然例如微軟的記事本也可以讀; 忽然想到, 那附件是怎麼存的?

試了一下在 Windows XP 安裝 Thunderbird 3, 把郵件抓回來之後, 果然是存成一個文字檔, 檔名為 Inbox, 而且連附件也可以存進去, 重點是郵件的內文用記事本就讀的到了; 當然附件是看不懂的, 除非你用眼睛就解的出來.

想要更進一步把這個 Inbox 餵給 openwebmail 來讀, 看看是否正常, 先複製貼上一封信, 用 vi 存檔 , ㄟ, 還真的可以讀; 那把 Inbox 用 ftp 傳上去應該也可以吧, 但結果有些奇怪, 怎麼還是只看到第一封信, 可是信件的大小卻是整個 Inbox 的大小, 這是哪裡出問題了? 難道只能讀到第一封信嗎? 但是這封信也打不開; 用眼睛看, 比對兩邊的檔案一樣啊, 那就不是 ftp 上傳的問題吧? 難道是我的眼睛有問題? 還是有隱藏關卡?

在困惑時, 忽然腦袋閃過, 有學過 DOS 與 linux 的文字檔案格式是不太一樣的, 好像是下一行的不同, 而且可以用工具來轉換, 在我殘存的記憶裡努力回想, 好像是叫做 dos 什麼的?

apt-cache search 一下果然有個轉換的工具叫 tofrodos, 趕緊裝起來試試, 奇怪怎麼沒 tofrodos 這個指令, 搞了半天原來裝好後就是要用 dos2unix, 原來我的記憶沒問題, 那為什麼要用 tofrodos 來混擾我?

啊哈, 果然有隱藏關卡, 不是我眼睛有問題, 用 dos2unix 轉換過後, 一切都正常了, openwebmail 都讀得到, 附件也沒問題, 打完收工.

2010年6月17日 星期四

linux 文字檔搜尋

好吧, 我知道怎麼搜尋某一個文字檔中的特定文字, 用 grep 就行, 我也知道怎麼從一堆檔案中搜尋某個檔案名, 用 find 加 grep 就行, 但是我怎麼從一堆檔案裡搜尋檔案內容中某個關鍵字呢? 像在 Windows 那樣的方便呢?

OS : Debian 5.0 (/var/log/installer/lsb-release)

好吧, 我知道可以先用 find 找出目錄下所有的檔案, 再用 file 這個指令判斷檔案類型, 再加上 grep 過濾出 text, 這樣我就找出所有的文字檔了

find / -type f -exec file {} \; | grep "text"

但是會出現一些錯誤訊息, 就把它丟到"空"裏面吧

find / -type f -exec file {} \; 2> /dev/null | grep "text"

然後我記得好像可以每一行取出第一個字串, 也就是我所需要的檔案名稱, 查了查用 awk 就可以了

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}'

此時, 我有了根目錄下所有文字檔的完整路徑與名稱, 但指令也夠長了, 而且故事還沒完啊, 我要怎麼把這些檔案"吐"給 grep 做搜尋呢? 直接"管線"好像不行, 但依稀記得有個 xargs 可以用, 於是指令又更長了

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}' | xargs grep 'keyword'

大功告成, 終於可以搜尋所有文字檔中某個關鍵字了, 但又有一些錯誤訊息, 再把它丟到"空"裏面

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}' | xargs grep 'keyword' 2> /dev/null

再來 awk 一次, 取出搜尋過後的檔案名稱

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}' | xargs grep 'keyword' 2> /dev/null | awk -F":" '{print $1}'

但是會有重複的檔案出現, 我只要出現一次就好了, 該怎麼辦才好, 忽然一眼瞥見有個 uniq 指令

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}' | xargs grep 'keyword' 2> /dev/null | awk -F":" '{print $1}' | uniq

耶, 終於得到我想要的結果了, 真是太高興了, 但這一串指令也未免太長了吧, 誰記得住啊, 應該有更好的方式吧...