Linux中國

十年 Linux 桌面生存指南

從 2006 年開始轉戰 Linux 系統後,經過幾年的實踐,我的軟體設置在過去十年內出人意料的固定。再過十年回顧一下,看看發生了什麼,也許會非常有趣。在寫這篇推文時,我迅速回顧了正在運行的內容:

htop overview

動機

我的軟體介紹排序不分先後:

  • 程序應該運行在本地系統中以便我可以控制它,這其中並不包括雲解決方案。
  • 程序應在終端中運行,以便於在任何地方連貫地使用它們,包括性能稍差的電腦或手機。
  • 通過使用終端軟體,可以實現自動聚焦鍵盤。只有在一些有意義的地方,我會更喜歡使用滑鼠,因為在打字期間一直伸手去拿滑鼠感覺像在浪費時間。有時候過了一個小時我才注意到甚至還沒有插滑鼠。
  • 最好使用快速高效的軟體,我不喜歡聽到風扇的聲音和感到房間在變熱。我還可以繼續長久地運行舊硬體,已經使用了 10 年的 Thinkpad x200s 還能很好地支持我所使用的軟體。
  • 組合。我不想手動執行每個步驟,而是在需要時自動執行更多操作,這時自然是支持 shell。

操作系統

十二年前移除 Windows 系統後,我在 Linux 系統上經歷了一個艱難的開始,當時我手上只有 Gentoo Linux 系統的安裝光碟和一本列印的說明書,要用它們來實現一個可運行的 Linux 系統。雖然花費了幾天的時間去編譯和修整,但最終還是覺得自己受益頗多。

自此我再也沒有轉回 Windows 系統,但在持續的編譯壓力導致風扇失靈後,我將我的電腦系統切換到 Arch Linux。之後我將其他的電腦和私人伺服器也切換到了 Arch Linux。作為一個滾動發布發行版,你可以隨時升級軟體包,但 Arch Linux News 已經詳細報道了其中最主要的漏洞。

不過,令人煩惱的是一旦你更新了舊的內核模組,Arch Linux 就會移除舊版的相關信息。我經常注意到一旦我試著插入一個 USB 快閃記憶體盤,內核就無法載入相關組件。相反,每次內核升級後都應該進行重啟。有一些 方法 可以解決這個問題,但我還沒有實際地使用它們。

其他程序也會出現類似的情況,通常 Firefox 、 cron 或者 Samba 在升級後都需要重啟,但惱人的是,它們沒有警告你存在這種情況。我在工作中使用的 SUSE 很好地提醒了這種情況。

對於 DDNet 產品伺服器,相較於 Arch Linux ,我更傾向於 Debian 系統,這樣在每次升級時出現故障的幾率更低。我的防火牆和路由器使用了 OpenBSD ,它擁有乾淨系統、文檔和強大的 pf 防火牆,而我現在不需要一個單獨的路由器。

窗口管理器

從我開始使用 Gentoo 後,我很快注意到 KDE 的編譯時間非常長,這讓我沒辦法繼續使用它。我四處尋找更簡單的解決方案,最初使用了 OpenboxFluxbox。某次,為了能更多進行純鍵盤操作,我開始嘗試轉入平鋪窗口管理器,並在研究其初始版本的時候學習了 dwmawesome

最終,由於 xmonad的靈活性、可擴展性以及使用純 Haskell(一種出色的函數編程語言)編寫和配置,最終選擇了它。一個例子是,我在家中運行一個 40" 4K 的屏幕,但經常會將它分為四個虛擬屏幕,每個虛擬屏幕顯示一個工作區,每個工作區自動排列在我的窗口上。當然, xmonad 有一個對應的 模塊

dzenconky 對我來說是一個非常簡單的狀態欄。我的整體 conky 配置看起來是這樣的:

out_to_console yes
update_interval 1
total_run_times 0

TEXT
${downspeed eth0} ${upspeed eth0} | $cpu% ${loadavg 1} ${loadavg 2} ${loadavg 3} $mem/$memmax | ${time %F %T}

輸入命令直接通過管道輸入 dzen2:

