2010年12月28日 星期二

硬碟容量超過 2T 的切割方法

目前現在的 storage 幾乎都超過了 2T 以上
如果按照傳統的方法用 "fdisk" 指令來切割該磁區的話
一定會發生讀取不到正確容量的問題

所以這時只能用別的管理磁區的軟體來解決

在 google 大神的幫助下,查詢到了 Linux 有一套 "parted" 的軟體

以下是 CentOS 的作法

1. 安裝軟體

#yum install parted

2. 選擇要分割的磁區

#parted /dev/sda

3. 進入管理模式後,在 (parted) 的命令提示字元的右邊輸入指令

GNU Parted 1.7.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) mklabel gpt
(parted) mkpart
Partition name? []? primay
File system type? [ext2]? ext3
Start? 0
End? -1
(parted) print

Disk /dev/sda: 3996GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number Start End Size File system Name Flags
1 17.4kB 3996GB 3996GB primay

(parted) quit

完成磁碟分割

這時用 fdisk 檢查磁碟分割的狀況

#fdisk -l

就會發現 sda1 有 4T 的空間可以使用

4. format sda1 磁區

如果我們割完磁區之後,直接執行

#mkfs.ext3 /dev/sda1 <== 如果磁區有達到12T會出現以下問題

mke2fs: Filesystem too large. No more than 2**31-1 blocks

這是因為 mkfs.ext3 預設使用的區塊是 4k 但是我有查了一下用 4k 來 format 最大還是可以支援到 16T,不知為啥還是會出現問題 如出現以上問題可以執行以下指令解決 #
mkfs.ext3 -b 8192 /dev/sda1

以 8k 來 format 磁區,最大可支援到 32T

以上步驟完成即可使用。

2010年12月20日 星期一

遠端將所有的 SERVER 關機

因為我們機房的環境蠻惡劣的
空調有時都會停掉,使得我不得不將所有的主機關機等待空調回復
如果一台一台關的話會太慢,所以得要開發一個 script 程式,只要執行這隻程式就會依照IP設定遠端關機。

第1步驟:
設定無需密碼即可登入遠端之帳號

在被控端 Server 建立帳號並設定密碼
#useradd poweroff
#passwd poweroff

備註:控制端 Server 最好之能用 "root" 身份才能使用遠端關機的 script,以下教學皆以 root 身份執行

在控制端 Server 上登入"root" 建立金鑰

#ssh-keygen -t rsa
以下訊息直接按 "Enter" 即可

完成後在 root 家目錄下的 ".ssh" 隱藏目錄中會有 "id_rsa" "id_rsa.pub" 這兩個檔案

#ls ~/.ssh/
id_rsa id_rsa.pub

將 id_rsa.pub 複製到被控端的 "poweroff" 使用者中的家目錄裡的 ".ssh" 隱藏目錄中,並改名成 "authoriezd_keys" 即可

#scp /root/.ssh/id_rsa.pub poweroff@192.168.1.100:/home/poweroff/.ssh/authorized_keys

備註:帳號新建立時在家目錄中並無 ".ssh" 這目錄,需使用者自行建立
(poweroff)$mkdir ~/.ssh

完成複製後請用 ssh 遠端登入確定不需密碼即可登入被控端

第2步驟:
將 poweroff 使用者加入 sudo 並不需使用密碼即可執行 root 指令,但需限制可使用之指令

編輯 sudoer 檔案,並加入以下文字
#visudo
...
...
..
poweroff ALL=(root) NOPASSWD:/sbin/shutdown, /bin/sync
..
..

說明:poweroff 使用 sudo 指令時,身份為 root 並不需要輸入密碼,但只能執行 shutdown 和 sync 指令

以上兩步驟完成後即可使用 ssh 指令下達被控端關機

如:
#ssh poweroff@192.168.1.100 'sudo /bin/sync;sudo /bin/sync;sudo /bin/sync;sudo /sbin/shutdown -h now'

第3步驟:
將遠端關機指令寫成 script 檔案

如果直接在 shell script 的檔案中直接打入"ssh poweroff@192.168.1.100 指令"時
它並不會像直接用 root 身份在終端機執行時可以不用密碼
在執行這隻 script 時它還是會詢問帳號密碼

以下分為兩部份

第1部份:

我們要需要安裝 expect 這套軟體來執行 "expext shell" 才能達到執行 script 時不詢問密碼
#vi remote.sh

#!/usr/bin/expect -f
set username "poweroff"
set password "1qaz&UJM"
set ipaddr "192.168.1.226"
set timeout -1
spawn ssh $username@$ipaddr /usr/bin/sudo /bin/sync;
/usr/bin/sudo /bin/sync;/usr/bin/sudo /bin/sync;/usr/bin/sudo /sbin/shutdown -h now
match_max 100000
expect eof

說明:
1. username:遠端帳號。
2. password:遠端密碼。
3. ipaddr:遠端IP位址。
4. timeout:設定命令超時時間。
5. spawn:所要執行的程式。
6. match_max:設定所收到的資料量大小。

第2部份:

另外再寫一個 script 檔案將所要關機的 Server IP 寫入檔案中
#vi shudownAll.sh
#!/bin/bash
network=192.168.1.
serverip=(100 20 15)
account=poweroff
for((i=0;i<${#serverip[@]};i++)) do ip=$network${serverip[$i]} ping -c 1 -w 1 $ip &> /dev/null && result=0 || result=1
if [ "$result" == 0 ];then
echo $ip" is UP."
search=`cat remote.sh | grep '192' | sed 's/^.*\ "//g' | sed 's/\".*$//g'`
cat remote.sh | grep '192' | sed 's/^.*\ "//g' | sed 's/\".*$//g' |sed -i 's/'$search'/'$ip'/g' remote.sh
/root/remote.sh
else
echo $network${serverip[$i]}" is DOWN."
fi
done

完成後將兩隻程式的的權限改為 "root" 身份才能執行

#chmod 700 shutdownAll.sh remote.sh

執行 shutdownAll.sh
#./shutdownAll.sh

備註:
完成以上步驟後執行程式會出現以下訊息
sudo: sorry, you must have a tty to run sudo
這時需編輯 sudoer 檔,將 Defaults requiretty 註解起來

#vi /etc/sudoers
..
..
..
#Defaults requiretty <== 在前面加 "#" 註解起來
..
..
就不會發生錯誤訊息了!!


說明:
執行 shutdownAll.sh 後會依照 "serverip" 中所設定的 ip 用 sed 指令將 "remote.sh" 中的 "ipaddr",更換成 "serverip" 。

之後只要在 shutdownAll.sh 裡,在 "serverip" 加入新的 ip 即可將遠端 server 關機