高速起動 Linux + Oracle(第一回)
這系列兩篇文章,將會介紹兩個啟動 Linux 和 Oracle 的捷徑。這兩個方法,特色如下︰
- 簡化安裝過程—對一般電腦用家來說,安裝 Linux 是一件可望而不可即的事。至於 Oracle…即使是所謂的 IT 人也望而輕嘆
- 配合 Virtualization Software(見前作),可以低風險無痛使用,不用擔心弄壞系統
- 玩玩而已,不適用於 Production 環境
廢話小說,先介紹第一炮︰用 Ubuntu + Oracle Express Edition(Oracle XE)。這篇文章中也會簡介 Ubuntu 的 Persistent 功能,讓用戶可以使用 Ubuntu 光碟啟動電腦之餘,也可輕易儲存檔案,甚至安裝和升級套件。
Ubuntu 簡介
Ubuntu 是根據 Debian Unstable 製成的 Linux Live CD,從數以萬計的 Debian 套件中,精心挑選剛好「塞滿」一隻 CD 的容量,以建立穩定簡單易用的 Desktop Linux 為己任。雖則名為 Unstable,但 Debian 的出品標準相當嚴謹,加上 Ubuntu 小心挑選及加上 patch,安全性應該不會有問題,而成功「征服」桌面市埸後,也推出 server 版本,還有著重教育軟件的 Edubuntu,及使用 KDE 桌面的 Kubuntu(個人覺得,KDE 比 GNOME 漂亮)。
為推廣 Linux,Ubuntu 更推出 shipit 計劃,登記後免費寄出包裝精美的 CD(註︰不是最新版)。有興趣可玩玩。由於郵費比印製 CD 更貴,鼓勱一次過申請多些,派給其他朋友。
其實,第一個大行其道的 Linux Live CD 為 Knoppix,更有推出 DVD 版,不過不知知何故輸了給 Ubuntu…
在 Ubuntu,開一個 root shell 的最簡單方法為
$ sudo bash
由於涉及軟硬件安裝設定,本文大部分指令皆假設由 root 執行。在日常使用,絕對不要什麼都用 root 做!!
Persistent 設定
由於 CD 是唯讀媒體,檔案不能存到 CD 上。Ubuntu 本身支援使用 tmpfs,就是類似 RAM Disk,讓大家臨時儲存檔案。但一重新啟動…便化為烏有了。
Ubuntu 使用 UnionFS,簡單點說,容許大家把兩個個檔案系統「聯合」在一起,就是說一個檔案只要在其中一邊出現,就可以用到。UnionFS 也提供方法模據檔案刪除和更新,這方法名為 Copy on Write(COW),例如在 CD 上有更改時,就抄到可讀寫的媒體中,之後都不再使用 CD 上的版本。
Ubuntu 可用不同媒體來支援 Persistence—Partition(Harddisk 或 USB 手指) 或檔案。但不論用哪個方法,都要使用了 Peristent 的 kernel 參數,才可使用。方法︰在 Ubuntu 的啟動畫面,按 F6,加上 persistent 一字(見圖)—謹記︰用 VMWare 的話,要用老鼠按過後 Ubuntu 的畫面後,按 F6 才生效。你有 30 秒時間。

