在本文遇到的狀況是因為無法避免的因素無法切割一個 /dev/sdb1 的硬碟分割區出來,而在一開始安裝系統的時候又把所有的空間全部給了根目錄
$ df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 916G 2.0G 868G 1% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
/dev/sda1 248M 64M 173M 27% /boot
如果要壓縮磁區在切新的磁區出來的話,又必須 umount,因為環境不允許這個狀況,絞盡腦汁只好改用 dd 來建立虛擬硬碟取代所需要的資源池磁區
**這個方法並不是很好的解決方案,因為使用 dd 所建立的虛擬硬碟會大大降低 I/O 效能,若非狀況特殊請使用實體硬碟磁區
由於 DRBD 所需要的磁區類型是 block device,所以不能單單僅使用 dd 來建立 image 掛載,還要使用 mknod 和 losetup 這兩個工具來建立
用 dd 來產生 block device
Step.1 建立一個 100GB 的虛擬硬碟
$ dd if=/dev/zero of=/drbd/drbd.img bs=1M count=102400
Step.2 使用 mknod 這個工具建立一個 block device
$ mknod /dev/drbd255 b 7 255
#確認建立完成
$ ls -l /dev/drbd255
brw-r--r-- 1 root root 7, 255 Jul 26 18:12 /dev/drbd255
建立一個 /dev/drbd255 的設備,b 是 create block (buffered) special file,而 7 , 255 則代表設備號是有意義的,可以參考 devices.txt
Step.3 再使用 losetup 將建立好的 img 掛載到 /dev/drbd255
$ losetup /dev/drbd255 /drbd/drbd.img
# 確認是否掛載成功
$ losetup -a
/dev/loop255: [0803]:46661635 (/drbd/drbd.img)
這樣就完成建立一個 block device 可以給 DRBD 使用!
但是還沒完成!這個動作在重開機的時候並不會替我們自動掛載上去,但是又不能在開機就自動掛載,因為 DRBD 在不是 Primary 的狀況下是不能掛載資源池的!
所以就修改一下 DRBD 的啟動服務參數,讓 DRBD 啟動的時候才掛載,停用服務則卸載就不會造成衝突了!
$ vim /etc/init.d/drbd
#!/bin/bash
VIRTUALDISK="/dev/drbd255"
VIRTUALIMG="/drbd/drbd.img"
.... skip
case "$1" in
start)
if [[ ! -b $VIRTUALDISK ]]; then
echo "mount block "$VIRTUALDISK" from $VIRTUALIMG"
mknod $VIRTUALDISK b 7 255
losetup $VIRTUALDISK $VIRTUALIMG
fi
.... skip
run_hook stop
[ -f /var/lock/subsys/drbd ] && rm /var/lock/subsys/drbd
log_end_msg 0
if [[ -b $VIRTUALDISK ]]; then
echo "umount $VIRTUALDISK"
losetup -d $VIRTUALDISK
rm -f $VIRTUALDISK
fi
;;
如果覺得麻煩可以直接下載改好的檔案 drbd
測試啟動服務,必須要自動掛載上 image,而停用反之。
Orignal From: 架設 HA 高可用性:MySQL DRBD + Heartbeat – 用 dd 來建立虛擬硬碟
沒有留言:
張貼留言