嚴格來說是慢了半年, 這篇是參考 Izero 的 [how-to] FreeBSD6 遠端升級 FreeBSD 7 的方法, 多數指令也跟 Izero 版相同, 主要是去掉使用 kkupdate 部分, 並把比較沒說明清楚的小細節補上, 這版本比較適用很多想要剪下貼上懶人升級的SA. :p
注意事項
列出指令開幹
更改自己的 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
注意事項
* 升級過程中大約有一半時間會處於停機狀態, 多數 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
全站熱搜
留言列表