所以我們大多會自行想辨法來更新 Kernel。
如果想要安裝 Debian 的官方 Kernel 其實並不難,
只要幾個簡單的步驟就可以使用 apt 工具輕易得把 Kernel 昇級到最新版了!
首先,
請將 initrd-tools、hotplug、modconf、modutils、gcc、g++、g77 等套件進行必要的昇級。
如果可以,請將其全數更新至 testing:
- 代碼: 選擇全部
apt-get install -t testing initrd-tools hotplug modconf modutils gcc g++ g77
其中,
initrd-tools 套件包含了用來製作及載入 initrd-image 的工具程式。
在安裝完 initrd-tools 套件後,
必須在 /etc/lilo.conf 中加入 initrd=/initrd.img 這個選項,例:
- 代碼: 選擇全部
image=/vmlinuz
initrd=/initrd.img
label=Linux
否則很可能會無法以新的 Kernel 來進行開機。
在 /etc/lilo.conf 中加入 initrd=/initrd.img 這個選項後,
請在 /etc/kernel-img.conf 中再加入:
- 代碼: 選擇全部
do_initrd = yes
來記錄說已做了此項變更,
否則 apt 可能會拒絕進行 Kernel 的更新。
(以前是必須要這麼做啦,不知現在是否還是需要?)
hotplug 套件是用來自動載入 USB 裝置的 Daemon。
如果不安裝的話,apt 可能會替而要求您下載整個 Kernel Source,
(至少 Kernel 2.6.6 似乎就是如此...)
因為 hotplug 套件會自動載入 USB 裝置所有的所需模組,
非常值得安裝哦!
modconf、modutils 是用來管理 Kernel 模組的工具程式。
如果安裝的是 Kernel 2.6 的,
則一定要昇級至 testing,
否則有些載入模組的相關指令會無法使用。
但如果是 Kernel 2.4 的,則看您是否需要囉...
gcc、g++、g77 是編譯工具,
如果要自行編譯模組的話,
gcc 的版本必須和用來編譯 Kernel-Image 的 gcc 版本相符,
否則編出來的模組可能會無法使用。
呀!對了,別忘了順便安裝 make 套件呀!
接下來是安裝 Kernel-Image 和 Kernel-Headers 套件。
- 代碼: 選擇全部
apt-get install kernel-image-2.6.6-1-686 kernel-headers-2.6.6-1-686
很多軟體在編繹時都會用到 Kernel Source,
如果安裝了 Kernel-Headers 套件就不用去下載整個 Kernel 的原始碼了,
這樣可以有效節省頻寬和硬碟空間。
在此時,
apt 會順便更新 /initrd.img 和 /vmlinuz 連結,
並執行 lilo。
如果在您的電腦中有 PCMCIA 介面,
並且您所使用的 Kernel 是 2.4 的,
那麼別忘了安裝 PCMCIA Modules:
- 代碼: 選擇全部
kernel-pcmcia-modules-2.4.26-1-686
但如果使用的是 Kernel 2.6 的就不必了,
它已經包含在 Kernel Image 裡了。
如果有興趣,
也可以試著安裝 Kernel-DOC,
沒事就看看 Kernel 的說明文件吧?
(真的會去看的請舉手!)
- 代碼: 選擇全部
apt-get install kernel-doc-2.6.6
到此,基本的相關套件的安裝已告一段落。
如果您是將 LILO 寫入 MBR 的話,
可以順便將其寫入 /dev/hda1 之類的,
有備無患嘛~~
如果您還是擔心,
可以試著再執行一次 lilo,
確認它已正確得寫入了 MBR 或是 /dev/hda1 之中。
如果您是遠端操控 Linux 的,
您可以參考:
http://moto.debian.org.tw/viewtopic.php?t=3261
http://moto.debian.org.tw/viewtopic.php?t=3524
如果新的 Kernel 無法正常開機時,
可以用以上方法來自動以舊的 Kernel 來自動再次進行開機。
好囉,
可以重新開機了!
在進入了新的 Kernel 之後,
請別忘了修改 /etc/modules 或 /etc/modules-2.6 來載入必需的模組。
而 nVidia Driver 或是 VMware 等軟體也別忘了重新編譯一次。
不過這就不在本主題的討論範圍之內了。
如果您不清楚該載入什麼樣的模組,
您不妨安裝 discover 套件,
它會自動偵測您的電腦硬體設備,
並自動替您載入相關的模組。
Debian-Installer 據說就是使用 discover 套件來自動偵測硬體的哦!
不過,(您可以猜到的)
對於官方 Kernel 不支援的硬體,
它是無法偵測出來的!
以上所有的動作已寫成了以下這個 Script,
如果您不怕眼睛痛的話可以參考看看!
- 代碼: 選擇全部
#!/bin/bash
CheckParameter=""
Pause()
{
echo ""
echo "Press <Enter> To Continue, Or <Ctrl><C> To Interrupt..."
read EnterKey
}
# 是否使用 --help 參數
if [ -n "$( echo " $@ " | grep -i -- ' --help ' )" ]; then
echo ""
echo "Usage: $0 --Kernel KernelPackageName --GCC stable/testing/unstable"
echo " --HotPlug stable/testing/unstable --Initrd-Tools stable/testing/unstable"
echo " --Module-Tools stable/testing/unstable --do_initrd --vga16_off"
echo " --support_acpi --with_pcmcia --with_doc --auto_reboot"
echo ""
echo " --help: Display this information"
echo " --Kernel KernelPackageName: Assign The Kernel Version,"
echo " for example: 2.6.0-1-k7 or 2.4.23-1-686."
echo " --GCC stable/testing/unstable: Install GCC package"
echo " --HotPlug stable/testing/unstable:"
echo " Install hotplug package"
echo " --Initrd-Tools stable/testing/unstable:"
echo " Install initrd-tools package"
echo " --Module-Tools stable/testing/unstable:"
echo " Install modconf and modutils package"
echo ""
echo " --do_initrd: Add 'initrd=/initrd.img' to /etc/lilo.conf"
echo " --vga16_off: Add 'append=\"video=vga16:off\"' to /etc/lilo.conf"
echo " --support_acpi: Add 'append=\"acpi=on apm=off\"' to /etc/lilo.conf"
echo " --with_pcmcia: Install Kernel PCMCIA modules, For Kernel 2.4.x Only"
echo " --with_doc: Install Kernel documents"
echo " --auto_reboot: Reboot machine automatic after installation"
echo ""
exit 0
fi
for Parameter in $@
do
# 使用 --Initrd-Tools stable/testing/unstable 來同時安裝 initrd-tools 套件。
if [ "$CheckParameter" = 'Initrd-Tools' ]; then
CheckParameter=""
case "$Parameter" in
stable|testing|unstable)
echo ""
echo "Install Initrd-Tools..."
apt-get -t "$Parameter" install initrd-tools
echo ""
;;
*)
echo ""
echo "Usage : "$0" --Initrd-Tools stable/testing/unstable"
echo "Please try again."
echo ""
exit 1
;;
esac
Pause
fi
if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--initrd-tools' ]; then
CheckParameter="Initrd-Tools"
fi
# 使用 --HotPlug stable/testing/unstable 來同時安裝 hotplug 套件。
if [ "$CheckParameter" = 'HotPlug' ]; then
CheckParameter=""
case "$Parameter" in
stable|testing|unstable)
echo ""
echo "Install HotPlug..."
apt-get -t "$Parameter" install hotplug
echo ""
;;
*)
echo ""
echo "Usage : "$0" --HotPlug stable/testing/unstable"
echo "Please try again."
echo ""
exit 1
;;
esac
Pause
fi
if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--hotplug' ]; then
CheckParameter="HotPlug"
fi
# 使用 --Module-Tools stable/testing/unstable 來同時安裝 modconf 及 modutils 套件。
if [ "$CheckParameter" = 'Module-Tools' ]; then
CheckParameter=""
case "$Parameter" in
stable|testing|unstable)
echo ""
echo "Install Module-Tools..."
apt-get -t "$Parameter" install modconf modutils
echo ""
;;
*)
echo ""
echo "Usage : "$0" --Module-Tools stable/testing/unstable"
echo "Please try again."
echo ""
exit 1
;;
esac
Pause
fi
if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--module-tools' ]; then
CheckParameter="Module-Tools"
fi
# 使用 --GCC stable/testing/unstable 來同時安裝 GCC。編譯驅動模組時所必須的。
if [ "$CheckParameter" = 'GCC' ]; then
CheckParameter=""
case "$Parameter" in
stable|testing|unstable)
echo ""
echo "Install GCC..."
apt-get -t "$Parameter" install gcc g++ g77
echo ""
;;
*)
echo ""
echo "Usage : "$0" --GCC stable/testing/unstable"
echo "Please try again."
echo ""
exit 1
;;
esac
Pause
fi
if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--gcc' ]; then
CheckParameter="GCC"
fi
# 使用 -do_initrd 來指定在 lilo.conf 中加入 initrd=/initrd.img
if [ -n "$( echo " $@ " | grep -i -- ' --do_initrd ' )" ]; then
echo ""
echo "Adding 'initrd=/initrd.img' to /etc/lilo.conf..."
if [ ! -f /etc/kernel-img.conf ]; then
touch /etc/kernel-img.conf
fi
if [ -z "$(grep -i "do_initrd = yes" /etc/kernel-img.conf )" ]; then
sed -e '/^image=\/vmlinuz$/a\
initrd=\/initrd.img' /etc/lilo.conf > /tmp/lilo.conf.tmp
mv /tmp/lilo.conf.tmp /etc/lilo.conf
# 記錄以上動作己修改完成
cat >> /etc/kernel-img.conf << EOF
do_initrd = yes
EOF
echo "Done."
else
echo "It seems no need..."
fi
echo ""
Pause
fi
# 使用 --vga16_off 來指定在 lilo.conf 中加入 append="video=vga16:off"
if [ -n "$( echo " $@ " | grep -i -- ' --vga16_off ' )" ]; then
echo ""
echo "Add 'append=\"video=vga16:off\"' to /etc/lilo.conf..."
if [ -z "$(grep "^append" /etc/lilo.conf )" ]; then
sed -e '/^# append=\"\"$/a\
append=\"video=vga16:off\"' /etc/lilo.conf > /tmp/lilo.conf.tmp
mv /tmp/lilo.conf.tmp /etc/lilo.conf
echo "Done."
else
if [ -z "$(grep "^append" /etc/lilo.conf | grep 'video=vga16:off')" ]; then
sed -e "s/^append=\"*\"/append=\"video=vga16:off /g" /etc/lilo.conf > /tmp/lilo.conf.tmp
mv /tmp/lilo.conf.tmp /etc/lilo.conf
echo "Done."
else
echo "It seems no need..."
fi
fi
echo ""
Pause
fi
# 使用 --support_acpi 來指定在 lilo.conf 中加入 append="acpi=on apm=off"
if [ -n "$( echo " $@ " | grep -i -- ' --support_acpi ' )" ]; then
echo ""
echo "Add 'append=\"acpi=on apm=off\"' to /etc/lilo.conf..."
if [ -z "$(grep "^append" /etc/lilo.conf )" ]; then
sed -e '/^# append=\"\"$/a\
append=\"acpi=on apm=off\"' /etc/lilo.conf > /tmp/lilo.conf.tmp
mv /tmp/lilo.conf.tmp /etc/lilo.conf
echo "Done."
else
if [ -z "$(grep "^append" /etc/lilo.conf | grep 'acpi=on apm=off')" ]; then
sed -e "s/^append=\"*\"/append=\"acpi=on apm=off /g" /etc/lilo.conf > /tmp/lilo.conf.tmp
mv /tmp/lilo.conf.tmp /etc/lilo.conf
echo "Done."
else
echo "It seems no need..."
fi
fi
echo ""
Pause
fi
# 使用 --Kernel KernelPackageName 來指定 Kernel Image 的套件名稱。
if [ "$CheckParameter" = 'Kernel' ]; then
CheckParameter=""
KernelPacakgeName="$Parameter"
fi
if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--kernel' ]; then
CheckParameter="Kernel"
fi
done
# 安裝 Kernel Image
if [ -z "$KernelPacakgeName" ]; then
echo ""
echo "$0: Missing Kernel-Version."
echo "Try $0 --help for more options..."
echo ""
exit 1
fi
KernelVersion=$(echo $KernelPacakgeName | cut -d "-" -f 1)
echo ""
echo "New Kernel Version = $KernelVersion"
echo "New Kernel Package Version = $KernelPacakgeName"
Pause
apt-get install kernel-image-$KernelPacakgeName
Pause
# 安裝 Kernel PCMCIA Modules
if [ -n "$( echo " $@ " | grep -i -- ' --with_pcmcia ' )" ]; then
apt-get install kernel-pcmcia-modules-$KernelPacakgeName
Pause
fi
# 安裝 Kernel Headers,很多軟體在編繹時都用得到!
# 這樣就不用下載整個 Kernel 的原始碼了。
apt-get install kernel-headers-$KernelPacakgeName
if [ -d /usr/src/linux ]; then
rm -R /usr/src/linux
fi
if [ -f /usr/src/linux ]; then
rm /usr/src/linux
fi
if [ -d /usr/src ]; then
ln -s /usr/src/kernel-headers-$KernelPacakgeName /usr/src/linux-$KernelVersion
ln -s /usr/src/kernel-headers-$KernelPacakgeName /usr/src/linux-$KernelPacakgeName
fi
if [ -d /lib/modules/$KernelPacakgeName ]; then
cd /lib/modules/$KernelPacakgeName
ln -s /usr/src/kernel-headers-$KernelPacakgeName build
fi
# 將新的開機設定寫入磁碟中
# 注意:apt-get 指令現在似乎會自動替您做這件事!不過再做一次比較保險。
lilo -v -v -v
Pause
# 順便把相關文件也安裝進來
if [ -n "$( echo " $@ " | grep -i -- ' --with_doc ' )" ]; then
apt-get install kernel-doc-$KernelVersion
Pause
fi
# 好囉,請自行重新開機,讓新的 Kernel 開始運作。
if [ -n "$( echo " $@ " | grep -i -- ' --auto_reboot ' )" ]; then
reboot
fi
我想,
這篇內容對版上大多數的人而言實是不值一哂;
不過有需要的人不妨參考看看吧!
對了,
順便慶祝一下個人的第 1,500 篇...
要灌水灌到 1,500 篇可真不是件易事呀!
(路人:不行!這小子開始驕傲起來了...)