当前位置: 首页 > 科技观察

Linux桌面十年生存指南

时间:2023-03-17 15:20:34 科技观察

2006年转入Linux系统后,经过几年的实践,我的软件设置竟然在这十年里修好了。再过十年回顾过去,看看发生了什么,可能会很有趣。当我写这篇推文时,我快速回顾一下正在运行的东西:htop概述动机我的软件介绍不分先后:程序应该在本地系统上运行以便我可以控制它,这不包括云解决方案。程序应该在终端中运行,以便可以在任何地方一致地使用它们,包括功能较弱的计算机或手机。通过使用终端软件,可以实现键盘自动对焦。我宁愿只在有意义的地方使用鼠标,因为在打字过程中一直伸手去拿鼠标感觉很浪费时间。有时一个小时后我才注意到鼠标甚至没有插入。最好使用快速高效的软件,我不喜欢听到风扇声和房间变热的感觉。我还可以继续长时间运行旧硬件,10年前的Thinkpadx200s仍然支持我使用的软件。组合。我不想手动完成每个步骤,而是在需要时自动执行更多操作,这是shell自然支持的。十二年前操作系统离开Windows后,我在Linux上有了一个粗略的开始,只有GentooLinux安装光盘和印刷的手册来创建一个工作的Linux系统。虽然编译整理花了几天时间,但最终还是觉得受益匪浅。从那以后我就没有再切换回Windows,但是在持续的编译压力导致风扇出现故障后,我将计算机切换到了ArchLinux。之后我也将其他计算机和私人服务器切换到ArchLinux。作为滚动发布发行版,您可以随时升级软件包,但ArchLinux新闻详细介绍了这些漏洞中最重要的漏洞。然而,令人恼火的是,一旦你更新了旧的内核模块,ArchLinux就会删除旧版本的相关信息。我经常注意到,当我尝试插入U盘时,内核无法加载相关组件。相反,每次内核升级后都应该重新启动。有很多方法可以解决这个问题,但我还没有真正使用过它们。其他程序也会发生同样的情况,通常Firefox、cron或Samba在升级后需要重新启动,但令人恼火的是,它们不会警告您这种情况。我在工作中使用的SUSE很好地提醒了这一点。对于DDNet生产服务器,我更喜欢带有ArchLinux的Debian,因此每次升级失败的可能性较小。我使用OpenBSD作为我的防火墙和路由器,它有一个干净的系统、文档和一个很棒的pf防火墙,我现在不需要一个单独的路由器。窗口管理器一旦我开始使用Gentoo,我很快就注意到KDE的编译时间很长,这让我无法继续使用它。我四处寻找更简单的解决方案,最初使用的是Openbox和Fluxbox。有一次,为了能够进行更纯键盘的操作,我开始尝试改用平铺窗口管理器,一边研究它的初始版本,一边学习dwm和awesome。最终选择了xmonad,因为它具有灵活性、可扩展性,并且是用纯Haskell(一种优秀的函数式编程语言)编写和配置的。举个例子,我在家里运行一个40"的4K屏幕,但经常把它分成四个虚拟屏幕,每个屏幕显示一个工作区,每个屏幕自动排列在我的窗口之上。当然,xmonad有相应的模块。dzen和conky是对我来说是一个非常简单的状态栏。我的整体conky配置如下所示:%F%T}通过管道直接向dzen2输入命令:conky|dzen2-fn'-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*'-bg'#000000'-fg'#ffffff'-p-e''-x1000-w920-xs1-tar对我来说是一个重要的功能,就是在工作完成时让终端发出哔哔声。只需添加一个\a字符到zsh中的PR_TITLEBAR变量在工作完成时发出蜂鸣声。当然,我使用了命令:echo"blacklistpcspkr">/etc/modprobe.d/nobeep.conf将pcspkr内核模块列入黑名单以禁用实际的蜂鸣声。相反,urxvt的URxvt.urgentOnBell:true设置会使声音尖锐。之后xmonad有一个紧急挂钩来捕获此类信号,我可以使用组合键自动聚焦到发出紧急信号的当前窗口。在dzen中,我可以看到一个漂亮而明亮的#ff0000紧急窗口。我在笔记本电脑上得到的最终产品是:笔记本电脑截图听说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:\033]50;-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*\007URxvt.keysym.C-M-2:command:\033]50;-xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*\007URxvt.keysym.C-M-3:command:\033]50;-xos4-terminus-medium-r-normal-*-18-*-*-*-*-*-*-*\007URxvt.keysym.C-M-4:command:\033]50;-xos4-terminus-medium-r-normal-*-22-*-*-*-*-*-*-*\007URxvt.keysym.C-M-5:command:\033]50;-xos4-terminus-medium-r-normal-*-24-*-*-*-*-*-*-*\007URxvt.keysym.C-M-6:command:\033]50;-xos4-terminus-medium-r-normal-*-28-*-*-*-*-*-*-*\007URxvt.keysym.C-M-7:command:\033]50;-xos4-terminus-medium-r-normal-*-32-*-*-*-*-*-*-*\007URxvt.keysym.C-M-n:命令:\033]10;#ffffff\007\033]11;#000000\007\033]12;#ffffff\007\033]706;#00ffff\007\033]707;#ffff00\007URxvt.keysym.C-M-b:command:\033]10;#000000\007\033]11;#ffffff\007\033]12;#000000\007\033]706;#0000ff\007\033]707;#ff0000\007对于编程和写作,我使用Vim语法高亮和ctags进行索引,还有一些带有grep、sed和其他用于搜索和操作的常用终端窗口。这可能不像IDE那样舒适,但允许更多的自动化。Vim的一个问题是您习惯了它的键映射,因此想在任何地方使用它们。当shell不够强大时,Python和Nim是很好的脚本语言。系统监控htop(查看当前站点后台运行情况,是托管服务器的实时视图)非常适合快速了解软件当前运行状态。lm_sensors可以监控硬件温度、风扇和电压。powertop是Intel发布的一款优秀的省电小工具。ncdu可以交互分析磁盘使用情况。nmap、iptraf-ng、tcpdump、Wireshark都是分析网络问题的基本工具。当然,还有很多更好的工具。邮件和同步在我的家庭服务器上,我为我所有的电子邮件帐户运行fetchmail守护进程。fetchmail只是检索收到的邮件并调用procmail:#!/bin/shforiin/home/deen/.fetchmail/*;doFETCHMAILHOME=$i/usr/bin/fetchmail-m'procmail-d%T'-d60done配置非常简单,然后等待服务器通知我们有新邮件:pollimap.1und1.deprotocolimaptimeout120user"dennis@felsin9.de"password"XXX"foldersINBOXkeepsslidle我的.procmailrc配置包含一些备份所有邮件的规则,并在相应目录下对邮件进行排序。例如,基于邮件列表名称或邮件标题:MAILDIR=/home/deen/shared/MaildirLOGFILE=$HOME/.procmaillogLOGABSTRACT=noVERBOSE=offFORMAIL=/usr/bin/formailNL="":0wc*!?test-d/media/mailarchive/`date+%Y`|mkdir-p/media/mailarchive/`date+%Y`#MakebackupsofallmailreceivedinformatYYYY/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发邮件,配置也很好:accountdefaulthostsmtp.1und1.detlsontls_trust_file/etc/ssl/certs/ca-certificates.crtauthonfromdennis@felsin9.deuserdennis@felsin9.depasswordXXX[…]但到目前为止,邮件仍在服务器上。我的文档都存储在一个目录中,我使用Unison在所有计算机之间进行同步。Unison可以看作是双向交互式rsync,我的电子邮件是这个文件目录的一部分,所以它们最终存储在我的电脑上。这也意味着虽然邮件立即到达我的邮箱,但我只是在需要时才收到,而不是邮件一到就被通知。从那时起,我就使用mutt来阅读我的电子邮件,并使用侧边栏来显示我的电子邮件目录。/etc/mailcap文件对于显示非纯文本邮件(HTML、Word或PDF)是必不可少的:text/html;w3m-I%{charset}-Ttext/html;copiousoutputapplication/msword;antiword%s;copiousoutputapplication/pdf;pdftotext-layout/dev/stdin-;copiousoutputNews&NewsletterNewsboat是一个很棒的终端RSS/Atom阅读器。我在大约有150个提要的tach会话服务器上运行它。Feeds也可以在本地选择,例如:ignore-article"https://forum.ddnet.tw/feed.php""title=~\"MapTesting?\"ortitle=~\"Oldmaps?\"ortitle=~\"MapBugs?\"ortitle=~\"Archive?\"ortitle=~\"Waitingformapper?\"ortitle=~\"Othermods?\"ortitle=~\"Fixes?\""我以同样的方式使用了IrssiIRC通信。calendarreminder是可以从命令行获取的日历。可以通过编辑rem文件来设置新的提醒:#OnetimeeventsREM2019-01-20+90FlighttoChina%b#RecurringHolidaysREM1May+90Holiday"TagderArbeit"%bREM[trigger(easterdate(year(today()))-2)]+90Holiday"Karfreitag"%b#TimeChangeREMNovSunday1--7+90TimeChange(03:00->02:00)%bREMAprSunday1--7+90TimeChange(02:00->03:00)%b#BirthdaysFSETbirthday(x)"'s"+ord(年(trigdate())-x)+"生日是%b"REM16Apr+90MSGAndreas[生日(1994)]#SunSET$LatDeg49SET$LatMin19SET$LatSec49SET$LongDeg-8SET$LongMin-40SET$LongSec-24MSGSunfrom[日出(trigdate())]to[sunset(trigdate())][...]遗憾的是,提醒中没有中国农历提醒功能,所以中国的节日不好计算。我给了提醒两个名字:rem-m-b1-q-g按时间顺序查看待办事项列表rem-m-b1-q-cuc12-w$(($(tputcols)+1))|sed-e"s/\f//g"|less显示适合终端宽度的日历:remcal字典rdictcc是一个鲜为人知的字典工具,它使用dict.cc的很棒的字典并将它们转储到本地数据库中:$rdicctccrasch=====================[A=>B]======================rasch:-apace-brisk[speedy]-cursory-inatimelymanner-quick-quickly-rapid-rapidly-sharpish[Br.][coll.]-speedily-speedy-swift-swiftlyrasch[gehen]:-smartly[quickly]Rasch{n}[Zittergras-Segge]]:-Alpinegrass[Carexbrizoides]-quakinggrasssedge[Carexbrizoides]Rasch{m}[区域][Putzrasch]:-scouringpad======================[B=>A]=====================Raschmodel:-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}{DennisFelsing}\setkomavar{fromaddress}{MeineStr.1\\69181Leimen}\setkomavar{subject}{Titel}\setkomavar*{enclseparator}{Anlagen}\makeatletter\@setplength{refvpos}{89mm}\makeatother\begin{document}\begin{letter}{HerrSoundso\\DeineStr.2\\69121Heidelberg}\opening{SehrgeehrterHerrSoundso,}SiehabenbeimirseitdemBlaBlaBla。{letter}\end{document}更多示例文档和演示文稿可以在我的私人网站上找到。Zathura可以快速读取PDF文件,支持类似Vim的控件,并支持两种不同的PDF后端:Poppler和MuPDF。另一方面,在处理Zathura无法打开的临时文件时,Evince更加灵活。图片编辑的简单选择是分别用于照片编辑和交互式矢量图形的GIMP和Inkscape。有时Imagemagick足够好,可以直接从命令行使用它来自动编辑图片。Graphviz和TikZ也可用于绘制图形和其他图表。Web浏览器对于Web浏览器,我一直使用Firefox。与Chrome相比,它的扩展性更好并且使用的资源更少。不幸的是,在Firefox完全切换到Chrome风格的扩展后,Pentadactyl扩展的开发停止了,所以我的浏览器中不再有令人满意的类似Vim的控件。通过在mediaplayer中设置vo=gpu和hwdec=vaapi,具有硬解码功能的mpv在播放过程中会保持5%的CPU使用率。mpv中的audio-channels=2似乎为我的立体声扬声器/耳机提供了比默认PulseAudio更清晰的缩混。一个不错的小功能是使用Shift-Q退出,而不仅仅是Q来保存播放位置。当观看母语为另一种语言的视频时,您可以使用--secondary-sid=同时显示两个字幕,主字幕在屏幕底部,副字幕在屏幕顶部。我的无线鼠标可以通过一个小的配置文件(~/.config/mpv/input.conf)远程控制mpv:MOUSE_BTN5run"mixer""pcm""-2"MOUSE_BTN6run"mixer""pcm""+2"MOUSE_BTN1cyclesub-visibilityMOUSE_BTN7addchapter-1MOUSE_BTN8addchapter1youtube-dl非常适合观看在线托管的视频,使用-fbestvideo+bestaudio/best--all-subs--embed-subs命令以获得最高质量的视频。作为一个音乐播放器,MOC不再积极开发,但它仍然是一个简单的播放器,可以播放所有可能的格式,包括最不常用的Chiptune格式。AUR中有一个补丁添加了PulseAudio支持。即使当CPU时钟频率降至800MHz时,MOC也仅使用单核CPU的1-2%。moc我的音乐收藏保存在我的家庭服务器上,所以我可以从任何地方访问它。它使用SSHFS挂载并自动挂载在/etc/fstab/目录中:root@server:/media/media/mnt/mediafuse.sshfsnoauto,x-systemd.automount,idmap=user,IdentityFile=/root/.ssh/id_rsa,allow_other,reconnect00跨平台构建它非常适合为除Linux本身之外的任何主要操作系统构建包!最初,我使用QEMU与旧版Debian、Windows和MacOSXVM一起构建这些平台。现在我已经切换到在旧的Debian发行版上使用chroot(为了最大的Linux兼容性),在Windows上使用MinGW进行交叉编译,在MacOSX上使用OSXCross进行交叉编译。用于构建DDNet的脚本以及更新指令的脚本建立图书馆都是基于此。备份通常,我们都忘记了备份。尽管这是最后一节,但它不应该是事后才想到的。十年前,我编写了rrb(ReversersyncBackup),它重新包装了rsync,所以我只需要将备份服务器根SSH权限授予正在备份的机器。令人惊讶的是,即使我一直在使用rrb,它在过去十年中也没有改变。备份文件直接存储在文件系统中。使用硬链接(--link-dest)实施增量备份。一个简单的配置定义了备份保存时间,默认是:KEEP_RULES=(\77\#Onebackupadayforthelast7days318\#8morebackupsforthelastmonth36511\#11morebackupsforthelastyear18254\#4morebackupsforthelast5years)因为我的一些电脑没有静态IP/DNS但仍然想使用rrb备份,然后我将使用反向安全隧道(作为systemd服务):[Unit]Description=ReverseSSHTunnelAfter=network.target[Service]ExecStart=/usr/bin/ssh-N-R27276:localhost:22-o"ExitOnForwardFailureyes"serverKillMode=processRestart=always[Install]WantedBy=multi-user.target现在,当隧道备份时,可以通过ssh-p27276localhost或使用.ssh/config访问服务器。Hostcr-remoteHostNamelocalhostPort27276当谈到SSH技巧时,有时由于一些损坏的路由很难到达服务器。在这种情况下,您可以通过其他服务器进行SSH以获得更好的路由。在这种情况下,您也许可以通过美国连接访问我的中文服务器,而来自德国的不可靠连接可能需要数周时间:Hostchn.ddnet.twProxyCommandssh-qusa.ddnet.twnc-q0chn.ddnet.tw22Port22EpilogueThanksReadaboutmy工具的集合。在此,我可能漏掉了很多日常生活中自然习惯的步骤。让我们看看明年我的软件设置有多稳定。