在 VirtualBox 內安裝 ArchLinux 的紀錄

Debian 用一陣子後,發現 Python 2.6 在 lennybackports 也沒有,一定得到 squeeze (目前的 testing) 找出來用,但如此一來就會有很多問題 (像是 testing 的 python library 使用 stable 的 C library),所以一直在覺得很煩...

另外,自己架設 APT 的熟練程度一直卡在沒有自動化工具,所以一直想要試試 Linux 上其他的 package system,但又不想要用 RPM,所以就挑上 ArchLinux 了...

不過在 VirtualBox 內裝 ArchLinux 遇到一些怪問題,總算是弄的差不多,紀錄起來讓其他人有機會少踩一些雷...

首先是抓 ISO image,最新的版本可以在 http://ftp.tku.edu.tw/Linux/ArchLinux/iso/latest/ (這是淡江大學的 mirror) 這邊抓到,我在寫這篇時是抓 archlinux-2009.08-netinstall-i686.iso,抓完之後先用工具確認檔案的 md5 與 sha1 有沒有問題,避免檔案壞掉造成安裝過程或結果異常。

由於我是用 netinstall,所以得選擇 mirror site。在選擇時,記得得選擇 FTP 而非 HTTP 的 mirror site。我前幾次試著用 HTTP 試了好幾個站台都失敗,但後來選 FTP 都成功。這個問題還不知道哪裡出錯。另外要注意的是,由於我是有拿到 Public IP,所以不確定 FTP 預設是不是 passive,如果在 NAT 後面安裝的人可能要抓 core 版而非 netinstall 版避開這個問題 (因為 HTTP 不能用),或是想辦法讓 installer 告訴抓檔程式用 passive mode。

再來是檔案系統的選擇,由於我只是要玩 ArchLinux,所以決定切 / 與 swap 就好,不另外切 /boot。在 Debian 上我可以用 ReiserFS 當作根目錄,而 GRUB 可以開機,但在 ArchLinux 上我用 ReiserFS 當作根目錄會失敗,改用 ext3 才開的起來。

對於 ArchLinux 的 package system,pacman 用起來還蠻有趣的,官方 Wiki 上對於基本操作寫得很清楚 (「pacman」這篇),另外在 /etc/pacman.conf/etc/pacman.d/ 以及 /var/lib/pacman/ 下也是可以摸索的地方,要再花時間玩...

裝玩 openssh 並且跑起來後,卻發現連不上 SSH server,翻系統紀錄才發現被 TCP wrapper 擋下來了,要在 /etc/hosts.allow 裡加上 sshd 以及開放的網段。

接下來是建制基本環境,大致上就是把 Debian 上的 bash 設定複製一份過來就可以了。

Debian 的 Backports

這幾天在 VirtualBox 內弄了一台 Debian lenny (x86) 起來玩,想要多熟悉 Debianbash 的風格...

不過 lenny (5.0.0) 從去年二月到現在也已經過了一年,雖然一直有在更新 (現在是 5.0.4),但為了穩定性,並不是所有的軟體都有更新。印象中有個計畫是專門解決這個問題的,可以讓你在 stable 使用新版,但不是整個系統都換到 testingunstable

在印象中跟 "backport" 這個關鍵字有關,翻了以後找到 Debian Backports,看起來就是我要的...

依照「instructions [Debian Backports]」操作,直接把 entry 加到 /etc/apt/sources.list 內,用 apt-get update 更新一次,這時候會出現不認得 public key,不管他直接 apt-get install debian-backports-keyring 就收工了。測過沒問題後,就在「Backports.org worldwide mirror sites」這邊找亞洲區的 mirror site,看起來只有日本有做,改過去再測一次 update,沒問題收工...

由於預設仍然會使用 lenny 內的套件,如果要裝 backport 內的東西,需要用 -t lenny-backports 讓 apt-get 或是 aptitude 知道。

另外,在「Diffs between lenny-backports and squeeze」這邊可以看到 lenny-backportssqueeze (目前的 testing) 的差距。

DRBD 進入 Linux 2.6.33 Kernel,以及 FreeBSD 的 HAST Project

Linux kernel 2.6.33 是在 DRBD 進入 Kernel Git tree 之後 (去年 12 月左右,參考「We’re in!」這篇文章) 的下一個正式的 release:「Linux 2.6.33 released, first kernel with DRBD included」。

