Saturday, September 10, 2016

Commands for backup


今日好快講下Linux上用以back up的幾個command:

tar
最常用的command,可以將整個folder back up成一個tar file。好處是可以加壓縮option以減少空間

cpio
只會把standard input顯示的東西打包,通常要配合其他command 如find使用


dump/restore
之前介紹過的command,從file system level backup。亦可以加壓縮。
不過最近發現Redhat不建議用dump來backup online filesystem,會有backup data corruption風險。值得一提的是剛才提及的兩者都可以用來backup online filesystem

Reference:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Introduction_To_System_Administration/s3-disaster-backups-tech-dump.html

Thursday, August 4, 2016

Regular Expression

今日講Regular Expression,簡稱Regex。
通常在Linux裡頭最常用Regex的commands是grep,sed。可能很多讀者亦非常熟悉。
Regex包括12個 metacharacters,它們個自有特殊意義:












.     代表所有characters/numbers, except line breaks
      例如:/1.7/g 可以match 187,1%7,1a7

{ } 代表 quantifier
      例如:/b{4}/g 可以match bbbb
      如果後面加上逗號,則是至無限的意思,如b{2,}會match兩個b到無限個b

 其實代表 {0,},0次到無限次,甚至empty string
      例如:

 代表 1次到無限次
      例如:/b+/g 可以match b, bb, bbbbbbb, etc

[]   代表range
      例如:/[a-zA-Z0-9] /g 可以match 所有字母及數字
      這裡順便介紹 ^(negate)的用法,/^[a-f]/g 指match a至f以外的所有characters,當然包括g到z,以及符號如%

\w  等於 [a-zA-Z0-9_]
\d   等於[0-9]
\s   等於任何white space(spaces, tabs, line breaks)

$    代表句子的結尾 end of string

最後介紹look behind
look behind就是有condition的情況下match pattern
e.g. 
a(?=b) 代表當a之後的字母是b才match a
            例如:
            
       
a(?!b)  代表a之後不是b就match a
           例如:



最後有興趣多體驗Regex妙用的讀者可以去下面的網站玩下
http://regexr.com




Monday, July 18, 2016

SAN I/O error(2)

正如上回所述,SAN問題所引起的影響隨時超過5分鐘,在秒秒鐘幾廿萬上落的金融世界當然不可以接受。有見及此,在SLES11 SP3 / RHEL6.5+及kernel 2.6.32-431或之後增加左SCSI timeout parameters tuning feature,可以在/etc/udev/rules.d檔案下增加下列rules:

timeout -更改進入recovery mode的timeout value。default是60,可以改成30
SUBSYSTEM=="scsi" , ATTR{type}=="0|7|14", ATTR{timeout}="30"
eh_timeout - 更改unresponsive device的timeout value。default是10,可以改成5
SUBSYSTEM=="scsi" , ATTR{type}=="0|7|14", ATTR{timeout}="5"
eh_deadline - 更改整個error recovery process timeout value。default是0,建議改成90
SUBSYSTEM=="scsi_host" , ATTR{modelname}=="42C2069", ATTR{eh_deadline}="90"
Finetuning 完畢後recovery flow如下:



優化後最大的recovery time是120s,比之前的500s縮短了很多!就算在最壞情況,因為每個device的timeout value是5s,假如系統有10 LUN device,也只是120 + 5*10 = 220s,完全符合Oracle RAC eviction的300s限制!


Sunday, July 10, 2016

SAN I/O error(1)

SAN 既問題係筆者遇過最麻煩的問題之一。當SAN fabric有事的時候可以隨時影響數十或上百台server。

SAN error handling機制:
-假設@time=0, SAN path出現問題
-當SCSI request 30秒內沒有回應,就會進入recovery mode
-首先會abort I/O,再send TUR checker檢查path是否正常
-這裡要注意的是每一個LUN device都會發出TUR checker,所以TUR checker都timeout才會進入下一階段
-如果TUR checker沒有回應,就進入下一步device reset,之後再發出TUR checker檢查path
-接著會reset target/bus/host,中間每次都有TUR checker檢查reset後的情況
-reset完host之後系統會重新搜尋remote port, 如果有事的path還是unavailable, 系統會直接把它block了,所以traffic轉移到其他available的path。
-最壞情況是remote port該死未死,還可以login。最後系統還會發出一次TUR checker,timeout之後就逐一把LUN device mark failed。
-我們來計一計數,TUR checker的timeout value是10秒。
    假設一台server有10 LUN device,所需時間就是100秒。
                                     (reset時間不算在內) 30s + 4*10*10s =430s
     正常情況下系統需要430秒把traffic轉移到正常path
     最壞情況需要  430s +  10*10s (最後一次TUR checker)= 530s 才能把有事的path isolate。