(「Persistent」 參數 - 72644.jpg )
使用 Harddisk Partition
由於是用於 Linux,Ext3 當然是最佳選擇。ReiserFS![]()
、Ext2、FAT32、FAT 等好像也可以,但 VFAT 和 NTFS 不成。
建立檔案系統後(這裡不說如何分剖硬碟和建立檔案系統了),要設立檔案系統標籤為 casper-rw。使用 Ex2 或 Ext3 的話,又假設大家用的是 /dev/sda1(可能是 USB 手指吧)可以這樣做︰
$ e2label /dev/sda1 casper-rw
使用檔案
有關的檔案,必須在一個 Ubuntu 懂寫入的檔案系統,如 Ext3、Ext2、ReiserFS、FAT32、FAT 等。檔案名必須為 casper-rw。如要產生一個 2GiB 的檔案,又假設大家在 /dev/hda5 的 FAT32 partition 有空位,可以︰
$ mount /dev/hda5 /mnt/
$ dd if=/dev/zero of=/mnt/casper-rw bs=1048576 count=2048
再在檔案上建立檔案系統(這裡又不詳說了…),便可以了。
下次啟動後(謹記加上 persistent 參數),可看看 /proc/mounts,如果在 cow 的一行,看到大家建立的檔案系統,而非 tmpfs,就大功告成!大家可以更新套件,儲存檔案,也不用擔心下次啟動後,一切都是虛空了!
安裝 Oracle XE
Oracle XE(Express Edition),是一個免費的 Oracle 版本,功能上有不少限制,但還算可以滿足個人和中小企之用。可參閱前文。
Oracle XE 的安裝程式,本身已有 deb 包,所以安裝過程相當簡單︰
$ dpkg -i oracle-xe-universal_10.2.0.1-1.0_i386.deb
這時,可能會出現以下的 dependency 問題︰bc 和 libaio。安裝它們後再安裝 Oracle XE 就可以了。
Oracle XE 也要求 1006MiB 的 swap space。可能的話,最好用一個 swap partition,否則,弄一個大檔案用作 swap 也可以。最後把相關資料放入 /etc/fstab,以便在下次開機時自動啟動。
事實上,Oracle 也建立了 debian repository。將之加進 /etc/apt/sources.list 後,便可用 aptitude 或 synaptic 安裝,並自動解決 dependency 問題。
安裝完成後,可執行 /etc/init.d/oracle-xe configure 來設定數據庫(註︰Oracle 這裡好像有個小蟲,會導致不能建立數據庫…見以下「射茶煲」一節)。請回答以下問題︰
- Web 介面便用哪個 Port—Oracle XE 內置了 web server,並可使用 Application Express 建立 Web 程式,這裡設定用哪個 port。
- Listener 便用哪個 Port
- SYS 和 SYSTEM 帳戶密碼
- 是否在 OS 啟動時自行啟動數據庫
等等等等等…完成了!可以玩了!!出現 Oracle 菜單了!
Oracle 使用簡介
看到這裡對 Unix 有點認識的,都知道怎樣啟動和停止 Oracle XE 了。沒錯︰
$ /etc/init.d/oracle-xe start
$ /etc/init.d/oracle-xe stop
大家可不加參數執行 /etc/init.d/oracle-xe 以了解其他用法。
數據庫啟動後,大家便可用喜歡的 sqlplus、pro*c、jdbc、php、odbc……程式連接數據庫了。
還有不得不提的 Application Express。開一個 browser 到 http://localhost:8080/apex,使用 SYSTEM 帳戶登入。建立新應用程式並不簡單,但至少看看 demo 吧!
當然,也可用 Oracle 傳統方法啟動數據庫。首先,要登入 oracle 的 OS 帳戶。懶的話可以直接用 root 變為 oracle
$ sudo - oracle
也可以設定 oracle 的 密碼,之後用普通帳戶變身 oracle。以 root 身份
$ passwd oracle
(輸入新密碼兩次)
之後,就可以普通用戶的身份,執行 sudo - oracle,輸入密碼變身 oracle 了。
變身 oracle 後,卻是連 sqlplus 也行不到的,因為安裝程式沒有幫手建立環境變數…最起碼要這些吧
export ORACLE_SID = XE
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
之後便可用 sqlplus 來 startup,shutdown Oracle 了。
射茶煲(Troubleshooting)
自行設定數據庫
正如前述,/etc/init.d/oracle-xe 及其相關 script 有個小蟲︰沒有把 $ORACLE_HOME/lib 加進 LD_LIBRARY_PATH。這個小蟲,會導致數據庫還原失敗。更不幸的是,相關的還原檔案已經被移除了!這時,可以 oracle 帳戶使用以下指令解壓 deb 檔,如果 $ORACLE_HOME/config/seeddb/xeseed.dbf 還在就不用這樣做了。
$ dpkg-deb -x oracle-xe-universal_10.2.0.1-1.0_i386.deb /tmp
$ mv /tmp$ORACLE_HOME/config/seeddb $ORACLE_HOME/config/
$ cd $ORACLE_HOME/config/scripts
並重新還原數據庫(使用 oracle 帳戶)
$ ./XE.sh
祝你好運!!
自行建立數據庫
(參考 Creating an Oracle (XE) database manually on XP)
有幾種情況,我氜可能想自行建立數據庫︰
- 好學者希望學習
- 弄壞了原有數據庫,沒有備份,又不想重裝
- 不喜歡預設的 character set
- 想自行修改 sql.bsq 內容