DRBD 是一套以 block-level replication 為基礎提昇可靠度的軟體,有時候為了方便解釋,也被稱為 Network RAID1,常搭配 Heartbeat 或是其後繼的 Pacemaker 偵測節點是否還活著,並在必要時自動切換。

由於 DRBD 已經出來很久了,而且又是以 GPLv2 釋出,早期有不少文件介紹如何使用 DRBD 達到 HA,算是一種已經被摸熟的方案。

另外是 FreeBSDHAST Project 到一個階段,被 commit 到 -HEAD 了:「Please welcome HAST - Highly Avalable Storage.」,再加上 block-level replication 會需要 Filesystem 快速恢復的 SUJ (SU+J) 也在一月底放 source code 先讓自願者測試,一口氣補了 HA 領域兩塊重要的缺陷。

不過依照慣例,新東西都不太穩定... 玩玩還可以,如果是要跑 HA 的話等一兩個版本會比較好。

FreeBSD UFS2 的 SU+J

FreeBSD 上主要是靠 Soft updates 維持當 Filesystem 不正常 umount 時的資料安全,在 Linux 上比較常見的方式則是 Journaling file system,兩個方式有不同的走向。

FreeBSD 最近也有 ZFS 了。ZFS 用的技巧類似 Journaling,不過也利用類似 Soft updates 的想法避免硬碟內的資料不一致。不過穩定性與效能沒辦法跟 UFS2 相比。

最近 Jeff Roberson 又活躍起來了 (之前弄 FreeBSD 7 的 SCHED_ULE 2 以及 FreeBSD 8 的 SCHED_SMP),在接受廠商的贊助後試著改善 UFS2 的 Soft updates,把 Journaling 的技巧引進 UFS2,希望再減少 fsck 的需求:「Journaling softupdates, SU+J」以及「What's in a journal anyway?」。以目前所規劃的時程,看起來會在這兩個禮拜內看到 commit 進 HEAD (9.0-CURRENT)。沒意外的話跑一陣子後應該就會 MFC 回 8-STABLE,然後在 8.1-RELEASE 出現。

IBM 開始在美國賣內含 Ubuntu 的桌機

Slashdot 上看到 IBM 也開始在美國本土販賣內含 Ubuntu 的桌機了:「IBM's Answer To Windows 7 Is Ubuntu Linux」。

大約幾個禮拜前,IBM 與 Canonical 發表了合作計畫,預定往非洲推銷 Ubuntu,有人問 IBM 是否有計劃在美國本土販賣類似的產品,現在的回應就是答案。

除了 IBM 以外,Dell 在更早的時候就提供 Ubuntu 桌機與筆電:「Dell PCs Featuring Ubuntu」。

innobackupex

innobackupex 是 Percona 因為 XtraBackup 需要,改自 InnoDB 的 script,可以不停機備份 InnoDB 或 XtraDB。對於沒有一開始就設定 DRBD 或是類似架構的人來說,這個方法算是蠻不錯的。(當然,如果允許停機的話更簡單)

這個方法是以 InnoDB 為主體的 database 為主,MyISAM 也可以透過這個方式備份,不過這就不在我測試的範圍內了... (我測的兩個 cluster 只有系統資料庫是使用 MyISAM,其他都是 InnoDB)

這邊寫的版本是使用 XtraBackup 0.7 版 (前幾天測試的,當時 0.8 版還沒有正式放出來,就先拿 0.7 版測試),在 Debian 上先安裝 package:

# dpkg -i xtrabackup_0.7-1_amd64.deb

裝完後就可以試著使用 innobackupex 備份,並要求 innobackupex 紀錄 slave 資訊:

# innobackupex-1.5.1 --slave-info [dest_path]

在「Btw xtrabackup is not only backup..」有推薦用 --stream=tar 將備份資料輸出成 tar 格式,不過實際上會因為 ibdata1 被改變而使得 tar 認為無法備份而失敗,所以目前比較偏好的作法是直接輸出到某個目錄下 (就不會用到 tar),目錄可以是 nfs 或是 local disk。

另外,預設是透過 socket 連 MySQL,但也可以故意用 --port=3306 強制他走 TCP,或是用其他指令指定帳號及密碼,這些都可以直接執行 innobackupex 看到。

