2012年2月9日 星期四

PHP 5.3.x 的 strtotime() 時區設定 警告訊息修正

Debian Linux 使用 testing 的話, 若於上星期有做過 dist-upgrade 的話, 就會發現 PHP 已經被升級到 5.3.1-5, 而且出現一堆警告訊息.
我遇到的有下面這三種錯誤訊息:
  1. PHP Warning:  strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /tmp/a.php
  2. PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/imagick.so' /usr/lib/php5/20090626/imagick.so: cannot open shared object file: No such file or directory in Unknown on line 0
  3. PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/imagick.ini on line 1 in Unknown on line 0

strtotime() 修正

  • PHP Warning:  strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /tmp/a.php
strtotime() 出現的這個警告是要我們先指定正確的時區(Timezone), 再來使用這個 function.
解法下述幾種 (挑其一即可, 建議用 1 或 3 的方法)
  1. 於 PHP 檔案內使用 date_default_timezone_set()
    ex:
    date_default_timezone_set('Asia/Taipei');
    echo strtotime('2010-03-01');
    ?>
  2. 設定 php.ini
    vim /etc/php5/apache2/php.ini # 於 php.ini 的 date.timezone
    ;date.timezone =
    改成
    date.timezone = "Asia/Taipei"
  3. 設定 php.ini (於 Debian 比較建議這樣做, 就不用去分別改 apache / cgi / cli 的 php.ini)
    vim /etc/php5/conf.d/date_timezone.ini # 於此檔案加下述
    date.timezone = "Asia/Taipei"

PHP Startup: Unable to load dynamic library 修正

  • PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/imagick.so' /usr/lib/php5/20090626/imagick.so: cannot open shared object file: No such file or directory in Unknown on line 0
發現下述這幾個都不見了 (php5-imagick, php5-mhash, php-apc)
  • /usr/lib/php5/20090626/apc.so
  • /usr/lib/php5/20090626/mhash.so
  • /usr/lib/php5/20090626/imagick.so
  • php5-mhash 已經包進去, 不需另外安裝, imagick、apc 目前還沒看到.
解法
  • rm /etc/php5/cli/conf.d/apc.ini /etc/php5/cli/conf.d/imagick.ini /etc/php5/cli/conf.d/mhash.ini

Comments starting with '#' are deprecated 修正

  • PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/imagick.ini on line 1 in Unknown on line 0
cat /etc/php5/cli/conf.d/imagick.ini # 第一行有個註解 "#"
解法
  • 在 PHP 5.3.x 這些 ext 的註解已經不建議使用 "#", 所以將這個註解拿掉, 或者將 "#" 改成 ";" 開頭即可. (開頭 ; 也是註解的意思)

2012年2月7日 星期二

Linux 掛載 USB 隨身碟

建立掛載點

mkdir /mnt/usb

查看目前磁碟的狀態
fdisk -l

掛載usb
mount /dev/sdc /mnt/usb

卸載usb
umount /dev/sdc

Linux掛載USB隨身碟for backup

mount 指令為將周邊裝置掛入的指令


格式:mount -t 檔案系統類型 -o 選項 裝置 掛入點

範例:mount -t iso9660 /dev/hdb /mnt/cdrom

——–若硬碟檔案系統為fat32

mount -t vfat /dev/hdb# /mnt/usb



ps. NTFS系統,Linux不支援,要另外下載driver(至少我的server是看不到的)

<準備工作>

1. mkdir /mnt/usb

2. 格式化usb隨身碟或是usb界面的硬碟

