2012年3月22日 星期四

硬碟備份 Disk to Image

作者:Baron. Wan

    Linux 當前實用性質最高,可與 ghost 比擬的 CloneZilla。不但可將 Linux 硬碟做 Disk to Disk,也可做到 Disk to Image ; 但還是有 clonezilla 做不到的事情,比如:將原先備份的 Disk image,還原至 小容量的硬碟上!這是一種特殊的情況,但還真的被我遇到。另外,經此事件後,我也思考到:如果今天我在硬碟中的系統總容量為 1TB,但實際上當前我只使用了 20GB 的容量空間,如果經由 clonezilla 來做,那我新的主機大概需要準備 1.5TB 的硬碟容量才能還原成功,在這樣的惡性循環上,何時是個頭呀?!!因此更加的決定研究這個:可將大容量硬碟還原到小容量硬碟的作法,我成功了,但還是必須有個限制,那就是:如果今天我實際有 20GB 的使用容量,那我期碼應該要準備個 21GB 來給它,你說這不惟過吧!^_^

儲存當前磁碟切割資訊
1. # df | grep sd | awk -F' ' '{print $6}' > disk.info

儲存當前磁碟對應的使用容量
2. # df | grep sd | awk -F' ' '{print $3}' > used.info

紀錄屆時還原需要手動 create 的 folder
3. create_dir.info
    -------------------
    /proc /sys /tmp /media /mnt

接下來,即將開始備份,在備份前,我們不能在當前的 root-filesystem 下工作,建議掛載一顆硬碟或藉由遠端共享的方式。

如果今天我們有三個分割區:/boot 、/、/var,首先我們可以先備份 /boot:
mksquashfs /boot $remote-connect/boot.img

然後再備份 /var:
mksquashfs /var $remote-connect/var.img

最後再備份 /:
mksquashfs `ls --ignore=var --ignore=boot --ignore=proc --ignore=sys --ignore=tmp --ignore=mnt --ignore=media / | sed 's/^/\//'` $remote-connect/root-filesystem.img

有幾個 folder 是我們在備份時必須忽略的,否則會無法 image完成:/proc、/sys、/tmp。/mnt 以及 /media是掛載裝置需要存在的 folder,因此我們不必添加進去。/var及 /boot 因為上述已製作成單一的 image 包,因此我們也不用再添加進去。而最後由於是 / 根目錄底下,因此其他都需要在最前端加上 '/' 。

[註] 如果記得的話,記得也將 fdisk -l /dev/sda 的訊息儲存起來,這在屆時,到其他台主機做還原動作時,是非常具有參考的價值。

接下來,關於還原的部份,請參閱我的 [Linux 技術研討:如何將大容量硬碟還原到小容量硬碟中] 一文。

Linux 技術研討:如何將大容量硬碟還原到小容量硬碟中


作者:Baron. Wan
相關備份硬碟資訊請參閱 [硬碟備份 Disk to Image]

1. 檢查原先備份的 partition 內容,並依此分割。
    disk.info
    ------------
    > /
    > /boot
    > /var

    used.info
    ------------
    2799608
    44997
    10037036

    create_dir.info
    -------------------
    /proc /sys /tmp /media /mnt

    # fdisk /dev/sda
    分割 /boot, /, /var and swap, 依原備份內容, 設定 /boot 為 active boot
    切割大小只要比實際上使用再大一些即可。
    以上所述:
    /boot 100M
    / 4G
    /var 10G
    # mkfs.ext3 -U <原先的UUID值> /dev/sda1
    # mkfs.ext3 -U <原先的UUID值> /dev/sda2
    # mkfs.ext3 -U <原先的UUID值> /dev/sda3
    # mkswap -U <原先的UUID值>  /dev/sda5

重新開機

