2011年9月21日 星期三

[Bash Script]將筆電中的資料備份到備份主機 (V201109210305)

前一版邏輯有嚴重錯誤而且寫得太囉唆了,全部重寫~~~~~~~
ChangeLog
1. if 條件判斷改用設檢查旗標的方式同時用了『複合條件判斷』以濃縮長度。
2.『全變數化』以方便維護跟新增備份標的。

筆電中放著不少重要資料,還是備份一下比較安心。

條件一樣是,
1.筆電在家且連得到備份主機才進行備份
2.自動砍掉三天以前的備份

Script 內容如下,

#!/bin/bash
#DailyBackUpV201109210305.sh
#備份筆電中的重要資料
#Verio:3.0
#Time:201109210305
#Max Lin max@mpsstudio.org

#定義變數
LogFile="$HOME/BackUpLog/DailyBackUp.log"
RemoteHost="10.128.0.100"
TEMPDir="/tmp/DocBack"
LXDETEMPDir=""$TEMPDir"/LXDE"
ScriptTEMPDir=""$TEMPDir"/Script"
DocTEMPDir=""$TEMPDir"/Doc"
MyPassWord="1979576"
MyAccount="亞利安人"
MountHomeDir='/home/max/sharedir'
LocalMountDir=""$MountHomeDir"/100DocBackup"
RemoteHostMountOption="rw,noperm,nosuid,username="$MyAccount",password="$MyPassWord",iocharset=utf8,codepage=cp950"
LXDEBackDir="/home/max/.config/lxpanel/LXDE/"
ScriptBackDir="/home/max/Script"
DocMountPoint="/media/DATABack"
DocBackDir=""$DocMountPoint"/002.文件/"

#Start

#確認遠端備份主機連線狀態
ping -c 2 $RemoteHost > /dev/null
ConnectCheck=$?

#確認備份儲存目錄是否已掛載
mount | grep "100DocBackup" > /dev/null
RemoteHostMountCheck=$?
if [ $RemoteHostMountCheck -ne '0' ] ; then

#掛載遠端文件備份掛載目錄
echo "$MyPassWord" | sudo -S mount -t cifs //"$RemoteHost"/DocBackup "$LocalMountDir" -o "$RemoteHostMountOption"
RemoteHostMountCheck=$?
else
RemoteHostMountCheck=0
fi


if [ $ConnectCheck -eq '0' -a $RemoteHostMountCheck -eq '0' ]; then

echo "`date '+%Y%m%d'` ---- 備份作業開始 --------" >> $LogFile
echo "`date '+%Y%m%d'` ==== 備份開始時間`date '+%H:%M:%S'`" >> $LogFile