3. fdisk –l 查看目前磁碟的狀態(這樣才可以找到正確得usb編號#)

———————————–

* 掛載隨身碟



請拿出你的隨身碟並插入 Linux 主機的 USB 槽中!注意,你的這個隨身碟不能夠是 NTFS 的檔案系統喔! 接下來讓我們測試測試吧!



範例五:找出你的隨身碟裝置檔名,並掛載到 /mnt/flash 目錄中

[root@www ~]# fdisk -l

…..中間省略…..

Disk /dev/sda: 8313 MB, 8313110528 bytes

59 heads, 58 sectors/track, 4744 cylinders

Units = cylinders of 3422 * 512 = 1752064 bytes



Device Boot Start End Blocks Id System

/dev/sda1 1 4745 8118260 b W95 FAT32

# 從上的特殊字體,可得知磁碟的大小以及裝置檔名,知道是 /dev/sda1



[root@www ~]# mkdir /mnt/flash

[root@www ~]# mount -t vfat -o iocharset=cp950 /dev/sda1 /mnt/flash

[root@www ~]# df

Filesystem 1K-blocks Used Available Use% Mounted on

…..中間省略…..

/dev/sda1 8102416 4986228 3116188 62% /mnt/flash

如果帶有中文檔名的資料,那麼可以在掛載時指定一下掛載檔案系統所使用的語系資料。 在 man mount 找到 vfat 檔案格式當中可以使用 iocharset 來指定語系,而中文語系是 cp950 , 所以也就有了上述的掛載指令項目囉。



萬一你使用的是隨身硬碟,也就是利用筆記型電腦所做出來的USB磁碟時,通常這樣的硬碟都使用 NTFS 格式的~ 怎辦?沒關係,可以參考底下這個網站:(註8)



* NTFS 檔案系統官網:Linux-NTFS Project: http://www.linux-ntfs.org/

* CentOS 5.x 版的相關驅動程式下載頁面:http://www.linux-ntfs.org/doku.php?id=redhat:rhel5



將她們提供的驅動程式捉下來並且安裝之後,就能夠使用 NTFS 的檔案系統了! 只是由於檔案系統與 Linux 核心有很大的關係,因此以後如果你的 Linux 系統有升級 (update) 時, 你就得要重新下載一次相對應的驅動程式版本喔!

———————————-

檔案系統

minix Linux 最早使用的檔案系統

ext2 Linux 目前使用的檔案系統

msdos MS-DOS 的 FAT

vfat Windows 95 的 FAT32

nfs 網路檔案系統

iso9660 光碟格式

ntfs Windows NT 4.0 的檔案系統

hpfs OS/2 的檔案系統

auto 自動偵測

============================================

NTFS 與 FAT 及 FAT32 的比較

============================================

NTFS 執行 Windows 2000、Windows XP 或 Windows Server 2003 系列產品的電腦,可以存取本機 NTFS 磁碟分割上的檔案。執行 Windows NT 4.0 搭配 Service Pack 5 或更新版本的電腦可能可以存取部份檔案。其他作業系統則不允許進行本機存取。

雖然檔案無法大於檔案所在的磁碟區或磁碟分割,最大的檔案大小仍可到 16 TB 減 64 KB。



FAT32若要存取本機磁碟分割上的檔案,只能透過 Windows 95 OSR2、Windows 98、Windows Millennium Edition, Windows 2000、Windows XP,以及 Windows Server 2003 系列產品進行。

檔案大小上限為 4 GB。





http://linux.vbird.org/linux_basic/0230filesystem.php (Vbird)



http://technet.microsoft.com/zh-tw/library/cc779002%28WS.10%29.aspx



http://www.hoyo.idv.tw/software/OpenSource/command/mount.htm



http://blog.xuite.net/wizardyuy/pcblog/13024537



http://blog.blueshop.com.tw/miceyen/archive/2005/12/28/15676.aspx



掛載USB隨身碟

新增一個資料夾給隨身碟用例如 mkdir /mnt/usb, 再 mount /dev/sda1 /mnt/usb 即可
cd /mnt/usb 就可以讀usb內的資料了
註 : 可以下dmesg 看usb 使用哪一個名稱 sda1,sda2 or sda sdb

Apache配置之URL重寫

wordpress中的永久連結需要Apache支援url重寫,於是配置了一下。

1、修改apachehttpd.conf文件,將下面語句前的#去掉
#LoadModule rewrite_module modules/mod_rewrite.so
2、修改apachehttpd.conf檔,將對應的節中的AllowOverride None 改為AllowOverride All,如

Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
3、在需url重寫的目錄下建立.htaccess檔,wordpress在開啟永久連結後會只能生成,內容如下:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
效果就是如本文連結http://witmax.cn/apache-url-rewrite.html,其實並不存在這個目錄,而是通過url重寫由index.php來解析支持。

2012年2月6日 星期一

Drupal 備份與轉移



備份壓縮,相對路徑的範例:
tar -jpcv -f sites.tar.bz2 -C ~/public_html sites  (壓縮public_html/sites之下的資料)

解壓縮則是:
tar -jpxv -f sites.tar.bz2 -C ~/public_html/twtcsl  (不用放sites,會解成sites這個目錄)

MySQL:
備份
mysqldump -u 使用者 -p 資料庫> drupal.sql

還原
mysql -u 使用者 -p 資料庫 < drupal.sql

改sites/default/settings.php這個檔
$db_url = mysql://xxxx:xxxx@localhost/drupal';

clean_url 的問題。參考:http://drupal.org/node/367616

簡單說就是用回複雜的方式,要登入就是 網址?q=user  然後不管跳到哪頁都要加?q=,把clean_url先改掉,或是主機直接設定好就行。

主機設定clean_url的方式:http://drupal.org/node/15365

2012年2月2日 星期四

Linux全系統的備份與還原(系統轉移)

摘自Ubuntu的WIKI

1.以最高權限執行
sudo su -

2.切換到根目錄

cd /


3.使用tar指令

tar -cvpzf /路徑至備份檔.tgz   備份目錄 
tar -cvpzf /路徑至備份檔.tgz  --exclude=排除目錄1 --exclude=排除目錄2  --exclude= /路徑至備份檔.tgz (產生的備份檔當然要排除)  /
備份目錄
例子:
tar -cvpzf /backup.tgz   --exclude=/proc   --exclude=/lost+found  \
 --exclude=/backup.tgz   --exclude=/mnt --exclude=/sys /

分析:
tar -cvpzf /backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --exclude=/sys /
就是中間加上排除的部分而己,記得產生的備份檔一定要排除 ,否則就沒完沒了了!

tar的參數
c - 新建一個備份文檔
v - 詳細模式, tar程式將在屏幕上實時輸出所有信息。
p - 保存許可,並應用到所有文件。
z - 採用‘gzip’壓縮備份文件,以減小備份文件體積。

應排除的目錄
/proc、/lost+found、/sys、/mnt、/media
另外額外分割區的東東也可以看看要不要加入


4.到新的機器還原
tar -xvpzf /backup.tgz -C /
mkdir /proc /lost+found /mnt /sys



看到這裡突然覺得,也可以利用這種方式來拷貝系統,否則替老師桌機
一台一台的灌Linux還是很累人的。
我的想法是將(a)做好的樣版機,(b)依上述步驟1-3備份成檔案後燒到DVD上

(c)再配合LiveCD開機將要安裝的機器(d)作好硬碟分割並格式化

(e)再將備份檔解到 /分割區內並建好排除的目錄

(f)再chroot 到新的分割區

(g)執行grub-install  /dev/sda (或grub-install  /dev/hda )將磁區資訊寫到MBR

系統異常關機修復方式 FSCK(慎用)

首先先開機進入 Single Mode ,以 FreeBSD 6 為例,開機選單按 4 即可進入 Single Mode
接下來進去後先按一下 Enter ,以我的系統為例,輸入下列指令

# mount -a
# df
/dev/da0s1a   10154158      70668   9271158     1%    /
devfs                1          1         0   100%    /dev
/dev/da1s1d 2055518950 1106617646 784459788    59%    /home
/dev/da0s1e   10154158    1037240   8304586    11%    /tmp
/dev/da0s1f   80729226   30448924  43821964    41%    /usr
/dev/da0s1d   81245672     800846  73945174     1%    /var
先確認有哪些目錄後,就一個一個 umont 做 fsck 修復的動作,修復完再 mount 回來
# umount /home
# fsck -y /home
# mount /home
若一開始連 / 都 mount 不起來的話,記得要先 fsck 根目錄才行唷!

用 du 將目錄中的總容量算出來

原始文章連結:http://phorum.study-area.org/viewtopic.php?t=16977

怎麼用 du 將目錄中所有目錄的總容量算出來?
要算的是目錄中各個子目錄分別的容量,指令可以這樣下...
#du -cSh /path/*

如果不懂的話...可以 man du ...用底下的方式..更一目了然囉...
#du -h --max-depth=2 /path/*

--max-depth=N
       print the total for a directory (or file, with --all) only if it
       is   N   or  fewer  levels  below  the  command  line  argument;
       --max-depth=0 is the same as --summarize 


du -f

SSH 安全設制

大部份的 ssh daemon 設定檔都是放在 /etc/ssh/sshd_config, 於 ssh 本身來說, 它自己就是一個安裝的遠端登入機制, 在您傳送的任何一筆資料都給予加密, 讓資料傳送之間更為安全. 但是政策上的考量, 安全的規劃上, 有些原本的條件可能太過於開放, 所以在此提供一些小技巧, 來達到更符合客制化的 ssh 環境.
以下的修改檔都是在 /etc/ssh/sshd_config, 而在修改完之後請重新啟動 sshd:
[root@rhel ssh]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
[root@rhel ssh]#
修改 ssh 聆聽埠
預設 sshd 是聆聽 port 22 的連接埠, 如果要更改請使用 Port 參數, Port 語法後面接著要讓 sshd 聆聽的連接埠口, 如果要一次聆聽多個, 那麼就再使用 Port 指定其它的連接埠, 以下會讓 sshd 重新聆聽 22 和 1234 的 Port.
Port 22
Port 1234
重新啟動 sshd 之後, 再使用 netstat 看看 22 和 1234 是否有被 listen.
[root@rhel ssh]# netstat -ntulp | egrep  '(sshd)|(PID)'
Proto  Recv-Q  Send-Q  Local Address  Foreign Address  State   PID/Program name
tcp         0       0  0.0.0.0:1234   0.0.0.0:*        LISTEN  9769/sshd
tcp         0       0  0.0.0.0:22     0.0.0.0:*        LISTEN  9769/sshd
[root@rhel ssh]#
限制以 root 以 ssh 方式登入
root 是個強而有力的帳號, 管理習慣上, 應該要避免使用 root 直接登入, 這樣可以養成使用一般權限登入的習慣, 另一個好處也是可以避免被使用字典攻擊 (即使用 root 帳號為主, 不斷猜測密碼). 下面的方法會讓 root 無法使用 ssh 登入.
PermitRootLogin no
設定 ssh 所聆聽的連線 IP
預設 sshd 是聆聽所有的 IP 位置 (0.0.0.0), 也包含 127.0.0.1 的本機 loop back IP, 如果要指定 sshd 只聆聽某個特定的 IP 時, 使用 ListenAddress 就可以達成, 大部份會這麼做的原因可能是在一台 Linux Getway 的主機上限制只有某些網段的 IP 才可以使用 sshd 登入. 下面的示範會讓主機聆聽 11.22.33.44 和 192.168.1.1 的介面 (不包含 127.0.0.1)
ListenAddress 11.22.33.44
ListenAddress 192.168.1.1
重新啟動之後看看 sshd 有沒有只 listen 指定的 IP Address.
[root@siva ssh]# netstat -ntulp | egrep '(sshd)|(PID)'
Proto  Recv-Q  Send-Q  Local Address      Foreign Address  State   PID/Program name
tcp         0       0  11.22.33.44:6211   0.0.0.0:*        LISTEN  9839/sshd
tcp         0       0  192.168.1.1:6211   0.0.0.0:*        LISTEN  9839/sshd
tcp         0       0  11.22.33.44:22     0.0.0.0:*        LISTEN  9839/sshd
tcp         0       0  192.168.1.1:22     0.0.0.0:*        LISTEN  9839/sshd
[root@siva ssh]#

Tar 指令詳解

備份程式:tar Function Options tarFiles [SomeFile?] SourceFiles?
將許多檔案包裝成一個檔案,並保留檔案權限、目錄結構、完整的符號連結和實體連結等相關訊息。
而在解開檔案時,會將原本時的目錄解開在目前的目錄底下。若要只解開部份檔案時,必須要加上在備份檔中該檔案的完整路徑。
一般的做法是:先將許多檔案用 tar 打包成一個檔案,再用 gzip 壓縮成FileName?.tar.gz。
如果將 tar Files 以 - 代替,表示輸出入至標準輸出入。如:
tar cvf -SourceFiles?| gzip -9 > tarFile.tar.gz
gunzip -9ctarFile.tar.gz| tar xvf -
Function:
c : 建立新的備份檔。
x : 將備份檔解開。
t : 列出備份檔的內容。
-T Sample : 備份在 Sample 中所列出的檔案清單。
r : 將檔案附加在這個備份檔案的後面。
u : 將備份檔內的檔案以更新的檔案取代。
d : 比較備份檔中的檔案和檔案系統中的檔案。
Options:
v : 列出處理檔案時的相關訊息。越多訊息越詳細。
k : 解開檔案時不要覆蓋已存在的檔案。
f FileName? : 指定備份檔的檔案名稱。
z : 和 gunzip 搭配使用,自動產生或解開壓縮後的備份檔。
j : 和 bzip2 搭配使用,自動產生或解開壓縮後的備份檔。
複製完整子目錄到另一個目錄中:
cd SourceDirectiory?
tar cf - . | (cd TargetDirectory?; tar xvf -)
備份一個子目錄:tar cvfBackup.tar /Direcory
分片備份:tar cvfMBackup.tar /Direcory

=====================================================================


1 tar

tar (tape archive) 原本是設計用來將文件打包到磁帶中的,我們也可以將檔案或是目錄打包成一個單一的檔案,必要時再用同一個程式來將資料全部還原或是只解開部份的資料,正因為它可以備份檔案或目錄,深受大家的愛用。
常用參數:
  • 指定動作 :
    • -c create,新增一個備份檔
    • -t list,顯示備份檔中的檔案清單
    • -x extract,解開備份檔中的檔案
  • 指定檔案:
    • -f file,讀/寫指定的檔案

       
  • 壓縮方式:
    • -z gzip,備份的東西要用 gzip 壓縮/解壓縮
    • -y bzip,備份的東西要用 bzip 壓縮/解壓縮,也可以用 -j
  • 其它:
    • -p permissions,保留原來的權限
    • -v verbose,備份的內容要顯示在畫面
    • -C (大寫 C),cd 先切換目錄
由於 tar 的功能非常的多,指令可用的選項令人眼花瞭亂,下面只示範最常用的,有興趣再自己用 man tar 好好的研究囉!

1-1 以 tar 打包要備份的資料

如果沒有什麼特殊需求,利用 tar 備份檔案只要用到 -c (新增) ,-p (保留權限設定),-f (指定檔名),頂多再加個 -v 看一下打包的過程。
例如:
tar -cpvf /home/backup/etc.tar /etc
上例將 /etc 目錄中所有的檔案打包到 /home/backup/etc.tar 中。
也可以同時備份多個目錄,將要打包的清單(以空白分隔)接在最後面即可。下面的例子將 /etc , /usr/local/etc 打包在 etc.tar 中:
tar -cpvf /home/backup/etc.tar /etc /usr/local/etc
我們也可以使用:
tar -czpvf /home/backup/etc.tgz /etc
和前面的例子比較,多了個參數 z ,也就是將 tar 打包完的檔案再利用 gzip 壓縮,所以新產生有經過壓縮處理的備份檔我們也將檔名命名為 etc.tgz (.tgz 結尾),也有人用 .tar.gz ,端看個人習慣。
咦~好奇的人可能會想到 FreeBSD 的 packages 檔名好像叫 *.tgz 或 *.tbz,和 tar , gzip , bzip 有沒有關啊?有興趣可以找個 FreeBSD 的 package ,用 tar 來打開包裝看看哦!!
另外,比較一下這兩個同樣是備份 /usr/local/etc 的指令有何不同?
tar -czvf /home/backup/local.etc.1.tgz /usr/local/etc
tar -czvf /home/backup/local.etc.2.tgz -C /usr/local etc
由於 tar 預設在備份時會儲存檔案的路徑 (但是自動去掉開頭的第一個斜線) ,也就是 /usr/local/etc/rc.d 在 local.etc.1.tgz 中會變成 usr/local/etc/rc.d,如果我們連 usr/local 都不想要,打包時可以利用 -C (大寫字母) 這個參數來控制路徑的保留層次,像前面第二個例子加了 -C /usr/local ,tar 會先切換至 /usr/local 目錄才備份 etc,所以在 local.etc.2.tgz 中 /usr/local/etc/rc.d 變成 etc/rc.d 儲存起來。

1-2 查看 tar 打包的檔案

要查看以 tar 打包的檔案只要利用 -t 這個動作參數即可。
例如:
tar -tvf /home/backup/etc.tar
上例會將 /home/backup/etc.tar 中的檔案清單顯示出來。
如果備份時有用 gzip 壓縮過則可以加上 -z
tar -tzvf /home/backup/etc.tgz
如果備份時用 bzip 壓縮過則加上 -y 或是 -j
tar -tyvf /home/backup/etc.tbz

1-3 解開 tar 打包的檔案

要解開 tar 封裝的檔案是利用 -x 這個動作參數,再搭配 -z , -y (-j) 解壓縮。如果想保留原來的權限設定則要記得使用 -p,至於要不要使用 -C (大寫字母) 則要看當初在打包時有沒有使用及自己想要放置的路徑而定,最容易犯的毛病大多是解錯路徑,所以在使用 -x 解開時一定要記得先用 -t 查看一下當初是怎麼打包的,最保險的方法是先解到一個暫存的地方,再將需要的檔案複製/搬移到目的地。
將 /home/backup/etc.tgz 中的東西在目前所在的目錄解開:
tar -xzvf /home/backup/etc.tgz
將 /home/backup/etc.tgz 中的東西在 /home 中解開:
tar -xzvf /home/backup/etc.tgz -C /home
將 /home/backup/etc.tgz 中的東西在 /home 中解開,並保留原始的權限:
tar -xzpvf /home/backup/etc.tgz -C /home

1-4 只解開 tar 打包的部份檔案

只解出 /home/backup/etc.tgz 中的 etc/group , etc/master.passwd 兩個檔案:
tar -xzvf /home/backup/etc.tgz etc/group etc/master.passwd
將 /home/backup/etc.tgz 中凡是叫 etc/rc* 通通解開,其它的不要:
tar -xzvf /home/backup/etc.tgz 'etc/rc*'
將 /home/backup/etc.tgz 中的檔案解開,但是 rc.d 目錄中的東西不要:
tar -xzvf /home/backup/etc.tgz --exclude='rc.d/*'
以上提到的方法也可以應用在打包時 (-c) 及查看清單時 (-t) 。

1-5 利用 tar 直接複製整個目錄到另一個目錄中

利用 tar 和 pipe 的技巧,可以做整個目錄直接複製,不過這個方法並不保證完整哦,畢竟它的方式不若 dump + restore 完備。
假設我想把 /usr 中所有的東西複製到 /mnt/usr 中,就執行底下的指令:
tar cf - /usr | (cd /mnt ; tar xvfBp -)


2 dump 及 restore

前面提過的 tar 可以針對目錄或檔案來備份,而 dump 則是以 block 為處理單位,針對整個檔案系統(分割區)來備份,可以更完整的保持系統的原貌不會有所缺漏,以 dump 備份的資料可以用 restore 再還原回來。

2-1 以 dump 將整個 partition 備份至一個檔案

使用過 Norton ghost 的人應該知道裡面有個選項是將 MS Windows 或 Linux 系統的某個分割備份到映像檔中,下面則是利用 dump 做類似的動作,將某個分割區備份至一個檔案。
假設 /home 是一個單獨的分割區 (/dev/ad0s1h),而 /backup 是一個空間夠大的目錄,我們可以執行:
# dump -0uaf /backup/home.dump /home
上面的例子以 level 0 將 /home 所在的分割區備份至 /backup/home.dump 中。
參數說明:
  • -0 以 level 0 備份,也就是完整備份,level 可以為 0~9,level 1 則只備份 level 0 後有異動的部份。
  • -u update,備份完成後自動更新 /etc/dumpdates 的內容(記錄分割區代號、level、備份日期)。
  • -a auto-size,略過可儲存空間大小的檢查。
  • -f file,將備份的資料輸出到後面參數指定的檔案,也可以是一個硬體(device file)或是標準輸出 (-)。

2-2 以 restore 還原檔案

以 dump 備份的分割區我們可以用 restore 將檔案還原出來,就像利用 ghost 把映像檔再寫入 partition 一樣,不過 restore 也可以只解出部份檔案。不過在使用 restore 要注意的是,restore 並不會幫我們將 partition 做格式式,而且,它是將內容解在目前所在的目錄,所以要記得先做好格式化並切換到要還原的目錄。
例如想把 /home dump 完的備份 ( /backup/home.dump ) 還原到 /mnt/new (/dev/ad1s1e) 這個 partition 中,如果 /dev/ad1s1e 已經格式化好,而且已經 mount 到 /mnt/new ,就可以執行以下指令:
# cd /mnt/new
# restore -rf /backup/home.dump
完成後,/mnt/new 就可以看到原來 /home 的中的資料。
如果只想還原備份中的部份檔案怎麼辦呢?
restore 提供 -i 的參數來進行交談式的還原,我們可以利用這個方法來指定要還原的部份,例如,只想由 /home 的備份檔 home.dump 中還原 /home/gsyan , /home/students 的資料,我們可以執行:
# restore -if /backup/home.dump
出現 restore > 的提示符號後,我們就可以下指令,例如:輸入問號 (?) 即可列出可用的指令
restore > ?
Available commands are:
ls [arg] - list directory
cd arg - change directory
pwd - print current directory
add [arg] - add `arg' to list of files to be extracted
delete [arg] - delete `arg' from list of files to be extracted
extract - extract requested files
setmodes - set modes of requested directories
quit - immediately exit program
what - list dump header information
verbose - toggle verbose flag (useful with ``ls'')
help or `?' - print this list
If no `arg' is supplied, the current directory is used

 
為了達到範例的目標,我們要用 add 來新增要還原的檔案清單,用 extract 執行還原,下面是還原出 /home/gsyan 及 /home/studens 至目前分割區的步驟,黑體字的部份是自行輸入的部份:
restore > add gsyan students
restore > extract
You have not read any tapes yet.
If you are extracting just a few files, start with the last volume
and work towards the first; restore can quickly skip tapes that
have no further files to extract. Otherwise, begin with volume 1.
Specify next volume #: 1
set owner/mode for '.'? [yn] y
restore >
 
要結束只要輸入 quit 按 Enter 鍵即可跳出 restore 。

2-3 以 dump 及 restore 做 partition 對 partition 的對拷

將分割區 dump 給標準輸出,再讓 restore 由標準輸入還原在新的 partition 就能達到 partition 對 partition 對拷的目的,底下是進行對拷的流程:
    1. 切好新的 partition
    2. 以 newfs 將 partition format 好
    3. 將新的 partition mount 好
    4. 切換至新的 partition 中
    5. 以 dump & restore 進行備份及還原
※ 1-2 的步驟可以執行 /stand/sysinstall ,然後選取 Configure 利用裡面的 Fdisk 和 Label 進行分割及格式化
例如:想要將 /home (/dev/ad0s1h) 上的所有資料備份到新硬碟上的 partition (/dev/ad2s1h),執行
# newfs /dev/ad2s1h (如果已經格式化過則可省略)
# mount /dev/ad2s1h /mnt (如果已經 mount 好則可省略)
# cd /mnt
# dump -0uaf - /home | restore -rf -
# cd /
# umount /mnt
特別注意 dump 及 restore 並沒有指定檔名,而都用了一個減號 ( - ),對 dump 來說,是將 partition 的資料一個 block 一個 block 的送向標準輸出,而 restore 則是由標準輸入讀入並還原。

2-4 以 dump & restore 備份整顆硬碟

如果想將整顆硬碟的資料拷至另一顆新硬碟,以最笨的方法就是先用 /stand/sysinstall 將新硬碟切割好,再利用 dump & restore 把各 partitions 一一對拷即可,程序如下:
  1. 將新硬碟接好後,以重新開機。

     
  2. 執行 /stand/sysintall
    • 選取 Configure
    • 選取 Fdisk 切給 FreeBSD 用的 partions
    • 選取 Label 進入 Disklabel Editor
    • 注意:在設定 disklabel 時 mount point 要先照原來的架構設定
    • 在存檔前先移到各 partition 後按 M 修改 mount point 至 /mnt 下的暫存目錄,不然可能會有錯誤
    • 按 W 存檔並開始 format New H.D. (newfs)

       
  3. 離開 sysinstall

     
  4. umount -A 解除所有 mount 上來的 filesystem

     
  5. mount -a 重新掛上系統預設的 filesystem

     
  6. 開始備份各 partition

     
  7. 將新硬碟的 / (例如:/dev/da1s1a) 掛上來

    mount /dev/da1s1a /mnt
  8. 將新硬碟 /etc/fstab 中的 /dev/xxx 改成合適的

    ee /mnt/etc/fstab

2-5 dump + ssh 進行異地備份

dump 和 restore 其實有相對應的 rdump 和 rrestore 可進行遠端的備份及還原,不過 r 系統的指令的安全性較需考量,我們可以利用 ssh 來進行較安全的連線。
假設現在想把名為 mail 上掛在 /home 的這個 partition 異地備份至名為 bkserver 主機上的 /backup 目錄 ,我們可以進行以下程序來備份。
  • 準備工作
    • 在 bkserver 上準備一個備份登入用的專用帳號,假設就叫 bk 好了!!
    • 檢查 bkserver 備份專用的目錄 /backup 是否可被備份專用帳號 ( bk ) 寫入。
    • 在 mail 上因為要執行 dump 必須是 root ,所以屆時必須由 root 執行 ssh 遠端登入 bkserver,所以要為 mail 上 root 以 ssh-keygen 準備登入用的 "公開金鑰" 。
    • 將 root@mail 的公開金鑰置入 bkserver 上帳號 (bk) HOME 的 .ssh/authorized_keys 中。
  • 進行備份
準備工作中比較麻煩的部份應該遠端登入用的金鑰,製作流程如下:

2-5-1 連線測試

我們先在 mail 上以 root 的身份登入 mail,然後遠端登入 bkserver (假設在 bkserver 上已經建好 bk 這個帳號)
# ssh bk@bkserver
如果是第一次連線,應該會出現下面的問題詢問是否儲存遠端主機的識別資料,類似下面:
The authenticity of host 'bkserver.test.edu.tw (192.168.1.5)' can't be established.
DSA key fingerprint is 2b:cc:89:80:bc:77:45:83:47:ae:b6:29:51:f5:15:33.
Are you sure you want to continue connecting (yes/no)?
輸入 yes 即可,ssh 會將資料存入 ~/.ssh/know_hosts ,下次就不會有同樣的問題。
接著輸入 bk 的登入密碼,如果成功登入就完成連線測試,輸入 exit 登出,準備進行登入用金鑰的製作。

2-5-2 製作金鑰

我們希望在進行遠端備份能夠不用輸入密碼自動登入遠端主機執行備份儲存的工作,所以要先在 mail 上用 ssh-keygen 來產生 ssh 登入用的金鑰對。
先確認已經在本機 ( mail ) 上用執行 dump 指令的 root 帳號登入哦!然後由 root 執行:
ssh-keygen -d
接著應該會出現以下的對話:
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
a6:62:05:95:92:79:2a:71:2d:73:3b:7d:0e:e7:39:26 root@mail.test.edu.tw
如果希望登入時不用輸入密碼直接登入,只要通通按 Enter 回所有問題即可。
執行完會在 /root/.ssh 中產生 id_dsa 和 id_dsa.pub ,後面那個就是我們要放在 bkserver 裡 bk 帳號下的金鑰。
接著我們要把 /root/.ssh/id_dsa.pub 複製到遠端主機 (bkserver) 裡備份專用帳號 (bk) 個人目錄的.ssh/authorized_keys 中。
如果 bkserver 的 ~bk/.ssh/authorized_keys 不存在,我們直接把前面在 mail 上 root 帳號產生的 id_dsa.pub 上傳過去即可,在 mail 上以 root 執行:
scp ~/.ssh/id_dsa.pub bk@bkserver:.ssh/authorized_keys
不過要記得先幫 bk 建好 .ssh 的目錄哦!不然會發生錯誤。
如果 authorized_keys 早已存在,我們可以先將 id_dsa.pub 傳到 bkserver 上,然後再將 id_dsa.pub 中的內容貼到 ~bk/.ssh/authorized_keys 新的一行。
如果前面的步驟完成了,我們在 mail 以 root 執行 ssh bk@bkserver 應該就可以不用輸入密碼遠端登入囉!

2-5-3 遠端備份

做好前面的準備工作後,我們就可以在 mail 上將某個 partition 備份到位於遠端的 bkserver 上了。
例如:
# dump -0uaf - /home | ssh -c blowfish bk@bkserver dd of=/backup/mail.home.dump
上面的例子在 mail 上執行,將掛在 mail /home 的 partition 備份起來,並以 bk 帳號遠端登入 bkserver 儲存在 bkserver 的 /backup/mail.home.dump 裡。
如果想省一些空間則可以順便用 gzip 壓縮後再傳給 bkserver,指令改為:
# dump -0uaf - /home | gzip -2 | ssh -c blowfish bk@bkserver \
dd of=/backup/mail.home.dump

2012年2月1日 星期三

CentOS 5 MySQL 設定檔 - my.cnf 的位置

在CentOS以yum安裝MySQL後,
設定檔範例會放在:
1. CentOS 5.x: /usr/share/mysql
2. CentOS 4.x: /usr/share/doc/mysql-server-4.1.27 (最後一層目錄名稱依MySQL版本會有所不同)
會有根據主機記憶體大小不同有各個合適的範本可以使用:
my-huge.cnf
my-innodb-heavy-4G.cnf
my-large.cnf
my-medium.cnf
my-small.cnf

自動封鎖暴力入侵:Fail2ban


這陣子觀察系統紀錄,發現每天都有不同的IP一直不斷的測試FTP的帳號及密碼,為了安全起見在網路上找到這篇介紹文章。
安裝說明如下 (我用的系統是CertOS 5.x)
Fail2ban  用途在於偵測錯誤登入而對其IP進行封鎖
1. 安裝需求套件python(這裡使用redhat的YUM 線上安裝套件管理程式)
yum install python python-devel gamin-python
2.安裝fail2ban
這邊我使用 RPM 安裝
b.安裝指令
rpm -ivh fail2ban-0.8.1-1.el5.rf.noarch.rpm
我主要是針對Proftpd防護,SSH我是設定防火牆所IP的。
修改fail2ban的設定檔
# vim /etc/fail2ban/jail.conf
[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
# 不列入的 IP 範圍,如果有二組以上以空白做為間隔 192.168.250.0/24ignoreip = 127.0.0.1
# "bantime" is the number of seconds that a host is banned.
# 設定 IP 被封鎖的時間(秒),如果值為 -1,代表永遠封鎖
bantime  = 600    (這邊是預設值)
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
# 設定在多少時間內達到 maxretry 的次數就封鎖
findtime  = 600
# "maxretry" is the number of failures before a host get banned.
# 允許嘗試的次數
maxretry = 3
[ssh-iptables]
enabled  = true
filter      = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
                 mail-whois[name=SSH, dest=root]
logpath  = /var/log/secure
# 如果有個別的次數設定就設在這裡
maxretry = 5
針對Proftpd防護 (我的系統是用Proftpd ,CentOS 預設是 vsftpd)
[Proftpd-iptables]
enabled  = true
filter   = Proftpd
action   = iptables[name=PROFTPD, port=ftp, protocol=tcp]
                   sendmail-whois[name=PROFTPD, dest=root]
logpath  = /var/log/message (這邊請修改為你的Proftp的記錄檔)
maxretry = 3           (錯誤次數)
bantime  = 1800    (鎖定時間)
修改後請存檔離開
啟動服務: service  fail2ban start
查看防火牆設定,使用 iptables -L -nv   會看到以下兩條紀錄
Chain fail2ban-SSH (1 references)
target     prot opt source               destination
RETURN     0    --  anywhere             anywhere
Chain fail2ban-ProFTPD (1 references)
 pkts bytes target          prot opt in     out     source               destination
  117  5756 RETURN     all  --         *      *       0.0.0.0/0            0.0.0.0/0
最後設定開機啟動fail2ban 指令:
# chkconfig fail2ban on
                              http://blog.pmail.idv.tw/index.php?id=318&load=read
補充內容
今天上班發現流量異常,並且主機顯的很忙碌,,查詢紀錄發現郵件伺服器一直有個IP不斷的測試轉信,網路上找到解決方式,用之前就安裝fail2ban
所以就把以下功能補上!!
Using Fail2ban with Dovecot
新增郵件過濾的檔案 Create the filter file /etc/fail2ban/filter.d/dovecot-pop3imap.conf
[Definition]
failregex = (?: pop3-login|imap-login): (?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed).*rip=(?P\S*),.*
ignoreregex =
將以下規則加到 /etc/fail2ban/jail.conf 設定檔中
Add the following to /etc/fail2ban/jail.conf
[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,imap", protocol=tcp]
logpath = /var/log/maillog
maxretry = 20
findtime = 1200
bantime = 1200
記得重新啟動 fail2ban   指令為 service fail2ban restart