嚴格來說是慢了半年, 這篇是參考 Izero[how-to] FreeBSD6 遠端升級 FreeBSD 7 的方法, 多數指令也跟 Izero 版相同, 主要是去掉使用 kkupdate 部分, 並把比較沒說明清楚的小細節補上, 這版本比較適用很多想要剪下貼上懶人升級的SA. :p

注意事項
* 升級過程中大約有一半時間會處於停機狀態, 多數 server daemon幾乎都會停掉
* 我慣用 vim, 如果習慣用其他 editor 請自行替換
* 我慣用 bash, 如果習慣用其他 shell 請自行替換, 且部分 shell script 也得自行調整
* 一定需要知道 root 密碼, 某個階段 sudo 是爛掉的
* 事前準備請務必參考 Izero那篇

列出指令開幹
更改自己的 shell
$ chsh
將 Shell: 後方的文字改為 /bin/sh 或是 /bin/tcsh, 按 Esc, 輸入 :wq 儲存.

變身成 root
$ su -

確認自己的帳號是 wheel group
# vim /etc/group

更改 root 的 shell
# chsh
將 Shell: 後方的文字改為 /bin/sh 或是 /bin/tcsh, 按 Esc, 輸入 :wq 儲存.

更改 RELENG 版本
# vim /usr/share/examples/cvsup/releng-supfile
搜尋 RELENG_ , 把 RELENG_6_? 改為 RELENG_7_0

更新 src & ports
# cd /usr/src && make update

修改 kernel 設定(請依據自己機器的平台把 i386 改成對應架構)
# vim /usr/src/sys/i386/conf/GENERIC
輸入 :vert diffsplit [你的 kernel 設定檔], 7.0 某些 option 改變了, 所以跟 GENERIC 比對一下,
我碰到的情況主要是 GPT(GUID Partition Tables)的參數名稱不太一樣, 部分 device option 改名等,
希望效能好一些的話, 把 KTRACE 跟 makeoptions DEBUG=-g 註解起來.

編譯 kernel & world
# rm -rf /usr/obj/ && make buildworld && make buildkernel

如果 /usr、/var 等系統資料夾沒使用其他 partition, 可以用以下指令把除了 / 的 partition 都 umount 掉, 不然請手動 umount
# umount /*

把 cron 停掉
# sh /etc/rc.d/cron stop

第一次 install kernel & world
# cd /usr/src/ && make installkernel && make installworld

把設定 merge 一下, 7 跟 6 很多設定檔案都不太一樣, merge 的時候要注意看
# mergemaster -i

**注意 以下步驟開始, 機器應該就處於殘廢狀態
重開機
# sync && sync && sync && shutdown -r now

開完機, 登入之後, 先變身成 root
$ su -

停掉 cron
# sh /etc/rc.d/cron stop

記錄現在系統裝了哪些 ports(這是抄 Izero 的)
# cd /var/db/pkg/ && find . -name '+CONTENTS' | xargs grep " ORIGIN:" | awk ' { match($1, "ORIGIN:"); print "portupgrade -N -m \"BATCH=yes\" \"" substr($2,8) "\""; } ' > /tmp/all_pkg.sh

把舊版 ports 砍掉
# cd /var/db/pkg/ && rm -f pkgdb.db && pkg_delete *

裝 bash
# cd /usr/ports/shells/bash && make all install

裝 screen
# cd /usr/ports/sysutils/screen && make all install

把 root 的 shell 改回 bash
# chsh
將 Shell: 後方的文字改為 /usr/local/bin/bash, 按 Esc, 輸入 :wq 儲存, 登出重新登入, 掛上 screen 並登入 root.

裝 portupgrade
# cd /usr/ports/ports-mgmt/portupgrade && make all install

把該裝的東西裝回來
# sh /tmp/all_pkg.sh

如果該 server 需要跑 6.x/5.x/4.x 編譯出來的程式, 則需要安裝 misc/compatNx library, 請把 N 換成自己需要相容版本的版號, 以下是安裝 6.x 相容為例
# cd /usr/ports/misc/compat6x/ && make all install


以下是清除 6.x 的屍體(都是抄 Izero 的)
把 /bin /sbin /usr/bin /usr/sbin /usr/libexec /usr/libdata 舊檔案列出來
# ( for dir in /bin /sbin /usr/bin /usr/sbin /usr/libexec /usr/libdata; do \
find $dir -mtime +2 -type f -xdev -print; \
find $dir -mtime +2 -type l -xdev -print; \
done ) >/tmp/remove

把 /bin /sbin /usr/bin /usr/sbin /usr/libexec /usr/libdata 裡面舊檔案刪掉
# cat /tmp/remove | xargs rm -f

把 /lib /usr/lib 列出來
# ( for dir in /lib /usr/lib; do \
find $dir -mtime +2 -type f -xdev -print; \
find $dir -mtime +2 -type l -xdev -print; \
done ) | grep -v /usr/lib/compat >/tmp/move

移到 /tmp/remove_lib/ 備份
# mkdir /tmp/remove_lib/
# for x in `cat /tmp/move`; do chflags noschg $x; mv $x /tmp/remove_lib/; done

砍掉舊檔案跟函式庫
# cd /usr/src && make BATCH_DELETE_OLD_FILES=YES delete-old delete-old-libs

重裝 kernel & world
# make installworld && make installkernel

重開機就大功告成!
# sync && sync && sync && shutdown -r now

arrow
arrow
    全站熱搜

    ericpi 發表在 痞客邦 留言(0) 人氣()