innobackupex 會試著使用 mysql 並下一些指令,但使用時並不會指定完整路徑,所以會依照 PATH 內所設定的路徑而執行。不過,因為上面的指令通常需要 root 權限,如果使用 sudo 有可能會將 PATH 重設而造成 mysql 無法執行而失敗 (像是 Percona 的版本是裝在 /usr/local/mysql-blah-blah 下,所以配合 sudo 時的用法會是:

# sudo env PATH=/usr/local/mysql/sbin:/usr/local/mysql/bin:[original_path] innobackupex-1.5.1 --slave-info [dest_path]

這樣就解決了。

備份完成後再用 --apply-log 把還在 log 的 entry 寫回 pool:

# sudo innobackupex-1.5.1 --apply-log [dest_path]

這樣一來,一份可以當作 slave server 的資料就完成了。

丟到其他機器後,用 chown 先把檔案權限改對:

# chown -R mysql:mysql [data_dir]

然後跑起 mysql 後,看裡面的 slave 資訊設定 master:

CHANGE MASTER TO master_host = 'master_host', master_user = 'master_user', master_password = 'master_password', master_log_file = 'blahblah.012345', master_log_pos = 123456;

這樣就可以讓 slave 動起來了。(記得要自己 START SLAVE;)

在 Amazon EC2 上跑 XFS

如果想在 Amazon EC2 上跑 XFS,在某些情況會遇到 kernel panic,而這個問題在 lenny (以及之後的版本) 上有比較簡單的解法了:「Debian Lenny and XFS causes kernel panic: Suggested Workaround」,解法是在 mkfs.xfs 時多增加 -l version=1 即可。

另外官方也在下面 reply 了另外一個解法,針對 FC8 kernel 的修正。

然後 Eric Hammond (EC2 上最有名的 Debian AMI 製作者) 說 Ubuntu 也開始在測試 EC2 platform (www.ubuntu.com/ec2),將會是第三個解法...

如果有在 EC2 上用 EBS 跑 MySQL 的,可以考慮換成 XFS... MySQL 在 XFS 上比起 ext3 好不少。

將 Ubuntu 裡的 Java 更換成 Sun 的版本

這篇說的方法在 Debian 可能也一樣,不過暫時沒有打算在有 Debian 的機器上測試。

關於 Ubuntu 的修改,你可以參考「Java - Community Ubuntu Documentation」這篇,我在下面提到的方式會透過 update-alternatives 修改。

裝完 SunJava 後發現還是跑 GNU 的版本,看了 link 結構後猜大概會跟「Ubuntu / Debian 快速修改預設編輯器(nano -> vim)」這篇的方法一樣:

lrwxrwxrwx 1 root root 22 2008-10-27 01:38 java -> /etc/alternatives/java*

所以修改方式是用 root 跑:

# update-alternatives --config java

同理,如果要把 compiler (javac) 也換成 Sun 的版本,用:

# update-alternatives --config javac

就可以了。用 -version 可以驗證:

$ java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)
$ javac -version
javac 1.6.0_10

Debian 上跑 apache22-mpm-worker

FreeBSD 上跑 Apache 2.2 worker 的方法在「apache22 (worker) + mod_fastcgi + php5-fcgi」這篇寫過了,同樣的架構在 Debian 上跑卻發現比 prefork 還吃記憶體,花了一些時間找,發現是預設的 Stack 太大造成的,所以:

<IfModule mpm_worker_module>
    ThreadStackSize   65536
    ThreadLimit         256
    StartServers          1
    MaxClients          256
    MinSpareThreads       1
    MaxSpareThreads     256
    ThreadsPerChild     256
    MaxRequestsPerChild   0
</IfModule>

加了 ThreadStackSize 這個設定後,每個 thread 的 stack 就會比較小了 (預設超過 1MB,不記得多少了),這個方式跑了一個月後還蠻正常的。

網頁截圖

照著「在 Linux 上架設 Screenshot Service」這篇講的方法在 Debian 上灌。xdite 是在 Ubuntu 上灌,結果像 Flash Player 這類 Debian policy 原因而超麻煩 (加上平台是 amd64),吃了不少苦頭,不過也測出一些東西,可以確保安裝出來的玩具比較正常。

透過 Xming,有很多地方可以 tune:

  • 設定 Firefox 在 shutdown 時把 history/cookie 之類的資料清空,做網頁截圖的環境會比較乾淨。
  • 設定 about:config,將 HTTP pipeline 打開,以及其他效能設定的東西調好。
  • 裝 Plugin 的部份就不用像 xdite 那樣,在 Windows 上裝好再惡搞傳上去... XD

這是 Xming 的畫面:

還有蠻多地方要努力的,不過目前看起來還蠻不錯...