想要回到Linux最初的起點,選Slackware。
終於找到了一個比Arch Linux和Gentoo還難用的系統了:Slackware!歡迎來挑戰。沒有Systemd也沒有OpenRC,所有系統服務全部用script啟動,原汁原味的Unix哲學(煙)。
1. Slackware簡介#
Slackware並非適合新手使用的Linux發行版,幾乎所有東西都要手動設定,要頻繁看文件,而且文件非常難讀。
Slackware是一款堅持「Unix哲學」的Linux發行版,意圖讓系統是精簡,好理解的,並且對採用新技術比較保守。不過好不好維護那又是另外一回事了(煙)。它期望使用者手動摸索,了解Linux系統的底層運作原理。
Slackware是目前還有在維護的最古老Linux發行版之一,於1993年發布,也就是Linus Torvalds推出Linux Kernel的兩年之後。Slackware比Debian早幾個月誕生。在當時可以說是創舉,因為Linux只是一個核心,不能直接使用。Slackware是早期幾個將GNU軟體與Linux核心打包起來,成為完整作業系統的典範。
長期以來幾乎只由Patrick Volkerding一人主導開發,並開放社群貢獻套件。Slackware幾乎可以視為Patrick Volkerding一個人的作品,他自己一人維護了1000多個套件組成Slackware Linux的基本系統,包括KDE Plasma與XFCE桌面。想要其他套件的就得裝社群提供的第三方套件。這跟其他Linux發行版由社群共同開發的模式非常不一樣,Slackware是作者定時放出一個他打包好的「完整」Linux系統給人家使用,然後人們再針對這個系統開發軟體。
Slackware有官方Wiki頁面,還有LinuxQuestions.org這個網站當作討論論壇。Patrick Volkerding是Slackware的終身仁慈獨裁者(BDFL),一家子收入幾乎全靠社群捐贈。
講個八卦,openSUSE最早就是基於Slackware開發的,不過現在兩者的系統結構已經大相逕庭,很難視為同一個系統了。另外,1995年杜奕瑾在台灣大學初次架設起PTT BBS的時候,就是跑在Slackware上面的。
Slackware更新頻道分為Current與Stable。Current是滾動更新,軟體版本會一直變動。Stable為經過測試的穩定版本,在維護週期內軟體版本不太會升級,只會有安全性更新。
目前最新版本是2022年發表的Slackware 15,Linux核心版本5.15。
大版本之間發表時間不固定,例如Slackware 11到12中間差了1年,但是從Slackware 14到Slackware 15中間就隔了8年時間。這個開發進度比Debian Stable還慢!其實會隔這麼久是因為Slackware官網商店的負責人捲款潛逃導致作者生計一度陷入困頓,依靠社群捐款接濟才撐得下去。這反應了Slackware開發問題:太依賴一個人決策了。
Slackware開發時間很長,而且由作者一人維護,是可以保證基本系統的穩定啦,但就是套件太舊了…Linux應該是需要頻繁更新的系統才對。考慮到Slackware 15已經是4年前發表的版本了,套件非常舊。如果你想要使用最新版軟體的話,最好使用Slackware Current。例如,Slackware 15還在用KDE Plasma 5.23,想要新版一點的KDE Plasma的話就得使用Slackware Current了。不過2026年的Slackware Current也不過收錄到KDE Plasma 5.27而已。想要更新的KDE Plasma 6就得用第三方套件庫了。
Slackware特別之處在於幾乎沒有套件管理。雖有套件管理器slackpkg,但是它完全不會有依賴關係解析,就是解壓縮軟體放到指定位置,沒了,不會檢查依賴是否衝突。這工具的用途就純粹從Slackware作者發布的套件庫下載最新版軟體罷了。感覺瞬間回到1990年代,透過FTP下載軟體壓縮檔,自己編譯的時代。
這樣做的好處是,使用者被迫要自己去了解系統安裝發生了什麼事,而非被軟體輸出的結果所遮掩。slackpkg不像apt或dnf,每個套件都含有Metadata,可以讓程式列出套件依賴關係,並提示使用者哪些套件該裝或者衝突。早些年代,apt的前身dpkg依賴關係的管理也很弱,但起碼經過多年開發已經有成熟的解決方案了,Slackware的套件管理卻是維持跟30年前差不多的樣子。
在極端情況下,你需要自行摸索Slackware軟體的依賴關係,一個一個手動裝。日後更新Slackware軟體的時候,也要自行注意軟體依賴的套件是否更新完整。
Slackware使用原始的init系統,系統服務沒有專用的init管理程式,不使用Systemd,沒有OpenRC也沒有runit什麼的,全部用System V風格的init script管理。這種機制相較於現在主流的Systemd管理方式來說十分古老。這樣的好處大概就開機很快吧,10秒內就能進入KDE Plasma X11桌面,且開機後RAM的佔用率不到1GB!
Slackware跟主流Linux發行版不一樣,Slackware作者幾乎沒有製作什麼系統管理工具或便捷的指令稿(例如Debian有一鍵更新GRUB的script),全部都要使用者自己調整,或者依賴第三方方案。雖然Slackware系統安裝程式會幫你部署好一個可以立即用的Slackware環境,但剩下的就要靠你自己了。
我有種感覺,Slackware可以說是最接近Linux From Scratch狀態的Linux發行版了。它就像是單純把Linux核心和一組軟體打包給你使用的樣子。Gentoo和Arch Linux雖然難裝,好歹還有完整說明文件和Wiki,更新很活躍。Slackware則是很雜亂,需要依賴使用者自己摸索。
如果你真的喜歡Unix哲學,那你真的是要很死忠的才會用的下去Slackware,因為系統設計實在太古老了。目前仍有其他追尋Unix哲學而且現代化的Linux發行版,例如NetBSD開發者建立的Void Linux,以及Artix Linux、Devuan等等。Slackware在這方面沒有Void Linux那麼好用,尤其是預設的套件管理器方面Slackware真的是完全跟不上時代了。需要依靠社群製作的第三方軟體補強。
2. 測試環境#
- 主機板:ASUS K31CD-K
- CPU:Intel i5-7400
- GPU:Intel UHD 630
- GPU:Nvidia GTX1050Ti
- RAM:16GB
3. 製作Slackware開機隨身碟#
Slackware預設ISO裡面的安裝程式沒有GUI,是ncurses寫的純文字界面。如果想要LiveUSB,請下載「LiveSlak」。
Slackware官網很樸素,下載點不太好找。你應該要到Slackware Mirrors下載Slackware ISO Images。
選取
slackware64-15.0-install-dvd.iso,適用x86_64架構。建議驗證檔案完整性
使用Ventoy製作開機碟
關閉Secure Boot
在電腦使用UEFI開機
4. 安裝Slackware系統#
建議連上有線網路安裝。
開機輸入
root登入帳號Slackware的安裝器不會幫你分區,所以你要手動分區
列出可用磁碟列表,例如SSD會顯示
/dev/sda
fdisk -l- 用fdisk選取要安裝的硬碟,建立三個分區。
fdisk /dev/sda- 建立GPT分割表。第一個是UEFI分區(至少512MB),然後SWAP分區(實體RAM兩倍大小),最後是Linux根目錄分區。並寫入變更。
g
n
1
First Sector: (Enter)
Last Sector: +512M
t
uefi
n
2
First Sector: (Enter)
Last Sector: +4096M
n
3
First Sector: (Enter)
Last Sector: (Enter)
w- 啟動Slackware安裝程式
setupSWAP選取剛剛分割的第二個分區,作為SWAP分區