2. # mkdir -p /SC_xxxxxxxx_img/{tmp, rootfilesystem,boot,var}

    將之前經由 mksquashfs image 的存放路徑掛載上來:
    # mount -t cifs -o rw //10.100.100.1/SC_xxxxxxxx_img /SC_xxxxxxxx_img

    [註] 之前已利用 mksquashfs {/, /boot, /var} 各作成 image 檔。

    # mount /dev/sda1 /mnt/boot
    # mount /dev/sda2 /mnt/rootfilesystem
    # mount /dev/sda3 /mnt/var
    # cd /mnt/boot
    # unsquashfs /SC_xxxxxxxx_img/boot.img

    root-filesystem.img 是 (/) root-filesystem:
    # cd /mnt/rootfilesystem
    # unsquashfs /SC_xxxxxxxx_img/root-filesystem.img

    對 /mnt/boot 以及 /mnt/rootfilesystem 做以下兩行:
    # mv squashfs-root/* .
    # rm -rf squashfs-root/

    /mnt/rootfilesystem 在上述兩行執行完畢後, create 以下幾個 folder:
    boot, var, proc, sys, tmp, media, mnt

    並將目錄權限添加上:
    chmod 1777 /mnt/rootfilesystem/tmp
    chmod 555 /mnt/rootfilesystem/boot

    # umount /mnt/boot
    # mount /dev/sda1 /mnt/rootfilesystem/boot
    以上將正確的 boot folder 掛載到 root-filesystem 中的 /boot 位置
    ------------------------------------------------------------
    var.img 是 /var 的 image 檔:
    # cd /mnt/var
    # unsquashfs /SC_xxxxxxxx_img/var.img
    # mv squashfs-root/* .
    # rm -rf squashfs-root/
    # cd ..
    # umount /mnt/var
    # mount /dev/sda3 /mnt/rootfilesystem/var

『註1』經測試,可先一次掛載到 root-filesystem 後,再將 image 檔一次還原至該處。
因此 image 檔只需要一個。

『註2』 unsquashfs 後來經測試可用:
 unsquashfs -d /mnt/rootfilesystem -f /backup/root-filesystem.img

3. # blkid (會顯示各個 partition 的 UUID, 或是經由 /dev/disk/by-uuid/ 處也可查詢)
    # chroot /mnt/rootfilesystem
    然後將相對的 UUID 值填入 /etc/fstab 及 /boot/grub/menu.lst

『註3』或者在格式化時,使用 -U 直接採用對應於原先的 partition 的UUID,這樣可以節省後續又要修改/調整 一些檔案所造成的困擾。

4. 調整 /mnt/rootfilesystem/etc/fstab 內,以符合當前 partition 規劃。
** 由於事關原先系統 MBR 內的磁碟切割資訊,因此必須與原 partition 規劃一致。
** /boot/grub/stage1 即為 MBR (hd0) 資訊,stage2 是 boot sector (hd0,0)。

