Categories
學習筆記

不尋求官方協助 自行添加DigitalOcean VPS的內核自動切換

QQ20150427-1@2x
QQ20150427-2@2x
DigitalOcean這家VPS基本上也算是老招牌了,整體感覺還算是不錯的,價格也很便宜,月付5美金基本上就可以買到一個價格合適且性能強勁的VPS,最方便的是這傢伙是每日計費,且支持自行刪除VPS,意思就是如果我突然不需要了,我可以將它刪除,剩下不少錢,玩開發的肯定會特別喜歡它,而我個人就非常喜歡它的模式。
就是有個毛病,讓我有點討厭,而這個毛病就是VPS的kernel加載部份。

DigitalOcean的kernel management是透過DigitalOcean自行開發的面板控制來實現的,意思就是如果你自己安裝了新的kernel,但沒有到DO去設定的話,你的kernel實際上並不會生效,加載的依舊是舊的。

延伸意義就是如果你的kernel不在選項里,那你就倒楣了,只能摸摸鼻子去找客服添加,這個感覺也太蛋疼了,所以我非常不喜 ﹣﹣
因此該怎麼突破這個障礙 就是我今天想分享的東西

顯然為達目的,我們必須另闢奇徑,而就有了我標題所說的內核自動切換的概念。
這裡就來介紹一下實現內核切換的kexec,這貨的做法其實很簡單,就是跳過bootloader stage的部份,直接把新的kernel加載到內存中,不僅可以避免長時間的重啟,也可以避開依賴bootloader選擇kernel的部份,進而實現我的目的。

In computing, kexec (abbreviated from kernel execution, and derived from the Unix/Linux kernel call exec) is a mechanism of the Linux kernel that allows "live" booting of a new kernel "over" the currently running kernel. Essentially, kexec skips the bootloader stage (hardware initialization phase by the system firmware, BIOS or UEFI) and directly loads the new kernel into memory, where it starts executing immediately. This avoids the long times associated with a full reboot, and can help systems to meet high-availability requirements by minimizing downtime.

說完了原理,現在就直接來實現它吧!
其實很簡單,就是利用rc.local這個開機啟動運行的腳本來做到自動切換。
然後針對文件的內容來做判斷,當文件內容為0時(剛開機)把文件內容改為1,然後做切換內核的動作;
而當切換了內核后rc.local會再次運行,此時文件內容為1所以不做切換動作,單純把文件內容復位為0。

yum install -y kexec-tools
echo '0' > /etc/kflag
cp /etc/rc.d/rc.local /etc/rc.d/rc.local_backup
sed -i 's/sh/bash/g' /etc/rc.d/rc.local
echo 'kflag=`cat /etc/kflag | head -n1`' >> /etc/rc.d/rc.local
echo 'if [ "$kflag" -eq "0" ]; then' >> /etc/rc.d/rc.local
echo ' echo "1" > /etc/kflag' >> /etc/rc.d/rc.local
echo ' latestkernel=`ls -t /boot/vmlinuz-* | sed "s/\/boot\/vmlinuz-//g" | head -n1`' >> /etc/rc.d/rc.local
echo ' kexec -l /boot/vmlinuz-${latestkernel} --initrd=/boot/initramfs-${latestkernel}.img --append="`cat /proc/cmdline`"' >> /etc/rc.d/rc.local
echo ' kexec -e' >> /etc/rc.d/rc.local
echo 'elif [ "$kflag" -eq "1" ]; then' >> /etc/rc.d/rc.local
echo ' echo "0" > /etc/kflag' >> /etc/rc.d/rc.local
echo 'fi' >> /etc/rc.d/rc.local

至於更進階的怎麼安裝openvz等其他內核的也可以用類似的方法進行,但可能需要做一些加載次序的調整,為了避免大家過於折騰,我在這裡就不詳述怎麼加載openvz了 哈

2 replies on “不尋求官方協助 自行添加DigitalOcean VPS的內核自動切換”

Leave a Reply to 孤雨 Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.