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 代表的是使用中的硬碟啊. 不過終於搞定了, 呼.