5. check 是否可 chroot /mnt/rootfilesystem/,若可則 chroot
6. grub-install /dev/sda
[參考 http://linux.vbird.org/linux_basic/0510osloader.php#grub_install]

『註4』可直接採用第七點的操作方式進行 mbr 及 boot sector 的安裝工程。

7. 確定 grub 是否有安裝在 mbr 上。
    cat /boot/grub/menu.lst 先 check root 位置。
    grub
           > root (hd0,0)
           > find /grub/stage1 or
           > find /vmlinuz-版本號
           若為 hd0 則:
           > setup (hd0) 同時 check 內容是否有誤! # 安裝到 MBR
       > setup (hd0,0)  # 安裝到 boot sector
     完成後 quit

     最後,先退出 chroot,然後依次 umount /mnt/rootfilesystem/{var, boot},之後再 umount /mnt/rootfilesystem,然後就可以重新開機了。

8. 重新開機後,顯示出了 grub menu 畫面,但出現 error 15: file not found. ?!
Ans: 表示你製作的 filesystem 及 partition 與原先的不同。

9. 成功進入桌面時,發現一件事:由於網卡是之前的 MAC address,因此需要重新調整。兩個方法可以確認當前主機的網卡MAC address:
     # dmesg|grep eth  or 到 /etc/rules.d/70-persistent-net.rules 查詢系統抓到的對應 MAC address。然後我們可以到 /etc/sysconfig/network-scripts/ 來作變更。


完成。

2012年3月15日 星期四

Linux 的 Terminal Server ~

Linux 的 Terminal Server ~
------------------------------------------------------------------------------------------
Baron. Wan
2012/3/15

一. RDP (Remote Desktop Protocol):
    Linux 有個簡單實用的 xRDP,它是一個中繼的遠端桌面服務。因為它採用了 Xvnc 模組( libvnc.so ),因此,我們除了需要安裝 xrdp 相關套件外,另外也需要安裝 tigervnc-server 相關的套件。註:vnc server 不需啟動,只需安裝好。因為當使用者藉由遠端登入進入 xrdp 服務之後,xrdp 經由 sasman 服務驗證使用者身份 (本機帳號權限),然後會自動叫用 vnc-server 的服務啟動。 接下來我們開始實作 Linux 的 Terminal Server ...

二. 安裝套件:
    我實作的環境是在 SL6 (Scientific Linux) ,因此套件名稱可能有些不同,或許使用 yum list | grep vnc 以及 yum list | grep xrdp 來搜尋正確的套件名稱,會是個不錯的方式。經由 yum,我主要安裝了:
xrdp-0.4.0-1.el6.rf.i686.rpm
tigervnc-server-applet-1.0.90-0.15.20110314svn4359.el6_1.1.noarch.rpm
tigervnc-server-1.0.90-0.15.20110314svn4359.el6_1.1.i686.rpm
tigervnc-1.0.90-0.15.20110314svn4359.el6_1.1.i686.rpm
tigervnc-server-module-1.0.90-0.15.20110314svn4359.el6_1.1.i686.rpm

此間不包含 depandecy (相依性)。

安裝完成後,我們只需對 xrdp 做相關的設定工作,或是不做好像也可以 ?!
我在 /etc/xrdp/ 中,針對 xrdp.ini 以及 sasman.ini ,內容包含 127.0.0.1 都變更成了當前伺服器的IP位址。另外,由於預設 xrdp 使用 kde ,而我在 /usr/lib/xrdp/startwm.sh 中,將其他的註解掉,只留下了 gnome 以及 xterm  的敘述。並將 然/usr/share/doc/xrdp-0.4.0/xrdp_control.sh 複製到 /usr/bin/ 中,之後在 /etc/rc.d/rc.local 中添加:/usr/bin/xrdp_control.sh start 的敘述,讓它一開機可以自動啟動。

此外,xrdp_control.sh 內容中需要變更 xrdp的 home directory,若你的並非在 /usr/local/xrdp,則必須變更為 /usr/lib/xrdp。(可由 rpm -ql xrdp 看列表得知)


啟動 xrdp 時,或許會遭遇到 sesman 找不到 libscp.so ,可在 /etc/ld.so.conf.d/ 新增 xrdp.conf:
/usr/lib/xrdp,然後 keyin: ldconfig 來 reload library list。


我的 rc.local 是這樣的:
...
PATH=$PATH:/usr/lib/xrdp
touch /var/lock/subsys/local
/usr/bin/xrdp_control.sh start
...



接下來,換 client 端的操作,我們可以使用 windows 的 tsclient工具,Linux 方面相關的工具很多,個人覺得 remmina 這個 Remmina Remote Desktop Client 還不錯用,有興趣可以試試!


1. 選擇協定:RDP - Window Terminal Service
2.指定 Terminal Server 的 IP 為 x.x.x.x
3. Username & Password 可以之後登入時再 keyin。

然後連線進入我們剛架好的 Linux xRDP 服務器中:
在 Module處我們選擇:sesman-Xvnc
接下來我們 keyin 使用者的 username & password。
只要你有安裝 tigervnc-server ,應該可以正常連線進入遠端桌面。


下面是架設時參考的網站:
[http://www.vixual.net/blog/archives/524]


這裡提供一處講述 Linux 可運用的 15 個Terminal Server 資訊:
[http://www.mynitor.com/2010/02/07/15-remote-desktop-solutions-for-linux/]