conky | dzen2 -fn '-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*' -bg '#000000' -fg '#ffffff' -p -e '' -x 1000 -w 920 -xs 1 -ta r

對我而言,一項重要功能是在完成工作後使終端發出蜂鳴聲。只需要簡單地在 zsh 中的 PR_TITLEBAR 變數中添加一個 a 字元就可以做到,只要工作完成就可以發出蜂鳴聲。當然,我使用了命令:

echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf

pcspkr 內核模塊列入黑名單來禁用實際的蜂鳴聲。相反 urxvt 的 URxvt.urgentOnBell: true 設置會將聲音變為尖銳。之後 xmonad 有一個 urgency 鉤子來捕捉這類信號,並且我可以使用組合鍵自動聚焦到當前的發出緊急信號的窗口。在 dzen 中我可以看到一個漂亮且明亮的 #ff0000 緊急窗口。

在我筆記本上所得到的最終成品是:

Laptop screenshot

我聽說前幾年 i3 變得非常流行,但它要求更多的手動窗口對齊而不是自動對齊。

我意識到也有像 tmux 那樣的終端多路復用器,但我仍想要一些圖形化應用程序,因此最終我沒有有效地使用它們。

終端連續性

為了使終端保持活躍狀態,我使用了 dtach ,它只是模擬屏幕分離功能。為了使計算機上的每個終端都可連接和斷開,我編寫了一個小的封裝腳本。 這意味著,即使必須重新啟動 X 伺服器,我也可以使所有終端都運行良好,包括本地和遠程終端。

Shell & 編程

對於 shell,我使用 zsh 而不是 bash,因為它有眾多的功能。

作為終端模擬,我發現 urxvt 足夠輕巧,支持 Unicode 編碼和 256 色,具有出色的性能。另一個重要的功能是可以分別運行 urxvt 客戶端和守護進程。因此,即使大量終端也幾乎不佔用任何內存(回滾緩衝區除外)。

對我而言,只有一種字體看起來絕對乾淨和完美: Terminus。 由於它是點陣圖字體,因此所有內容都是完美像素,渲染速度極快且 CPU 使用率低。為了能使用 CTRL-WIN-[1-7] 在每個終端按需切換字體,我的 ~/.Xdefaults 包含:

URxvt.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*
dzen2.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*

URxvt.keysym.C-M-1: command:33]50;-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*07
URxvt.keysym.C-M-2: command:33]50;-xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*07
URxvt.keysym.C-M-3: command:33]50;-xos4-terminus-medium-r-normal-*-18-*-*-*-*-*-*-*07
URxvt.keysym.C-M-4: command:33]50;-xos4-terminus-medium-r-normal-*-22-*-*-*-*-*-*-*07
URxvt.keysym.C-M-5: command:33]50;-xos4-terminus-medium-r-normal-*-24-*-*-*-*-*-*-*07
URxvt.keysym.C-M-6: command:33]50;-xos4-terminus-medium-r-normal-*-28-*-*-*-*-*-*-*07
URxvt.keysym.C-M-7: command:33]50;-xos4-terminus-medium-r-normal-*-32-*-*-*-*-*-*-*07

URxvt.keysym.C-M-n: command:33]10;#ffffff0733]11;#0000000733]12;#ffffff0733]706;#00ffff0733]707;#ffff0007
URxvt.keysym.C-M-b: command:33]10;#0000000733]11;#ffffff0733]12;#0000000733]706;#0000ff0733]707;#ff000007

對於編程和書寫,我使用 Vim 語法高亮顯示和 ctags 進行索引,以及一些帶有 grepsed 和其他用於搜索和操作的常用終端窗口。這可能不像 IDE 那樣舒適,但可以實現更多的自動化。

Vim 的一個問題是你已經習慣了它的鍵映射,因此希望在任何地方都使用它們。

在 shell 功能不夠強大時,PythonNim 作為腳本語言也不錯。

系統監控

htop (查看當前站點的後台運行,是託管伺服器的實時視圖)非常適合快速了解軟體的當前運行狀態。 lm_sensors 可以監控硬體溫度、風扇和電壓。 powertop 是一款由 Intel 發布的優秀省電小工具。 ncdu 可以互動式分析磁碟使用情況。