#備份LXDE設定檔
mkdir -p "$LXDETEMPDir"
tar jcvf "$LXDETEMPDir"/LXDEConfigBackUp`date '+%Y%m%d'`.tar.bz2 "$LXDEBackDir"
LXDETar=$?
cp -r "$LXDETEMPDir"/* "$LocalMountDir"
LXDECpCheck=$?

if [ $LXDETar -eq '0' -a $LXDECpCheck -eq '0' ] ; then
echo "`date '+%Y%m%d'` LXDE設定檔備份作業完成~~~" >> $LogFile
else
echo "`date '+%Y%m%d'` LXDE設定檔備份作業未完成!!!!" >> $LogFile
fi


#備份Script
mkdir -p "$ScriptTEMPDir"
tar jcvf "$ScriptTEMPDir"/ScriptBackUp`date '+%Y%m%d'`.tar.bz2 "$ScriptBackDir"
ScriptTar=$?
cp -r "$ScriptTEMPDir"/* "$LocalMountDir"
ScriptCpCheck=$?
if [ $ScriptTar -eq '0' -a $ScriptCpCheck -eq '0' ] ; then
echo "`date '+%Y%m%d'` Script備份作業完成~~~" >> $LogFile
else
echo "`date '+%Y%m%d'` ScriptCpCheck備份作業未完成!!!!" >> $LogFile
fi

#文件備份
mkdir -p "$DocTEMPDir"
mount | grep "$DocMountPoint"
DocMountPointCheck=$?
if [ $DocMountPointCheck -eq '0' ] ; then
tar jcvf "$DocTEMPDir"/DocBackUp`date '+%Y%m%d'`.tar.bz2 "$DocBackDir"
DocTar=$?
cp -r "$DocTEMPDir"/* "$LocalMountDir"
DocCpCheck=$?
else
echo "$MyPassWord" | sudo -S mount -t ext4 /dev/sda4 "$DocMountPoint"
ReMountCheck=$?
if [ $ReMountCheck -eq '0' ] ; then
tar jcvf "$DocTEMPDir"/DocBackUp`date '+%Y%m%d'`.tar.bz2 "$DocBackDir"
DocTar=$?
cp -r "$DocTEMPDir"/* "$LocalMountDir"
DocCpCheck=$?
DocMountPointCheck=0
else
DocMountPointCheck=1
fi

fi
if [ $DocMountPointCheck -eq '0' -a $DocTar -eq '0' -a $DocCpCheck -eq '0' ]; then

echo "`date '+%Y%m%d'` Doc備份作業完成~~~" >> $LogFile
else
echo "`date '+%Y%m%d'` Doc備份作業未完成!!!!" >> $LogFile
fi

#刪除暫存目錄
rm -rf $TEMPDir
#刪除遠端備份目錄中三天前的備份檔
find ""$LocalMountDir"/" -type f -mtime +3 -exec rm -f {} \;
#確認文件備份目錄是否還掛載著
mount="$DocMountPoint"
DocMountPointCheck=$?
if [ $DocMountPointCheck -eq '0' ] ; then
#卸載遠端備份目錄
echo "$MyPassWord" | sudo -S umount "$DocMountPoint"
fi
#確認備份儲存目錄是否仍掛載
mount | grep "$LocalMountDir" > /dev/null
RemoteHostMountCheck=$?
if [ $RemoteHostMountCheck -eq '0' ] ; then
#卸載遠端備份目錄
echo "$MyPassWord" | sudo -S umount "$LocalMountDir"
fi
echo "`date '+%Y%m%d'` ==== 備份結束時間`date '+%H:%M:%S'`" >> $LogFile
echo "`date '+%Y%m%d'` >>>> 備份作業完成 <<<<<<<<" >> $LogFile
else

echo "`date '+%Y%m%d'` 遠端備份目錄離線中或無法掛載遠端儲存設備,備份作業未開始!!!!"

fi                         

2011年9月19日 星期一

[Bash Script]如果Routing Table 出現兩筆 Default Gateway 怎麼辦?

    因為家裡的動物機群跟一般主機分屬於兩個不同網段同時分別透過兩台IP分享器連網,我在家時為了方便筆電會用有線連『動物機群網段』,同時用無線網卡連到『一般主機網段』。

    可是每次開機時因為同時有兩張網卡(有線+無線)所以就會得到兩個 『DefaultGateway』,有兩個『DefaultGateway』基本上就跟沒有『DefaultGateway』是一樣的,會無法連線,所以老是要手動刪掉『動物機群網段』的『DefaultGateway』,有點煩了所以寫隻簡單的Script讓他自動處理這個問題。

    想法很簡單~~~~

    1. 先檢查看看對接到『動物機群網段』的有線網卡『eth0』是不是『DefaultGateway』,如果是就刪掉。

    2. 接著再檢查對接到『一般主機網段』的無線網卡是不是『DefaultGateway』,如果是,那就....... 沒事~~~,如果不是就加上這個『DefaultGateway』。

    Scritp 如下,

#!/bin/bash 
#
# DefaultGatewayCheck.sh
# 自動設定我要的 Default Gateway
# Version:2.0
# 201109190237
# Max Lin max@mpsstudio.org
# 
 
#!/bin/bash
#
Checketh0=`route -n | grep "UG"| grep "eth0"`
Checkwlan0=`route -n | grep "UG"| grep "wlan0"`

if [ "$Checketh0" ] ; then

    echo '28825252' | sudo -S route del default gw 10.128.0.1                        
fi

if [ ! "$Checkwlan0" ] ; then

    echo '28825252' | sudo -S route add default gw 10.0.0.1

fi




































    測試:

1.檢視現有 Routing Table

max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0 
 
    沒有『動物機群網段』的『DefaultGateway』
 
2.加上『動物機群網段』的『DefaultGateway』到 Routing Table
 
max@minako:~$ sudo route add default gw 10.128.0.1 
 
3.確認一下
 
max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
0.0.0.0         10.128.0.1      0.0.0.0         UG    0      0        0 eth0
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0 
 
  
  『動物機群網段』的『DefaultGateway』在 Routing Table 中 
 
4.執行 Script
 
max@minako:~$ ./CheckGw.sh 
 
5.看一下Routing Table
 
max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0
 
 『動物機群網段』的『Default Gateway』沒了
 
6.刪掉『一般主機網段』的『Default Gateway』
max@minako:~$ sudo route del default gw 10.0.0.1
 
max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
 
一筆『Default Gateway』都沒有
 
7.再跑一下Script 
 
max@minako:~$ ./CheckGw.sh 
max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0
 
 
嗯.....有效
 

2011年9月18日 星期日

[Misc]關於 LVM(Logical Volume Manager)的基本概念(無LAB)

      簡單整理一下Linux LVM的一些基本概念。

     首先先複習一下使用一顆實體硬碟的流程~~~

    當妳要加裝一顆硬碟時妳會怎麼做?打開電話簿翻到『好人&馱獸』那一區??

     那妳後面應該都看不懂~~~~~

    使用一顆實體硬碟的流程是....

     1. 首先要有一顆硬碟。
     2. 接著將這顆硬碟裝到電腦上。
     3. 開Power。
     4. 劃分分割區。
     5. 格式化。
     6. 掛載。

     除開不關電源直接裝硬碟、連接線接錯或裝反、硬碟電源線沒裝或是買到籤王等意外,妳現在可以開始用硬碟了。

     我的學生應該都要記得吧?!?!第一堂課的東西.....

     雖然說的跟講義不大相同,不過意思是一樣的。

      接著進入主題.............

1.『Partition』 是建置『Linux LVM』的基本成員,要參加『 LVM』 的『Parition』首先要變身為『PV(Physical Volume)』。

    怎麼變身呢?

    用『 fdisk』 跟他說「你是LVM」......就好了嗎?還早..........

    喔.....前面的意思是所有要參加『LVM』的『Partitiom』都要一一使用『fdisk』指定其『Partition Type』為『8e』。

    接著再用『pvcreate』跟那些『 Partition』 說「你是PV」....這樣就變身完畢了。

2.當所有參加『LVM』的成員都知道自己是『PV』後再使用『vgcreate』將他們群組成一個『VG(Volume Group)』。

    這個時候基本上妳就可以把一個『VG』當成一顆大硬碟。

    其實到這邊還蠻像是在生一個『Raid 0』的感覺,『Raid 0』是將一堆大小不同的實體硬碟合體成一個邏輯大硬碟的技術,所不同的是『Raid 0』只要有一個成員脫團,整個 『Raid 0』就GG 了,『LVM』的話,一個『PV』也就是『Partition』壞掉,換掉就好了。

  到這邊是建置『Linux LVM』的前置作業。

3. 當『VG』合體完畢後你就有了一顆大硬碟,回到一開始提到的實體硬碟使用流程....

     1. 首先要有一顆硬碟。
     2. 接著將這顆硬碟裝到電腦上。
     3. 開Power。
     4. 劃分分割區。
     5. 格式化。
     6. 掛載。

    當然,前三點就不需了,接下來就直接到『 4.劃分分割區』 這個動作。

    接著就是使用『lvcreate』來''劃分''出 『LV(Logical Volume)』了。

    從『VG』中切割出『LV』來用,這一步就像是在切『Partition』一樣。

    現在妳可以將切出來的『LV』掛載到掛載點開始使用他了。

    所以整個『LVM』的建置流程就是,『PV』→『VG』→『LV』。

    LAB的部份....看哪天有空再說。

2011年9月16日 星期五

[JAVA]Install JDK 6.0 & JRE 6.0 on Ubuntu 11.04

雖然Ubuntu 11.04 已經有了『OpenJDK 6.0』,不過還是想換成『SUN』的『JDK』。

1. 打開『synaptic』,點選[設定] => [套件庫],點選「其他軟體」頁籤

將『Canonical 夥伴』及『Canonical 夥伴 (源碼)』勾選起來。
(※  『Canonical 夥伴 (源碼)』可以不用勾,我是順便)


    [關閉]之後記得『重新載入』一下

 
2.在『快速過濾』填入「sun-java-6」,然後選取『sun-java6-jre』、『sun-java6-jdk』、『sun-java6-plugin』
(※ 其他需不需要裝看個人嗜好) 


3.可是系統中還有一個『Openjdk』怎麼辦?

    使用切換程式切換過來,

     切換前:

$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 







切換後:

$ sudo update-java-alternatives -s java-6-sun 
[sudo] password for max: 
max@minako:~$ java -version 
java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)









4.設定環境變數

     修改『/etc/environment』

    修改前:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"



修改後:

JAVA_HOME="/usr/lib/jvm/java-6-sun"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-6-sun/bin"
CLASSPATH=".:/usr/lib/jvm/java-6-sun/lib:/usr/lib/jvm/java-6-sun/lib/dt.jar:/usr/lib/jvm/java-6-sun/lib/tools.jar"



 

    重登入以後測試一下環境變數,


$ echo $CLASSPATH
.:/usr/lib/jvm/java-6-sun/lib:/usr/lib/jvm/java-6-sun/lib/dt.jar:/usr/lib/jvm/java-6-sun/lib/tools.jar
max@minako:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-6-sun/bin
max@minako:~$ echo $JAVA_HOME
/usr/lib/jvm/java-6-sun


 
     完工~~~~

[XOOPS]換掉整個 Banner

    預設的Banner我不是很喜歡所以想換掉......

    先打開所使用的版型的『theme.html』,找到下面這一段程式碼,

<!-- customized header contents -->
    <{$xoops_module_header}>
</head>
<body id="<{$xoops_dirname}>" class="<{$xoops_langcode}>">

<!-- Start Header -->
<table cellspacing="0">
    <tr id="header">
        <td id="headerlogo"><a href="<{xoAppUrl /}>" title="<{$xoops_sitename}>"><img src="<{xoImgUrl xoops-logo.png}>" alt="<{$xoops_sitename}>" /></a></td>
        <td id="headerbanner"><{$xoops_banner}></td>
    </tr>
    <tr>
        <td id="headerbar" colspan="2">&nbsp;</td>
    </tr>
</table>
<!-- End header -->















接著就妳高興怎麼改就怎麼改啦~~~

當然前提是要看得懂 html 跟那些 XOOPS 變數的意義......

[XOOPS]特定使用者登入後才出現的物件

    如果希望某個連結是在特定帳號登入後才出現,可以透過下列程式碼來達成這個效果,

<{if $xoops_uname == '特定帳號' }>
  <a href="<{xoAppUrl 想要出現的連結}>" style="text-decoration:none"
     target="_self"><font color="#3367FF">[ 連結顯示名稱 ]</font></a>
<{/if}>








特定帳號登入前:


特定帳號登入後:

[XOOPS] 使用者登入後才顯示歡迎詞

如果要在使用者登入後才顯示歡迎詞可以在 Theme 的『theme.html』中加上下列程式碼在要出現歡迎詞的地方。

 <{if $xoops_uname }>
          歡迎詞 !!!
<{/if}>
                                       








登入前:


登入後:
Powered By Blogger