- ……
自行建立的數據庫,有部份功能是不提供的,包括 Application Express,因為根本沒有所需的 script—相信這是 Oracle 要用還原的方法建立數據庫的原因吧。
這裡,假設大家要建立的數據庫名為 NEWXE。
- 首先,到 $ORACLE_HOME/dbs,建立 initNEWXE.ora 檔案。可參考 $ORACLE_HOME/config/scripts/initXE.ora。把所有 XE 轉為 NEWXE,xe 轉為 newxe 就可以了。
- 參照 $ORACLE_HOME/config/scripts/XE.sh,建立一堆目錄︰
# cd /usr/lib/oracle/xe/app/oracle/admin
# mkdir -p NEWXE/adump
# mkdir -p NEWXE/bdump
# mkdir -p NEWXE/cdump
# mkdir -p NEWXE/dpdump
# mkdir -p NEWXE/pfile
# mkdir -p NEWXE/udump
# mkdir -p cfgtoollogs/dbca/NEWXE
# mkdir -p NEWXE/dbs
# cd ../../..
# mkdir -p app/oracle/flash_recovery_area
# mkdir -p oradata/NEWXE - 設定 environment variable,使用 sqlplus 起動 instance
export ORACLE_SID = NEWXE
sqlplus / as sysdba
…
Connected to an idle instance
SQL> startup nomount
… - 建立數據庫
SQL> create database “newxe”
1 maxinstances 1
2 maxloghistory 1
3 maxlogfiles 3
4 maxlogmembers 3
5 maxdatafiles 50
6 datafile
7 '/usr/lib/oracle/xe/oradata/NEWXE/system01.dbf'
8 size 300m
9 autoextend on
10 extend management local 9 sysaux datafile
11 '/usr/lib/oracle/xe/oradata/NEWXE/sysaux01.dbf'
12 size 120m
13 autoextend on
14 smallfile default temporary tablespace temp
15 tempfile
16 '/usr/lib/oracle/xe/oradata/NEWXE/temp01.dbf'
17 size 20m
18 autoextend on
19 smallfile undo tablespace undo
20 datafile
21 '/usr/lib/oracle/xe/oradata/NEWXE/undo01.dbf'
22 size 200m
23 autoextend on
24 character set al32utf8
25 national character set al16utf16
26 logfile group 1 size 50m,
27 group 2 size 50m
28 user sys identified by [sys_password]
29 user system identified by [system_password]; - 建立 Data Dictionary,執行以下 SQL 檔
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql - 等等等等等…
- 據聞這樣已經建立好了一個可用的數據庫。大家還可執行以下 SQL 檔,加入更多功能
@?/rdbms/admin/catblock
— 有關 Locks 的 Views
@?/ctx/admin/catctx [ctxsys_password] sysaux temp LOCK
— Oracle Text,用於全文檢索
@?/rdbms/admin/catoctk
— Oracle Crytographic Toolkit,用於數據加密解密
@?/rdbms/admin/catqm [xdb_password] sysaux temp
— XMLDB 檔案儲存及管理 - 如果想用 XMLDB 的 Web 和 FTP 介面,執行
SQL> exec dbms_xdb.sethttpport(8080)
SQL> exec dbms_xdb.setftpport(2100) - 我們已經盡力建立了 Oracle XE 應有的功能,不過,還有很多本身應該有,但找不到安裝 script 的功能
你已在 Oracle 做了一樣即使 Oracle DBA,都不一定做過的事︰自行建立數據庫!
- Application Express
- Oracle Spatial Locator
- Oracle OLAP—這個很怪,因為 Oracle XE 應該是不支援 OLAP 的,但卻有一些和 OLAP 相關的檔案
- HR 樣品數據
- 有關 BSLN(Baseline??)的物件
重建 Ubuntu 光碟
(參考 How To Customize the Ubuntu Dapper Desktop CD)
每次都要按 F6 打 persistent,實在有點麻煩,而且打漏了更要…再啟動
已經有不少協助重建 Live CD 的工具,如 Ubuntu Configuration Kit 和 Reconstructor,不過我們的目標簡單,只需改一個檔案,就不用勞煩它們了。(其實我不懂用…)
首先,掛上 Ubuntu 光碟…假設 CD Rom 是 /dev/hdc︰
$ mount /dev/hdc /mnt
我們要改的是 isolinux/isolinux.cfg 檔…抄到硬碟中(否則不能修改)並編輯之︰
$ cp /mnt/isolinux/isolinux.cfg /tmp
$ vi /tmp/isolinux.cfg
修改方法︰就是在 APPEND 的行加上 persistent 一字,如︰
DEFAULT /casper/vmlinuz
GFXBOOT bootlogo
GFXBOOT-BACKGROUND 0xB6875A
APPEND file=/cdrom/preseed/ubuntu.seed boot=casper \
initrd=/casper/initrd.gz ramdisk_size=1048576 \
root=/dev/ram rw quiet splash — persistent
…
(APPEND 後的一大串,實際在同一行)
完成修改,但…/mnt 是唯讀的,怎辦?
原來 mount 有一個 –bind 的選項,作用是把一個檔案或目錄加到另一處,可覆蓋原有的檔案。效果有點像 UnionFS。
$ mount –bind /tmp/isolinux.cfg /mnt/isolinux/isolinux.cfg
於是,/mnt 的內容和原本的 CD 一模一樣,除了我們要改的 isolinux/isolinux.cfg。是時候重建光碟了(mkisofs 又是一行過)︰
$ cd /mnt
$ mkisofs -r -V “Ubuntu 6.10(Persistent)” -cache-inodes \
-J -l -b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-o /tmp/ubuntu-custom.iso .
要注意的是,如果沒有適當的裝置用作 Persistent Storage,會啟動不到。
(終於寫完…)