nmap、 iptraf-ng、 tcpdumpWireshark 都是分析網路問題的基本工具。

當然還有很多更優秀的工具。

郵件 & 同步

在我的家庭伺服器上,我為自己所有的郵箱賬號運行了 fetchmail 守護進程。fetchmail 只是檢索收到的郵件並調用 procmail

#!/bin/sh
for i in /home/deen/.fetchmail/*; do
 FETCHMAILHOME=$i /usr/bin/fetchmail -m 'procmail -d %T' -d 60
done

配置非常簡單,然後等待伺服器通知我們有新的郵件:

poll imap.1und1.de protocol imap timeout 120 user "dennis@felsin9.de" password "XXX" folders INBOX keep ssl idle

我的 .procmailrc 配置包含一些備份全部郵件的規則,並將郵件整理在對應的目錄下面。例如,基於郵件列表名或者郵件標題:

MAILDIR=/home/deen/shared/Maildir
LOGFILE=$HOME/.procmaillog
LOGABSTRACT=no
VERBOSE=off
FORMAIL=/usr/bin/formail
NL="
"

:0wc
* ! ? test -d /media/mailarchive/`date +%Y`
| mkdir -p /media/mailarchive/`date +%Y`

# Make backups of all mail received in format YYYY/YYYY-MM
:0c
/media/mailarchive/`date +%Y`/`date +%Y-%m`

:0
* ^From: .*(.*@.*.kit.edu|.*@.*.uka.de|.*@.*.uni-karlsruhe.de)
$MAILDIR/.uni/

:0
* ^list-Id:.*lists.kit.edu
$MAILDIR/.uni-ml/

[...]

我使用 msmtp 來發送郵件,它也很好配置:

account default
host smtp.1und1.de
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
auth on
from dennis@felsin9.de
user dennis@felsin9.de
password XXX

[...]

但是到目前為止,郵件還在伺服器上。 我的文檔全部存儲在一個目錄中,我使用 Unison 在所有計算機之間進行同步。Unison 可以視為雙向互動式 rsync,我的郵件是這個文件目錄下的一部分,因此它們最終存儲在我的電腦上。

這也意味著,儘管郵件會立即到達我的郵箱,但我只是按需拿取,而不是郵件一到達時就立即收到通知。

從此我使用 mutt 閱讀郵件,使用側邊欄顯示我的郵件目錄。 /etc/mailcap 文件對於顯示非純文本郵件( HTML, Word 或者 PDF)不可或缺:

text/html;w3m -I %{charset} -T text/html; copiousoutput
application/msword; antiword %s; copiousoutput
application/pdf; pdftotext -layout /dev/stdin -; copiousoutput

新聞 & 通訊

Newsboat 是一個非常棒的終端 RSS/Atom 閱讀器。我在一個有約 150 個提要的 tach 會話伺服器上運行它。也可以在本地選擇提要,例如:

ignore-article "https://forum.ddnet.tw/feed.php" "title =~ "Map Testing •" or title =~ "Old maps •" or title =~ "Map Bugs •" or title =~ "Archive •" or title =~ "Waiting for mapper •" or title =~ "Other mods •" or title =~ "Fixes •""

我以同樣的方式使用 Irssi 進行 IRC 通訊。

日曆

remind 是一個可以從命令行獲取的日曆。通過編輯 rem 文件可以設置新的提醒:

# One time events
REM 2019-01-20 +90 Flight to China %b

# Recurring Holidays
REM 1 May +90 Holiday "Tag der Arbeit" %b
REM [trigger(easterdate(year(today()))-2)] +90 Holiday "Karfreitag" %b

# Time Change
REM Nov Sunday 1 --7 +90 Time Change (03:00 -> 02:00) %b
REM Apr Sunday 1 --7 +90 Time Change (02:00 -> 03:00) %b

# Birthdays
FSET birthday(x) "'s " + ord(year(trigdate())-x) + " birthday is %b"
REM 16 Apr +90 MSG Andreas[birthday(1994)]

# Sun
SET $LatDeg 49
SET $LatMin 19
SET $LatSec 49
SET $LongDeg -8
SET $LongMin -40
SET $LongSec -24

MSG Sun from [sunrise(trigdate())] to [sunset(trigdate())]
[...]

遺憾的是,目前 remind 中還沒有中國農曆的提醒功能,因此中國的節日不易計算。

我給提醒設置了兩個名字:

rem -m -b1 -q -g

按時間順序查看待辦事項清單

rem -m -b1 -q -cuc12 -w$(($(tput cols)+1)) | sed -e "s/f//g" | less

顯示適應終端寬度的日曆:

remcal

字典

rdictcc 是鮮為人知的字典工具,它可以使用 dict.cc 很棒的詞典並將他們轉存在本地資料庫中:

$ rdictcc rasch
====================[ A => B ]====================
rasch:
 - apace
 - brisk [speedy]
 - cursory
 - in a timely manner
 - quick
 - quickly
 - rapid
 - rapidly
 - sharpish [Br.] [coll.]
 - speedily
 - speedy
 - swift
 - swiftly
rasch [gehen]:
 - smartly [quickly]
Rasch {n} [Zittergras-Segge]:
 - Alpine grass [Carex brizoides]
 - quaking grass sedge [Carex brizoides]
Rasch {m} [regional] [Putzrasch]:
 - scouring pad
====================[ B => A ]====================
Rasch model:
 - Rasch-Modell {n}

記錄和閱讀

我有一個簡單記錄任務的備忘錄,在 Vim 會話中基本上一直處於打開狀態。我也使用備忘錄作為工作中「已完成」工作的記錄,這樣就可以檢查自己每天完成了哪些任務。

對於寫文件、信件和演示文稿,我會使用 LaTeX 進行高級排版。德式的簡單信件可以這樣設置,例如:

documentclass[paper = a4, fromalign = right]{scrlttr2}
usepackage{german}
usepackage{eurosym}
usepackage[utf8]{inputenc}
setlength{parskip}{6pt}
setlength{parindent}{0pt}

setkomavar{fromname}{Dennis Felsing}
setkomavar{fromaddress}{Meine Str. 1\69181 Leimen}
setkomavar{subject}{Titel}

setkomavar*{enclseparator}{Anlagen}

makeatletter
@setplength{refvpos}{89mm}
makeatother

begin{document}
begin{letter} {Herr Soundso\Deine Str. 2\69121 Heidelberg}
opening{Sehr geehrter Herr Soundso,}

Sie haben bei mir seit dem Bla Bla Bla.

Ich fordere Sie hiermit zu Bla Bla Bla auf.

closing{Mit freundlichen Grüßen}

end{letter}
end{document}

我的私人網站 上可以找到更多的示例文檔和演示文稿。

Zathura 讀取 PDF 文件速度很快,支持 Vim 類控制項,還支持兩種不同的 PDF 後端: Poppler 和 MuPDF。另一方面,在偶爾遇到 Zathura 無法打開的文件時,Evince 則顯得更全能一些。

圖片編輯

簡便的選擇是,GIMPInkscape 分別用於照片編輯和互動式向量圖形。

有時 Imagemagick 已經足夠好了,它可以從命令行直接使用,從而自動編輯圖片。同樣 GraphvizTikZ 可以用來繪製曲線圖和其他圖表。

Web 瀏覽器

對於 Web 瀏覽器,我一直在使用 Firefox。相較於 Chrome,它的可擴展性更好,資源使用率更低。

不幸的是,在 Firefox 完全改用 Chrome 風格的擴展之後, Pentadactyl 擴展的開發就停止了,所以我的瀏覽器中再也沒有令人滿意的 Vim 類控制項了。

媒體播放器

通過設置 vo=gpu 以及 hwdec=vaapi,具有硬體解碼功能的 mpv 在播放期間 CPU 的佔用率保持在 5%。相較於默認的 PulseAudio,mpv 中的 audio-channels=2 似乎可以使我的立體揚聲器/耳機獲得更清晰的降級混頻。一個很棒的小功能是用 Shift-Q 退出,而不是只用 Q 來保存回放位置。當你與母語是其他語言的人一起看視頻時,你可以使用 --secondary-sid= 同時顯示兩種字幕,主字幕位於底部,次字幕位於屏幕頂部。

我的無線滑鼠可以簡單地通過一個小的配置文件( ~/.config/mpv/input.conf )實現遠程控制 mpv :

MOUSE_BTN5 run "mixer" "pcm" "-2"
MOUSE_BTN6 run "mixer" "pcm" "+2"
MOUSE_BTN1 cycle sub-visibility
MOUSE_BTN7 add chapter -1
MOUSE_BTN8 add chapter 1

youtube-dl 非常適合觀看在線託管的視頻,使用 -f bestvideo+bestaudio/best --all-subs --embed-subs 命令可獲得最高質量的視頻。

作為音樂播放器, MOC 不再活躍開發,但它仍是一個簡易的播放器,可以播放各種可能的格式,包括最不常用的 Chiptune 格式。在 AUR 中有一個 補丁 增加了 PulseAudio 支持。即使在 CPU 時鐘頻率降到 800 MHz, MOC 也只使用了單核 CPU 的 1-2% 。

moc

我的音樂收藏夾保存在我的家庭伺服器上,因此我可以從任何地方訪問它。它使用 SSHFS 掛載並自動安裝在 /etc/fstab/ 目錄下:

root@server:/media/media /mnt/media fuse.sshfs noauto,x-systemd.automount,idmap=user,IdentityFile=/root/.ssh/id_rsa,allow_other,reconnect 0 0

跨平台構建

除了 Linux 本身,它對於構建任何主流操作系統的軟體包都很優秀! 一開始,我使用 QEMU 與舊版 Debian、 Windows 以及 Mac OS X VM 一起構建這些平台。

現在我在舊版 Debian 發行版上轉而使用 chroot (以獲得最大的 Linux 兼容性),在 Windows 上使用 MinGW 進行交叉編譯,在 Mac OS X 上則使用 OSXCross

用於 構建 DDNet 的腳本以及 更新庫構建的說明 的腳本都基於這個。

備份

通常,我們都會忘記備份。即使這是最後一節,它也不應該成為事後諸葛。

十年前我寫了 rrb (反向 rsync 備份)重新封裝了 rsync ,因此我只需要將備份伺服器的 root SSH 許可權授予正在備份的計算機。令人驚訝地是,儘管我一直在使用 rrb ,但它在過去十年里沒有任何改變。

備份文件直接存儲在文件系統中。使用硬鏈接實現增量備份(--link-dest)。一個簡單的 配置 定義了備份保存時間,默認為:

KEEP_RULES=( 
   7  7  # One backup a day for the last 7 days
  31  8  # 8 more backups for the last month
 365 11  # 11 more backups for the last year
1825  4  # 4 more backups for the last 5 years
)

因為我的一些計算機沒有靜態 IP / DNS 但仍想使用 rrb 備份,那我會使用反向安全隧道(作為 systemd 服務):

[Unit]
Description=Reverse SSH Tunnel
After=network.target

[Service]
ExecStart=/usr/bin/ssh -N -R 27276:localhost:22 -o "ExitOnForwardFailure yes" server
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

現在,隧道運行備份時,伺服器可以通過 ssh -p 27276 localhost 命令或者使用 .ssh/config 到達伺服器端。

Host cr-remote
 HostName localhost
 Port 27276

在談及 SSH 技巧時,有時由於某些中斷的路由會很難訪問到伺服器。在那種情況下你可以借道其他伺服器的 SSH 連接,以獲得更好的路由。在這種情況下,你可能通過美國連接訪問到我的中國伺服器,而來自德國的不可靠連接可能需要幾個周:

Host chn.ddnet.tw
 ProxyCommand ssh -q usa.ddnet.tw nc -q0 chn.ddnet.tw 22
 Port 22

結語

感謝閱讀我工具的收藏。這其中我也許遺漏了許多日常中自然成習慣的步驟。讓我們來看看我的軟體設置在下一年裡能多穩定吧。如果你有任何問題,隨時聯繫我 dennis@felsin9.de

Hacker News 下評論吧。

via: https://hookrace.net/blog/linux-desktop-setup/

作者:Dennis Felsing 選題:lujun9972 譯者:chenmu-kk 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國