TARGET,選取要安裝系統的硬碟

格式化為EXT4

新增EFI分區

SOURCE選取要從哪裡安裝軟體
選取USB,從隨身碟載入離線安裝套件

或是HTTP,從線上套件庫下載Slackware套件

若使用HTTP,這裡的套件庫網址你要自己填,參照:https://mirrors.slackware.com。台灣的鏡像站有國網中心的http://ftp.twaren.net/Linux/Slackware/。

用空白鍵選取要安裝的軟體,不知道為什麼它會同時勾選XFCE和KDE Plasma,就維持一個桌面就好

勾選在安裝的時候顯示所有訊息

等待套件解壓縮完成安裝
跳過製作開機碟

安裝適用UEFI系統的ELILO開機引導程式

設定主機名稱

讓系統開機透過NetworkManager服務自動連上網路

設定開機要啟動的服務,建議勾選NTPD自動校時

時區選台灣台北

預設文字編輯器選Vim

設定開機啟動的X11桌面,這裡選KDE Plasma,它會自動新增
~/.xinitrc
設定root密碼

一切就緒後,選取EXIT退出安裝程式。拔掉隨身碟重開機。
5. 新增一般使用者與啟動圖形環境#
初次開機輸入
root登入帳號。預設的執行層級(Runlevel)不會自動啟動圖形環境。建議先新增一個一般使用者叫做user
useradd -m -g users -G wheel,audio,video -s /bin/bash user
passwd user- 編輯
/etc/sudoers
sudo vim /etc/sudoers- 在root下面,將使用者加入到sudoers
user ALL=(ALL:ALL) ALL- Slackware的執行檔環境變數可以用
echo $PATH查看,位於/sbin目錄下的指令是只有Root可以使用的。若要讓一般使用者可以透過sudo執行,將/etc/sudoers以下段落取消註解
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/Slackpkg+usr/bin:/sbin:/bin"- 將啟動KDE Plasma桌面的.xinitrc範本複製到一般使用者家目錄
cp /etc/X11/xinit/xinitrc.kde /home/user/.xinitrc- 切換到一般使用者
su user
cd ~- 然後再啟動嘗試啟動KDE Plasma X11桌面
startx- 編輯
/etc/inittab
sudo vim /etc/inittab- 修改預設執行層級(initdefault)為4,代表開機之後應Slackware該要啟動圖形介面。這樣之後開機就會自動啟動SDDM顯示管理器的登入界面。
id:4:initdefault:- 也可以直接用init指令切換目前的Runlevel:
sudo init 46. 設定slackpkg套件管理器#
Slackware官方套件庫的軟體基本上只由Patrick Volkerding一人維護。官方套件管理器是
slackpkg,功能非常簡陋,安裝軟體的時候不會檢查依賴項目,就只是單純下載軟體然後將檔案解壓縮,執行裡面的指令碼放到指定路徑。如果在安裝Slackware系統的時候選擇離線安裝,則你就得手動填寫套件庫網址。編輯
/etc/slackpkg/mirrors:
sudo vim /etc/slackpkg/mirrors將裡面要使用的伺服器鏡像站取消註解,台灣的鏡像站有國網中心的http://ftp.twaren.net/Linux/Slackware/。注意一次只能使用一個伺服器!以Slackware 15來說伺服器網址應該含有
/slackware64-15.0/。然後更新套件庫資料庫
sudo slackpkg update gpg
sudo slackpkg update- 更新並升級目前系統所有的套件。可能要手動回答是否覆蓋舊版軟體設定檔。
sudo slackpkg install-new
sudo slackpkg upgrade-all- 移除不屬於Slackware的套件,確保系統正常(註:這會移除Slackbuilds的套件)
sudo slackpkg clean-system- 如果更新的時候有升級Linux核心,需要手動覆蓋掉舊版的vmlinuz與initrd.gz檔案,這樣ELILO才會在下次開機的時候載入新版Linux核心:
# 選項一:通常只要執行這個指令就會自動更新核心
sudo eliloconfig
# 選項二:手動更新
# 重新生成initrd
sudo /usr/share/mkinitrd/mkinitrd_command_generator.sh
# 依照上述指令稿的內容執行sudo mkinitrd開頭的指令
# 複製新版核心
sudo cp /boot/vmlinuz /boot/efi/EFI/Slackware/vmlinuz
# 複製initrd
sudo cp /boot/initrd.gz /boot/efi/EFI/Slackware/initrd.gz- 重開機。
sudo reboot- 搜尋並安裝套件
sudo slackpkg search vim
sudo slackpkg install vim7. 新增SlackBuilds第三方套件庫#
這是選擇性項目,建議啟用,不然Slackware作者自己維護的軟體太少了,連瀏覽器都沒有幾個。Slackware有非官方的套件庫,例如SlackBuilds收錄了很多社群貢獻的套件。SlackBuilds類似Arch Linux的AUR,提供自動編譯並安裝套件的機制。SlackBuilds的套件有的需要編譯,有的則是二進位檔。
可以用
sbopkg或sbotools或sboui的Helper協助安裝SlackBuilds的軟體。這裡推薦使用sbotools,它會自動檢查依賴並安裝SlackBuilds的軟體。參照官網指示安裝sbotools。只要複製二進位壓縮檔網址,下載然後安裝就可以了:
wget "https://pink-mist.github.io/sbotools/downloads/sbotools-2.7-noarch-1_SBo.tgz"
sudo installpkg ./sbotools-*-noarch-1_SBo.tgz- 然後就可以用sbotools的工具搜尋SlackBuilds的套件。例如安裝Librewolf瀏覽器:
sudo sbofind librewolf
sudo sboinstall librewolf- 如果真的有軟體找不到,就使用Flatpak吧。
8. 系統管理指令#
Slackware使用原始的Sysvinit,透過
/sbin/init程式來控制系統狀態與啟動服務,連service指令都沒有。所有系統服務都放在
/etc/rc.d/。電腦開機後第一個啟動的行程是/sbin/init,它會讀取/etc/inittab,判斷應該啟動的Runlevel,接著執行/etc/rc.d/下的指令稿來啟動服務。例如啟動sshd,就是看/etc/rc.d/rc.sshd這個指令稿裡面定義的函數來啟動:
sudo /etc/rc.d/rc.sshd start- 各種Runlevel的定義參照
/etc/inittab,裡面有各種Runlevel對應不同的路徑。例如跟隨X11啟動的程式應該是Runlevel 4,因此要在/etc/rc.d/rc.4這個檔案裡面,指定開機要啟動的顯示管理器。嘗試檢視該檔案內容,Slackware應該已經幫你寫好判斷邏輯了,它會嘗試依序搜尋系統有哪些顯示管理器的執行檔然後啟動。
cat /etc/rc.d/rc.4- 若要將系統服務加入到開機自動啟動,賦予執行權限。例如設定開機自動啟動sshd:
chmod +x /etc/rc.d/rc.sshd- 取消自動啟動,撤銷執行權限:
chmod -x /etc/rc.d/rc.sshd- 也可以在
/etc/rc.d/rc.local自定義開機要啟動的指令稿。
9. 安裝Nvidia顯卡驅動#
Intel和AMD的顯卡驅動含在Linux核心裡面,開機後udevd會自動載入DRM核心模組,通常不用裝。但是Nvidia顯卡需要安裝閉源驅動才能發揮最大效能。
目前沒有人給Slackware打包Nvidia閉源驅動,所以最好的方式是到Nvidia官網下載.run檔案,以DKMS方式編譯安裝。你可能需要手動補齊GCC依賴。
參見:Linux使用.run file安裝Nvidia閉源驅動與CUDA Toolkit
10. 中文化與輸入法#
Slackware 15應該已經預先安裝
noto-cjk-fonts-*字型,所以可以顯示漢字。編輯
/etc/locale.conf,設定語言為正體中文
echo "LANG=zh_TW.UTF-8 UTF-8" | sudo tee -a /etc/locale.conf- 編輯
/etc/environment,加入以下環境變數
LANG=zh_TW.UTF-8
LC_CTYPE=zh_TW.UTF-8
LC_NUMERIC=zh_TW.UTF-8
LC_TIME=zh_TW.UTF-8
LC_COLLATE=zh_TW.UTF-8
LC_MONETARY=zh_TW.UTF-8
LC_MESSAGES=zh_TW.UTF-8
LC_PAPER=zh_TW.UTF-8
LC_NAME=zh_TW.UTF-8
LC_ADDRESS=zh_TW.UTF-8
LC_TELEPHONE=zh_TW.UTF-8
LC_MEASUREMENT=zh_TW.UTF-8
LC_IDENTIFICATION=zh_TW.UTF-8
LC_ALL=KDE Plasma桌面可能要到Plasma Settings → Languages,手動選取語言為正體中文才會切換界面語言。
Slackware 15應該內建Fcitx5框架,但是是很久以前的版本,還叫做Fcitx。可能要手動把它的Desktop Entry加入到開機自動啟動:
mkdir -p ~/.config/autostart
cp /usr/share/applications/fcitx.desktop ~/.config/autostart/- 然後編輯
/etc/environment,設定使用Fcitx5框架的環境變數:
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=fcitx重開機,按CTRL+空白鍵應該就能喚醒輸入法了。
Slackware官方套件庫只有提供拼音(pinyin)、舊型的注音(libbopomofo)、依賴表格檔的輸入法,而且太舊了,不太好用。可以透過Slackbuilds安裝比較現代的新酷音(
fcitx5-chewing)或者小麥注音(fcitx5-mcbopomofo)。若是編譯失敗,考慮直接用Flatpak版本的Fcitx5。