-所以SAN問題可大可小,在筆者的公司,超過5分鐘的outage足以引發financial impact。累公司輸錢!
-Oracle有自我保護機制,過了200s timeout自動reboot出事系統,是比較醒的software。

機制流情圖:


Sunday, June 5, 2016

Leap second issue



相信不少行家都經歷過Leap Second這個hot topic。今天想分享少少心得,不知道大家知不知道Redhat 出了一個KB專門解釋Leap Second原理以及一些已知的bug(無錯,真有好多bug),幾乎每個version都有。

https://access.redhat.com/articles/15145

有見及此,Redhat出左個懶人包,all-in-one script 幫你做埋checking, 超方便!
筆者上載的是version 9.3,有興趣的朋友可以試下。注意Redhat會經常update version,如果想要最新的最好去官網下載。

leap_vulnerability.sh

最後補充多句,筆者親身經歷過不下5次Leap second事件,發現每次Leap second insertion之後都有很多server會out sync with NTP source。 Study過一輪發現最好至少有三個NTP source先會避免到問題,有四個就最理想啦!

Sunday, May 8, 2016

RHEL 6 fails to load the NIC firmware driver at boot time

這是筆者早前遇到奇怪問題。一台RHEL 6 sever重啟完之後無緣無故少了其中一個NIC。

這是error log:

bnx2: Broadcom NetXtreme II Gigabit Ethernet Driver bnx2 v2.1.11 (July 20, 2011)
bnx2 0000:04:00.0: PCI INT A -> GSI 28 (level, low) -> IRQ 28
bnx2 0000:04:00.0: firmware: requesting bnx2/bnx2-mips-09-6.2.1a.fw
bnx2: Can't load firmware file "bnx2/bnx2-mips-09-6.2.1a.fw"

google了一下發現原來是memory fragmentation問題。原因是OS load scsi module的時候需要把所有lun寫入memory,如果lun太多,剩下的contiguous space已經不足以initialize所有NIC driver




解決辦法:
-備份/etc/dracut.conf
-在/etc/dracut.conf加入 add_driver +="bnx2"
-備份initramfs:
     cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.$(date +%m-%d-%H%M%S).bak
-然後打command: dracut -f
-reboot server,然後檢查是不是所有NIC driver都成功載入

reference:
https://access.redhat.com/solutions/69540





Monday, May 2, 2016

怎樣搬server  — data center migration(3)
上兩篇講的都是懶人包,今日入戲肉,network cloning

筆者今次介紹的是用dump and restore的方法clone機。
1. 在新server插入兩個或以上硬盤(HDD),然後設定RAID1
2. boot機,import ISO。筆者推薦CentOS,它比JetOS更適用不同的hardware model
3. 根據已有的network info設定network,因為以後還要改config,就算server會有多於一個IP address的話,暫時起一個就夠。
4. start ssh daemon,disable iptable(如有)
5. 在舊server擷取partition table,然後scp到新server
     sfdisk -d /dev/sda > part_table
6. 在新server按照partition table進行格式化
   sfdisk /dev/sda < part_table
7. 從舊server scp /etc/fstab 到新server
8. 建立臨時mount point /sysroot
8. 按照fstab在新server建立file systems,然後mount在/sysroot下面
9. 用dump restore command逐一把file system clone到新server:
   E.G
   mkfs -t ext3 /dev/sda1
   mount /dev/sda1 /sysroot
   cd /sysroot
   ssh root@NewServer "dump -0 -f - /" | restore -rf-
    *這裡注意要先在新server enable direct root login
10. clone完所有file system之後安裝grub
   grub-install --root-directory=/sysroot --recheck /dev/sda 
11. 基本上clone的部分已經完成,接著記得改IP,netmask和gateway,
     -  更改/etc/sysconfig/network(SuSE)folder內ifcfg file的IP,netmask。RHEL的話則是/etc/sysconfig/network-scripts
     -  有bonding的話就注意network port的mapping。如eth0/3 map to bond0,eth1/2 map to bond1
     -更改routing table的gateway。RHEL更要修改/etc/sysconfig/network
12. 最後處理boot menu,/etc/fstab和chkconfig:
     -檢查boot menu內的(hd0,0), 確認kernel和initrd version都正確
     -如果是physical server,而/etc/fstab內又沒有用partition label的話,則要update harddisk的uuid
     -完成上面步驟可以reboot一次
     -reboot之後檢查chkconfig,看看需要auto start的daemon是否仍然存在
         chkconfig --list

             


                                                             怎樣搬server (完)