(0)
鉗子 said,
2008 一月 25 @ 12:17 pm
你好~我在網路上看到這篇文章,實在是太酷了~能靠著一支USB就能隨時改變Livecd的內容。我看不太懂其中內容只能照著打。我不太懂在檔案上建立檔案系統是什麼意思。目前我的USB已被掛載在/mnt裡,出現lost+found的資料夾及casper-rw文字檔,如果不理在檔案上建立檔案系統我直接關機,在/porc/mounts 其中/cow看不到有任何改變...我也嘗試做些apt-get 的動作,但是重開還是都會不見= =,不太懂問題出在哪裡。
肥企鵝 said,
2008 一月 27 @ 12:23 am
「在檔案上建立檔案系統」簡單點說,即是執行以下指令
$ mke2fs -j casper-rw
(要不要 -j,請自行參閱 manpage)
它會出現一個 warning,說 casper-rw 不是 partition,問你是否確認之類。讓它繼續吧。
要注意 ubuntu 7.04 是不支援 persistence 的。6.x 或 7.10 則可
鉗子 said,
2008 一月 28 @ 2:20 pm
企鵝大哥,小地讓他繼續。以為完成OK了...重新開機,按下F6 輸入persistent進入ubuntu 但是,不會看到鵝哥說的/porc/mounts tmp有變動。 apt套件在重開機鍵入persistent後 也是不會繼續存在,是否有哪裡需要在注意一下的??
肥企鵝 said,
2008 二月 1 @ 12:54 am
重讀了相關文章,它說︰「Instead of using a USB stick, you can use a file on your hard disk to store persistent information. The file must be named casper-rw and must be on the root of a partition.」
可能這個 casper-rw 檔的方法,只適用於 harddisk,不適用於 USB…也有可能,你的 casper-rw 位置不對??
另一個方法是劃一個 linux 專用的 partition。詳見︰
https://help.ubuntu.com/community/LiveCDPersistence