请不要丢弃你的旧电脑。让我们跳过填埋场，利用 Linux 为它注入新的活力。我的两位孙子，Mint 和 Kasen，请求我帮助他们搭建游戏电脑。他们的请求让我感到非常欣喜。这不仅给了我一个与他们共度时光的美好机会，也让我能够帮助他们了解科技。同时，我能深入探讨电脑对环境产生的影响。等一下！这似乎有些离题，对吧？其实并非如此，本文就是为了阐述这个问题。旧电脑的命运是什么？关于旧电脑的处理（以及处理的原因）是我们讨论的核心。首先，普通电脑通常在提供服务五年左右后被替换。理由何在？我在一个名为《CHRON》的面向小企业的刊物的在线文章中找到 这样一篇文章，电脑的寿命被建议在三至五年。这个建议的部分原因是，假定电脑在生命周期的这个阶段开始变慢。这篇文章，以及其他的一些文章，都在鼓励人们在大约同样的时间段内更换更新、速度更快的电脑。当然，这些压力主要来源于电脑和芯片的厂商，他们想要保持收入的增长。再者，美国国税局也通过规定电脑所能完全折旧的时间是五年，以此间接强化了这个服务寿命的观念。我们首先来讨论一下关于电脑会变慢的迷思。电脑实际上是不会变慢的，恒定的时钟速度一直在运作。无论是 2.8GHz 还是 4.5GHz，当电脑忙碌时，它们总是以那个速度运行。当然，当电脑闲置或事情不多时，将会有意识地降低它的时钟速度以节省电力。电脑变慢并不是因为它们变老了。装有 Windows 系统的电脑在使用过程中，会积累大量的恶意软件、间谍软件、广告软件和恐吓软件。这些垃圾软件拖慢了电脑的运行。电脑用户逐渐认为这是正常的，安于电脑性能下降的境况。Linux 驰骋救援作为朋友和熟人心目中的电脑专家，人们有时会将他们不再需要的旧电脑送给我。他们认为电脑运行速度慢，因此选择交给我，并让我在将它们带到我家附近几个街区的电子设备回收中心之前清除硬盘数据。我总是建议他们，那些三到五年的老电脑其实仍然可用，但他们似乎更倾向于花费金钱换新，而非学习一个新的操作系统。我已经收到过几台他人赠送的旧电脑。其中一个十分特别的是一台 Dell Optiplex 755，它配备了一个 2.33 GHz 的 Core 2 Duo 处理器以及 8GB 的 RAM。它的 BIOS 日期为 2010 年，所以现在大约应有 12 岁。这是我拥有的最老的电脑，我总是让它忙个不停。我已经使用它好几年了，且它从未变慢，这是因为我在它上面运行的是 Linux —— 如今是 Fedora 35。如果你认为那是例外，那么我给你更多例子。十年前的 2012 年，我为自己组装了三台电脑，然后在它们所有上安装了 Fedora。至今，它们还在顺利运行，速度一如往昔。这里没有例外，只有 Linux 系统在旧电脑上的正常运作。使用 Linux 至少可以将电脑的使用寿命延长一倍，同时不需要任何额外花费。这就使得这些电脑在进入垃圾填埋场（最差情况）或回收中心（最好情况）之前，可以额外使用五到七年或更久。只要我能找到这些电脑的替换零件，就可以使它们继续运行，远离任何垃圾处理或回收途径。有些电脑的问题在于找到合适的零部件。非标准硬件让我们讨论一下非标准硬件，以及你能在一些知名公司买到的电脑。正如我之前提到的，我有一台旧电脑是 Dell 的。Dell 是一家历史悠久的企业。尽管我不会购买 Dell 的台式机或塔式电脑，但是我会接受捐赠或者作为礼物赠予的 Dell 电脑。我可以在这些旧电脑上安装 Linux，去除 Windows，让它们重新发挥作用。它们在我的家庭实验室里作为测试计算机使用，等等。然而，Dell 使用了一些你无法轻松替换的非标准零部件。当你能找到零部件（如电源和主板）时，它们并不便宜。原因在于，这些制造商设计了搭载非标准电源和主板的系统，只适配他们自家的非标准机箱。这是一种保持收入增长的策略。如果你在市场上找不到这些零部件，你就得去原厂买，并且价格通常非常高。举例来说，我拥有的那台 Dell Optiplex 就使用了不符合通用标准的主板、机箱和电源。换句话说，Dell 的主板或电源可能无法适配我在当地电脑店或亚马逊上购买的标准机箱。这些部件也不适合我孙子们会使用的游戏机箱。主板和电源的安装孔不会与标准机箱对齐。电源适配器不符合标准机箱中可用的空间。而主板上的 PCI 插槽和后板接口在标准机箱中的位置会不对，电源的连接器也与标准主板上的不匹配。最后，那些非标准部件中的一个或多个终究会出现故障，你可能完全找不到替代品，或者至少找不到价格合理的替代品。在这种情况下，处理旧电脑并采购新电脑就变得合情合理了。标准件组装让我们探讨一下使用标准化部件进行电脑组装，以及它们的长寿耐用如何适用于我正在帮助孙子们制造的游戏电脑。大部分主板采用的设计是标准化的，包括微型 ATX、ATX，以及扩展版的 ATX。这些主板在规定的位置上设置了安装孔。许多孔位是重叠的，也就是说 ATX 主板上的孔位会和扩展版 ATX 主板的许多孔位对齐。这就意味着你可以在任何预钻了用于标准主板孔位的机箱中安装这些主板。这些主板都有标准的电源连接器，这意味着你可以配套使用任何标准电源。在他们生日那天，我两个孙子都送给了一款有标准主板安装孔位的游戏电脑机箱。这些孔位的螺纹是标准的，因此他们可以使用任何主板配套提供的黄铜支架螺丝在这些主板安装孔位中。支架螺丝锁定入主板，并且自身设有适配标准主板锁定螺丝的标准螺纹孔。这一切的结果就是他们可以在任何标准电脑机箱内，使用标准固定件和标准电源，安装任何标准主板。需要注意的是，内存、处理器以及插卡设备都是标准化的，但是它们需要和主板兼容。所以旧款主板配套的内存可能已经买不到了。在这种情况下，你需要新的主板、内存和处理器。然而，电脑的其他部分仍然可以完好使用。如我所告诉 Mint 和 Kasen 的那样，用全套标准部件组装（或购买）电脑就意味着你永远不需要买新电脑。我送给他们的这款优质机箱永远不必更换。随着时间的推移，可能有一些部件会出故障，但他们只需要换掉那些有缺陷的部件。这样一来，通过不断更新换代的标准部件，这些电脑将能经久耐用，且维护成本极低。如果有一个部件出故障，只需更换这一个部件，然后将故障部件回收。这也极大地减少了你需要回收或者填入垃圾场的材料总量。回收旧电脑配件我很幸运，生活在一个提供路边回收服务的地方。这个服务虽然不包含电子设备，但周围的多个地方都可以接受电子设备回收，我便住在其中一个地方附近。我已经把很多旧的、不能使用的电子设备送去回收，包括出了故障的电脑配件，但我从未送过整机。我会将这些出了故障的部件分类，用旧的纸箱存起来。按类别分类——一箱是电子设备，另一箱是金属，第三箱是电池，等等。这些箱子的内容与回收中心的分类相对应。等到一两个箱子满了，我就会送去回收。结语即使在为这篇文章和我之前的自我教育做了大量的研究，仍难以确定回收的电脑和电脑配件最终会去哪里。我所在附近的回收中心的网站指出，每种回收物料的运用都会依据它的经济价值来决定。电脑含有大量有价值的金属和稀土元素，因此总会被回收。而这种回收是否以一种健康、环保的方式进行，这就是另一个话题了。到现在为止，我还无法追踪到送去回收的电子设备最后都去了哪里。我决定让自己尽自己的一份力，同时也要尽量保证回收链的其他环节也要设置得当，高效运行。为了地球，我们最好让电脑尽可能长地运行。只更换故障的部件，能让一台电脑比目前承认的寿命还要运行得更久，这显著减少了我们需要填埋或回收的电子垃圾量。当然，还要使用 Linux，这样你的电脑就不会变慢了。（题图：MJ/7ac9becc-f966-49f4-86a9-29fb41a5fd38）via: https://opensource.com/article/22/4/how-linux-saves-earth作者：David Both 选题：lkxed 译者：ChatGPT 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux 上的 dict 命令对作家来说非常有用，可以为他们的选词提供大量的字典和同义词。作为一个作家，我经常需要确定单词的正确拼写或定义。我还需要使用词库来寻找替代词，这些词的内涵可能与我可能使用的词有些不同。因为我经常使用 Linux 命令行和文本模式工具来完成我的大部分工作，所以使用命令行词典是有意义的。我非常喜欢使用命令行，原因有很多，其中最主要的原因是它对我来说更有效率。它也比任何一本或多本实体纸质字典，都要全面得多。我使用 Linux 的 dict 命令已经很多年了，我已经开始依赖它了。在 Linux 上安装 dictdict 程序在 Fedora 上没有默认安装，但它很容易安装。以下是如何在 Fedora 或类似发行版上安装：$ sudo dnf install dictd 在 Debian 和类似发行版上，你还必须安装字典定义：$ sudo apt install dictd dict-gcide 不需要额外的配置。这个非常简单的 /usr/share/doc/dictd/dict1.conf 文件指定了字典数据库的远程服务器。这个工具使用字典服务器协议（DICT），端口为 2628。在 Linux 上使用 dict在终端会话中，以非 root 用户的身份，输入 dict <word> 来获取一个或多个字典和词库的定义列表。例如，以这种方式查找 memory 这个词。$ dict memory | less 6 definitions found From The Collaborative International Dictionary of English v.0.48 [gcide]: Memory \Mem"o*ry\, n.; pl. {Memories}. [OE. memorie, OF. memoire, memorie, F. m['e]moire, L. memoria, fr. memor mindful; cf. mora delay. Cf. {Demur}, {Martyr}, {Memoir}, {Remember}.] [1913 Webster] 1. The faculty of the mind by which it retains the knowledge of previous thoughts, impressions, or events. [1913 Webster] Memory is the purveyor of reason. --Rambler. [1913 Webster] 2. The reach and positiveness with which a person can remember; the strength and trustworthiness of one's power to reach and represent or to recall the past; as, his memory was never wrong. [1913 Webster] <SNIP> From WordNet (r) 3.0 (2006) [wn]: memory n 1: something that is remembered; "search as he would, the memory was lost" 2: the cognitive processes whereby past experience is remembered; "he can do it from memory"; "he enjoyed remembering his father" [syn: {memory}, {remembering}] 3: the power of retaining and recalling past experience; "he had <SNIP> From Moby Thesaurus II by Grady Ward, 1.0 [moby-thesaurus]: 78 Moby Thesaurus words for "memory": RAM, anamnesis, anniversaries, archetypal pattern, archetype, awareness, celebrating, celebration, ceremony, cognizance, commemoration, consciousness, disk memory, dressing ship, <SNIP> From The Free On-line Dictionary of Computing (30 December 2018) [foldoc]: memory <storage> These days, usually used synonymously with {Random Access Memory} or {Read-Only Memory}, but in the general sense it can be any device that can hold {data} in {machine-readable} format. (1996-05-25) From Bouvier's Law Dictionary, Revised 6th Ed (1856) [bouvier]: MEMORY, TIME OF. According to the English common law, which has been altered by 2 & 3 Wm. IV., c. 71, the time of memory commenced from the reign of 为了节省空间，我删去了这个结果的大部分内容，同时留下了足够的信息，以提供一个典型结果的概念。你也可以用双引号或单引号将多字短语括起来进行查询。$ dict "air gapped" 字典dict 命令使用一些在线字典，包括法律和技术字典。许多语言的字典也是可用的。你可以“列出”可用的字典数据库，如下面所示：$ dict -D | less Databases available: gcide The Collaborative International Dictionary of English v.0.48 wn WordNet (r) 3.0 (2006) moby-thesaurus Moby Thesaurus II by Grady Ward, 1.0 elements The Elements (07Nov00) vera V.E.R.A. -- Virtual Entity of Relevant Acronyms (February 2016) jargon The Jargon File (version 4.4.7, 29 Dec 2003) foldoc The Free On-line Dictionary of Computing (30 December 2018) easton Easton's 1897 Bible Dictionary hitchcock Hitchcock's Bible Names Dictionary (late 1800's) bouvier Bouvier's Law Dictionary, Revised 6th Ed (1856) devil The Devil's Dictionary (1881-1906) world02 CIA World Factbook 2002 gaz2k-counties U.S. Gazetteer Counties (2000) gaz2k-places U.S. Gazetteer Places (2000) gaz2k-zips U.S. Gazetteer Zip Code Tabulation Areas (2000) fd-hrv-eng Croatian-English FreeDict Dictionary ver. 0.1.2 fd-fin-por suomi-português FreeDict+WikDict dictionary ver. 2018.09.13 fd-fin-bul suomi-български език FreeDict+WikDict dictionary ver. 2018.09.13 fd-fra-bul français-български език FreeDict+WikDict dictionary ver. 2018.09.13 fd-deu-swe Deutsch-Svenska FreeDict+WikDict dictionary ver. 2018.09.13 <SNIP> 你可以用 -d 选项指定单个字典：$ dict -d gcide 总结有时使用词库中的词汇并不是最好的写作方法，因为它可能会混淆你的意思。但我确实发现 dict 命令在为特定的意思选择最好的词方面有极大的帮助。它还能确保我使用的单词拼写正确。关于 dict 的信息很匮乏。 这个 URL http://www.dict.org/ 只提供了一个基于网络的字典界面。手册页涵盖了语法。但是这个命令是一个有用的、有趣的命令，可以随身携带。我承认在发现 dict 命令后，我花了很多时间尝试不同的东西，看看结果会是什么。我就是那个通读百科全书和字典的孩子。是的，我是\_那个\_孩子。除了在写作或阅读时是一个有用的工具外，dict 也可以是一个有趣的工具来满足一下好奇心。via: https://opensource.com/article/23/2/linux-dict-command作者：David Both 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
好奇心能激发人们对于知识和真理的渴求，无论是对于硬件、开源软件、编程、组装个人电脑、优化系统设置，还是只是学习使用一个新软件。我通常在家架设运行一个由一打计算机组成的家庭网络 —— 没错，正好 12 台计算机。同时我还负责其它地方的一些计算机维护工作。由于计算机很多，总会出现各种各样的故障，其中有很多最终确诊为硬件问题。但是要判定出是哪个硬件设备引发的故障却是一件难事。就在这周，我的主工作站上出现了一个棘手的问题，导致我两次误判了问题的原因。本文将带你跟随我排查问题的过程。我将告诉你我在哪一步做了错误的判断以及为什么，还有误判是多么容易发生。最初的症状我手上一直有好几个项目。最近，我在几台台式机上打开了很多应用程序，我刚开始工作，突然就黑屏了。主工作站的大多数（不是全部）风扇都停了，这让我倒吸一口凉气。我从来没有遇到过这种情况，但显然我的系统出问题了。我有两条主要线索可以跟进：一是显示黑屏，二是有些风扇不转了。但是前面板上的电源和磁盘活动指示灯还是亮的，只是比平常要暗一点。大多数安装在主板、内存条和风扇上的 RGB 装饰灯也都灭了。我试过按电源键和重启键，都没有反应。我直接按供电单元的船型开关关闭了电源。重新供电后还是出现了刚才的症状。最初的猜想问题的现象和我数十年处理各类故障的经验将原因指向了供电问题。我将供电单元拆了下来并用电源测试仪对它进行了检查。结果是供电单元没有任何问题，各项电压都符合规范。当然测试仪的结果也可能是错误的。测试仪并没有在满负荷状态下进行测试，比如计算机运行中耗电几百瓦的情况。我凭直觉更换了一个一千瓦的备用电源。由于我的家庭网络中有 12 台计算机，我已经习惯准备了一些备用配件在身边。这样当有配件损坏时，我就不必非得跑一趟附近的电脑城或者网购后等快递了。由于计算机这么多，配件损坏是经常的事。虽然电源测试仪告诉我电源没有问题，但更换电源后问题确实消失了。即便检测仪在过去都是正确的，我的经验、知识和直觉告诉我就是电源问题。不幸的是，我的直觉错了。第二个猜想没过多久我的工作站再次又了相同的问题。但两个不同的供电单元有相同问题的可能性太低了。我马上想到那一定是主板出问题了。我没有备用的主板，所以网购了一块新主板。我想到其实可以用上手上多余的内存条，然后把 CPU 连同一体水冷单元一起装到新主板上。专业的故障排查新主板需要几天天才能送到，所以我决定先将工作站上的旧主板拆下来。就在拔掉主板供电之前，我的好奇心显现，并驱使我给只剩主板、CPU 和内存的系统开机。我已经把其它的部分都拆掉了。好的故障排除过程需要分离所有潜在变量，目前我只是对供电单元进行了测试。我需要对每个组件都进行测试。这需要我先拔掉前面板上的扬声器和多功能面板连接线。多功能面板上集成了各种 USB、SATA 和内存卡插槽。令人惊讶的是，当只有主板通电时竟然一切正常。计算机本身无法开机，因为根本没有连接存储器。也不会有显示输出，因为我已经把显卡拆掉了。但是没有电源或主板故障的迹象。这进一步激发了我的好奇心。如果主板真的有问题的话，故障现象应该仍然存在才对。所以我开始一系列的重复试验：断电，安装一个已经拆掉的配件，重新上电。最终发现问题上由前置多功能面板引发的。我拆除了多功能面板并将其它零件全部装了回去。工作站开机正常，运行良好。终于让我逮到罪魁祸首了。起因弄清真正的问题之后，我立刻就明白了问题的根本原因。这还要从几天前说起。那时我正在测试一些外接 USB 设备，包括几种摄像头、几个用于备份的存储设备和一个外接 USB 集线器。我把一根 USB 连接线插到了多功能面板上的一个 USB 2.0 插口中。所有东西都停摆了，大部分灯熄灭了，风扇也不转了。USB 连接线发热很严重，我拔掉它时还把手指烫伤了。原来我不小心将连接线的 C 型插头插到了一个 USB 3.0 A 型插口里，导致了供电短路。拔掉 USB 连接线之后，一切都恢复了“正常” —— 但事实并非如此。我粗心的错误对多功能面板造成了损伤，它在坚持了几天之后彻底短路了。妄下结论知识和经验有时候比电源测试仪之类的工具更重要。当然知识跟经验有时候也不管用。我最终找到了问题的真正原因，但其实我本该早就发现的。尽管我在问题跟供电有关这一点上是对的，但还是误入歧途了。原因是我没能正确解读问题现象并根据线索调查得出逻辑结论导致的。我本可以更早找出问题的根本原因的，这样就不至于在修好主工作站之前浪费那么多时间在将我的笔记本变成临时主要设备上了。系统管理员总与复杂的设备打交道，过早下结论在所难免。我有超过 50 年的从业经验，还是犯了这样的错误。我只需记住做几个 深呼吸，然后刨根问底直到找到问题的根本原因。好奇心至少在等待新主板到货期间，我遵循了自己的好奇心。这让我比等新主板到货要早得多将事情恢复正常。同时也避免了我在没有充分测试的情况下把一块完好的主板丢掉。谚语说好奇心害死猫。我讨厌这个谚语，因为它被家长、学校、见识短浅的老板、老师和那些不想被我们这种好奇宝宝干扰的人用得太多了。事实上，好奇心激发了对于人们对于知识和真理的渴求。这可能是关于硬件、开源软件、编程、组装个人电脑、优化系统设置或者学习使用新软件。满足你的好奇心吧!via: https://opensource.com/article/22/1/troubleshoot-hardware-sysadmin作者：David Both 选题：lujun9972 译者：toknow-gh 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
zram 是一个用于创建内存压缩缓存的工具，特别是可以用作交换空间。我在我的电脑上花了很多时间（我是说工作），我发现了很多有趣的东西。其中最近引起我注意的是 zram0 设备。我是在几个月前写一篇文章时第一次注意到它，它显示在 lsblk 命令的输出中：# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 931.5G 0 disk ├─sda1 8:1 0 600M 0 part [...] zram0 252:0 0 8G 0 disk [SWAP] 它被识别为交换空间，这就是首先引起我的好奇心的原因，所以我做了一些研究。zram 最初被称为 “ 压缩缓存 compcache ”，即 “压缩的高速缓存”。事实证明，zram 是一个用于创建内存内压缩缓存的工具，特别是作为交换空间使用。但为什么呢？当我开始研究 zram 时，我只发现了几篇关于将 zram 用于交换空间的基础文章。起初，这对我来说似乎有点违反直觉。毕竟，如果你的内存快用完了，你把页面交换到内存中的虚拟驱动器中，有什么好处呢？然后我找到了 Fedora 项目的维基页面，它提议使用 zram 交换空间 swap-on-zram 。该建议说：“交换是有用的，除了它的速度很慢。zram 是一个使用了压缩的内存驱动器。在启动时创建一个 zram 交换空间，并且不再使用默认的交换分区。”该页面的其余部分是关于它的细节、好处、副作用和反馈。Linux 上用于交换空间的 zram使用 zram 作为交换空间，与常规的基于分区或基于文件的交换空间做的事情相同。当内存压力过大时，一些最近使用最少的数据会被移到交换空间。平均来说，它会被压缩到其原始大小的 50% 左右，并被放置在内存的 zram 空间中。这比将这些内存页存储在硬盘上要快得多，并可以释放出它所使用的内存用于其他用途。节省交换空间我试图找到关于配置多少交换空间或 zram 交换空间的总结建议。这使我重新回顾了交换空间的设置，以及我之前的文章《现代 Linux 系统的正确交换空间是多少？》。就我所知，从 RHEL 和 Fedora 的最新文档来看，推荐的交换空间数量并没有改变。不过，该文档忽略了 zram 的使用。然而，在不使用 zram 的旧版 Linux 或 zram 被禁用的情况下，之前文章中的表格仍然为交换空间的分配提供了一个好的起点。我找到的关于 zram 功能的文档在 zram 如何根据内存大小分配空间，以及分配给 zram 交换空间的数量方面是不一致的。由于缺乏权威性的文档，我进行了一些实验来凭经验确定用于分配 zram 交换空间的算法。我为此使用了我自己的物理和虚拟系统。结果很有趣，与我迄今为止发现的任何文档都不一致。在所有足够大的系统上，zram 的默认大小是 8GB，但在内存较小的主机上通常会大大减少。在我用于测试的一台虚拟机（VM）上，可以访问 4GB 的内存，zram 的虚拟交换空间被分配为 3.8GB。我的一台旧戴尔电脑拥有 8GB 的内存，zram 被设置为 7.6GB。当内存减少到 2GB 时，zram 就减少到 1.9GB。我拥有的所有内存超过 8GB 的物理和虚拟主机都显示正好是 8GB 的 zram。这包括我拥有 64GB 内存的主工作站和其他拥有 16GB 或 32GB 内存的主机。基于这几个数据点，我可以得出这样的结论：目前的默认设置是最多 8GB 的 zram，而在 8GB 或以下的主机上，zram 占内存的 95%。我读过一些文章，其中提到了 zram 交换空间的其他大小，甚至高达 100% 的内存，但这些似乎都是理论上的，而不是现实。你的发行版可能不同，但这里是 Fedora 和类似发行版的实际 zram 交换空间的分配情况：内存 ⇐ 8 GB：0.95 × 内存内存 > 8 GB:8 GB请注意，zram 交换空间大小的算法并没有基于对任何给定的现实世界的系统或应用程序的 “最佳” 交换大小的建议。这种 zram 交换空间的分配是一种相当概率性的方法，它应该在广泛的 Linux 主机上运行良好。然而，最大的 zram 交换空间大小被配置为 8GB，而且我一直推荐 8GB 作为传统交换空间的最大容量，我想我可以说它反映了 zram 交换空间的最佳大小。管理 zram 交换空间zram 的默认值保存在 /usr/lib/systemd/zram-generator.conf 配置文件中。以下是我的一个测试虚拟机，分配了 5097GB 的内存。# cat /usr/lib/systemd/zram-generator.conf # This config file enables a /dev/zram0 device with the default settings: # - size - same as available RAM or 8GB, whichever is less # - compression - most likely lzo-rle # # To disable, uninstall zram-generator-defaults or create empty # /etc/systemd/zram-generator.conf file. [zram0]zram-size= min(ram, 8192) 你可以在 zram-generator.conf 配置文件的最后一行改变默认的 zram 交换空间大小。但我建议不要这样做，除非你能明确说明这样做的原因，并在你做任何改变后测试你的结果。像 Linux 中的许多其他配置默认值一样，zram 的默认值已经被很好地测试过了，适合大多数使用情况。监控 zram可以使用 zramctl 工具来查看 zram 的当前状态。# zramctl NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT /dev/zram0 lzo-rle 4.8G 4K 80B 12K 4[SWAP] 传统的 swapon 命令也可以用来查看交换，包括作为交换使用的 zram：# swapon --show NAME TYPE SIZE USED PRIO /dev/zram0 partition 4.8G 0B 100 需要注意的是，zramctl 在不包含数据时不报告 zram，所以结果会包含空输出。而像 lsblk、swapon、 top、free、htop 等工具，即使不包含数据，也会显示 zram。停用 zramswapoff -a 命令会关闭 zram 交换空间以及用作交换的传统 HDD 或 SSD 存储。swapon -a 命令在 zram 为空时不显示它，可以使用 zramctl /dev/zram0 代替。# swapon --show# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:00 120G 0 disk ├─sda1 8:10 1G 0 part /boot/efi ├─sda2 8:20 1G 0 part /boot └─sda3 8:30 118G 0 part ├─vg01-root 253:00 10G 0 lvm / ├─vg01-swap 253:10 3G 0 lvm [SWAP] ├─vg01-usr 253:10 30G 0 lvm /usr ├─vg01-home 253:20 10G 0 lvm /home ├─vg01-var 253:30 30G 0 lvm /var └─vg01-tmp 253:40 10G 0 lvm /tmp sr0 11:01 1024M 0 rom zram0 252:00 0B 0 disk # zramctl## zramctl /dev/zram0 NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT /dev/zram0 lzo-rle 0B 0B 0B 0B 4 注意，/dev/zram0 在这些命令中并没有显示为交换空间，直到它被用于该目的。这给我造成了一些困惑，直到我的实验表明这是事实。创建 zram 交换空间zram 本身已经存在了大约 20 年，但只是在过去的一两年里才在一些发行版上作为交换空间使用。你的一些或所有主机上当前的 Linux 环境可能没有用 zram 创建交换空间。如果是这种情况，它可以很容易地被补救。对于 Fedora 32，它是默认使用 zram 交换空间之前的最后一个版本，它只需要三个简单的命令。首先，验证是否存在 zram-swap.service 文件，它作为 zram RPM 包的一部分安装：# systemctl status zram-swap ● zram-swap.service - Enable compressed swap in memory using zram Loaded: loaded (/usr/lib/systemd/system/zram-swap.service; disabled; vendor preset: disabled) Active: inactive (dead) 接下来，安装 zram-generator-defaults 和 zram-generator 软件包：# dnf install zram-generator-defaults zram-generator 启用并启动 zram-swap 服务：# systemctl enable zram-swap.service# systemctl start zram-swap.service 然后验证 zram0 是否存在并被用作交换空间：# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:00 120G 0 disk ├─sda1 8:10 2G 0 part /boot └─sda2 8:20 118G 0 part ├─vg01-root 253:00 10G 0 lvm / ├─vg01-swap 253:10 3G 0 lvm [SWAP] ├─vg01-usr 253:20 35G 0 lvm /usr ├─vg01-tmp 253:30 15G 0 lvm /tmp ├─vg01-var 253:40 35G 0 lvm /var └─vg01-home 253:50 20G 0 lvm /home sr0 11:01 1024M 0 rom zram0 252:00 7.5G 0 disk [SWAP] 用 zram 改进交换空间这就是全部内容了。在 Fedora 上这很容易。不同的发行版可能也一样简单，只是软件包名称和命令的细节可能不同。在你的电脑上试试 zram 交换空间吧。在我的下一篇文章中，我将进一步演示一些 zram 选项。via: https://opensource.com/article/22/11/zram-swap-linux作者：David Both 选题：lkxed 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
本文将比较非 root 用户提权为 root 用户的两个 Linux 命令 的区别。su 和 sudo 命令都允许用户执行非特权用户不允许做的系统管理任务，即只有 root 用户能执行的命令。有些人更喜欢 sudo 命令：例如 Seth Kenlon 最近发布的一篇 《在 Linux 上使用 sudo 的 5 个理由》，他在其中详细阐述了 sudo 命令的许多优点。但是，相较于 sudo 命令，我更偏好于 su 命令 来做系统管理工作。在本文中，我比较了这两个命令的区别，并解释了为什么我更喜欢 su 而不是 sudo，但我仍然同时使用这两个命令的原因。过去的系统管理员主要使用 su 命令su 和 sudo 命令是为不同的世界设计的。早期的 Unix 计算机需要全职系统管理员，他们使用 root 用户作为唯一的管理帐户。在这个古老的世界里，有管理员密码的人会在电传打字机或 CRT 终端（例如 DEC VT100）上以 root 用户登录，然后执行一些管理 Unix 计算机的工作。管理员还会有一些非 root 帐户，用于执行一些非 root 的任务，例如编写文档和管理电子邮件等。在这些 Unix 计算机上通常有许多非 root 帐户，他们都不需要完全的 root 访问权限，只需要以 root 权限运行很少的命令，大约 1 至 2 个就可以了。许多系统管理员以 root 用户登录，完成 root 工作，并在任务完成后，退出 root 会话。有时候，系统管理员需要整天以 root 用户来登录，因为 sudo 命令需要键入更多的内容才能运行必要的命令，因此大多数系统管理员很少使用 sudo 命令。sudo 和 su 这两个命令都能够提权为 root 用户，但它们实现的方式大不相同。这种差异是由于它们最初打算用于不同的情况。sudo 命令sudo 命令的初衷是让 root 用户能够让几个非 root 用户访问他们经常需要的一两个特权命令。sudo 命令允许非 root 用户暂时地获得更高权限，来执行一些特权命令，例如添加和删除用户、删除属于其他用户的文件、安装新软件以及管理现代 Linux 主机所需的任何命令。sudo 命令允许非 root 用户访问一两个 需要更高权限 的常用命令，这样可以帮助系统管理员节省来自用户的许多请求，并减少等待时间。sudo 命令不会将用户帐户切换为 root 用户，因为大多数非 root 用户永远不应该拥有完全的 root 访问权限。在大多数情况下，sudo 允许用户执行一两个命令，然后提权就会过期。在这个通常为 5 分钟的短暂的提权时间内，用户可以执行任何需要提权的管理命令。需要继续使用提权的用户可以运行 sudo -v 命令来重新验证 root 访问权限，并将提权时间再延长 5 分钟。使用 sudo 命令还有一些副作用，例如生成非 root 用户使用命令的日志条目及其 ID。这些日志可以在之后作为出现问题的检验，来给用户更多的操作培训。（你以为我会说“问责”用户，对吧？）su 命令su 命令能够将非 root 用户提权到 root 权限 —— 事实上，能让非 root 用户成为 root 用户。唯一的要求是用户知道 root 密码。因为用户已经以 root 权限登录，所以之后的操作就没有限制了。su 命令所提供的提权没有时间限制。用户可以作为 root 执行命令，不需要进行重新验证是否有 root 权限。完成任务后，用户可以执行退出命令 exit，从 root 用户恢复到自己原来的非 root 帐户。su 和 sudo 在使用上的争议和变化最近在 su 与 sudo 的使用上存在一些分歧。真正的系统管理员不会使用 sudo。—— Paul VeneziaVenezia 在他的 InfoWorld 文章 中辩称，对于许多担任系统管理员的人来说，sudo 是一个不必要的工具。他没有花太多时间为这个观点进行解释，他只是把它说成了一个事实。我同意他对于系统管理员的观点，因为我们不需要 sudo 来完成我们的工作。事实上，sudo 使得事情变得更复杂了。然而，时代在“改变”。—— Bob DylanBob Dylan 是对的，尽管他唱的歌不是指计算机（LCTT 译注：Bob Dylan 是美国创作歌手、艺术家和作家，这里指他不是针对于电脑而说的）。自从人手一台的个人计算机时代到来，计算机的管理方式发生了重大变化。在许多环境中，计算机的使用者也是它的管理员，这使得为这些用户提供一些对 root 权限的访问是有必要的。一些现代发行版，例如 Ubuntu 及其衍生版本，只能使用 sudo 命令来执行特权命令。在这些发行版中，用户无法直接以 root 用户身份登录，甚至无法通过 su 切换到 root，因此需要 sudo 命令来允许非 root 用户获得 root 权限。在这一环境中，所有系统管理任务均使用 sudo 来执行。通过锁定 root 帐户并将常规用户帐户添加到“轮子”组（wheel），可以实现此配置，但是这种配置很容易被绕过。接下来，让我们在 Ubuntu 主机或虚拟机上尝试一些小实验吧。我在这里说明一些我的设置，以便你可以根据需要来重现它。我安装的是 Ubuntu 16.04 LTS1，并使用 VirtualBox 将其安装在虚拟机中。在安装过程中，我创建了一个非 root 用户 student，为了简便起见我给这个用户设置了一个简单的密码。以 student 用户身份登录 Ubuntu，并打开终端。查看 /etc/shadow 文件中的 root 条目，其中存储了经哈希的密码。student@ubuntu1:~$ cat /etc/shadow cat: /etc/shadow: Permission denied 可以看到终端拒绝了我们对 /etc/shadow 的访问，因此我们无法查看 /etc/shadow 文件。所有发行版都是如此，以防止非特权用户看到和访问加密的密码，因为非特权用户可能会使用常见的黑客工具来破解这些密码。现在，让我们使用 su - 命令来成为 root 用户。student@ubuntu1:~$ su - Password: <Enter root password – but there isn't one> su: Authentication failure 认证失败的原因是因为 root 帐户没有密码、并且被锁定了。接下来，使用 sudo 命令查看 /etc/shadow 文件。student@ubuntu1:~$ sudo cat /etc/shadow [sudo] password for student: <enter the student password> root:!:17595:0:99999:7::: <截取> student:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7::: <截取> 在这里，我仅截取了部分结果，只显示 root 和 student 用户的条目。我还缩短了加密密码，以便该条目能显示在一行中。各个字段以冒号（:）分隔，第二个字段是密码。请注意，root 的密码字段是一个感叹号（!），这表明 root 帐户已被锁定，且无法使用。现在，要将 root 帐户变成一个合适的系统管理员，你只需为 root 帐户设置密码。student@ubuntu1:~$ sudo su - [sudo] password for student: <Enter password for student> root@ubuntu1:~# passwd root Enter new UNIX password: <Enter new root password> Retype new UNIX password: <Re-enter new root password> passwd: password updated successfully root@ubuntu1:~# 现在，你可以直接以 root 身份登录到控制台，或者直接使用 su 登录到 root，而不是在每个命令前都加一个 sudo。当然，你也可以在每次想以 root 身份登录时，使用 sudo su -，但这又是何必呢？请不要误解我的意思。像 Ubuntu 这样的发行版及其上下游衍生版非常好，多年来我已经使用了其中的几个。在使用 Ubuntu 和相关发行版时，我做的第一件事就是设置一个 root 密码，这样我就可以直接以 root 身份登录。其他发行版，如 Fedora 及其相关发行版，现在在安装过程中提供了一些有趣的选择。我注意到的第一个 Fedora 版本是 Fedora 34，我在写我的一本即将出版的书时安装了很多次。在安装页面上，可以找到其中一个安装选项，来设置 root 密码。这个新选项允许用户选择“ 锁定 root 帐户 Lock root account ”，就像 Ubuntu 锁定 root 帐户的方式一样。此页面上还有一个选项，允许使用密码以 root 身份远程 SSH 登录到此主机，但这仅在 root 帐户解锁时有效。第二个选项位于允许创建非 root 帐户的页面上。此页面上的选项之一是“ 让此用户成为管理员 Make this user administrator ”。选中此选项后，用户 ID 将添加到一个名为 wheel 组的特殊组中，该组授权该组的成员使用 sudo 命令。Fedora 36 甚至在该复选框的描述中提到了 wheel 组。可以将多个非 root 用户设置为管理员。使用此方法指定为管理员的任何人都可以使用 sudo 命令在 Linux 计算机上执行所有管理任务。Linux 在安装时只允许创建一个非 root 用户，所以其他新用户可以在创建时添加到 wheel 组中。root 用户或其他管理员可以使用文本编辑器或 usermod 命令直接将现有用户添加到 wheel 组。在大多数情况下，今天的管理员只需要执行一些基本任务，例如添加新的打印机、安装更新或新软件，或者删除不再需要的软件。这些 GUI 工具需要 root 或管理密码，并将接受来自管理员用户的密码。在 Linux 上，我是怎么使用 su 和 sudo 的呢我同时使用 su 和 sudo。它们都是我所使用的很重要的系统管理员工具。我不锁定 root 帐户，因为我需要用 root 帐户来运行我的 Ansible 脚本和我编写的 rsbu Bash 程序，来执行备份。这两个程序都需要以 root 身份运行，我编写的其他几个管理 Bash 的脚本也是如此。我使用 su 命令切换到 root 用户，这样我就可以执行这些脚本和许多其他常见的命令。当我需要确定问题和解决问题时，使用 su 命令将我的权限提升到 root 十分有用，因为我不希望 sudo 带来的提权会话超时。当非 root 用户需要执行这些任务时，我使用 sudo 命令，来执行需要 root 权限的任务。我在 sudoers 文件中设置了非 root 帐户，只允许访问完成任务所需的一两个命令。当我只需要运行一两个需要提权的快速命令时，我自己也会使用 sudo 命令。结论实际上只要你把工作完成好了，你使用什么工具都无大碍。你使用的是 Vim 还是 Emacs，是 systemd 还是 SystemV，是 RPM 亦或是 DEB，是 sudo 亦或是 su，在结果上会有什么区别呢？这里的关键在于你应该使用最适合你的工具。Linux 和开源软件的最大优势之一是通常有许多选项可用于我们需要完成的任务。su 和 sudo 都各有长处，如果正确使用的话，两者都是非常安全的。我选择同时使用 su 和 sudo 命令，基于它们的历史功能，因为这对我来说十分有用。对于我自己的大部分工作，我更喜欢 su 命令，因为它与我的工作流程最适配。在评论区分享你喜欢的工作方式吧！本文摘自于我的书《 系统管理员的 Linux 哲学 The Linux Philosophy for Sysadmins （Apress，2018 年）》一书的第 19 章，并经许可后重新发布。via: https://opensource.com/article/22/6/linux-su-vs-sudo-sysadmin作者：David Both 选题：lkxed 译者：chai001125 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
我如何使用现场 USB 设备恢复我的 Linux 系统
Fedora 现场 USB 发行版为引导和进入恢复模式提供了有效的解决方案。我的家庭实验室里有十几台物理计算机以及更多的虚拟机。这些系统中的大多数是我用来进行测试和实验的。我经常写使用自动化来简化系统管理任务的文章。我还在多个地方写过，我从自己的错误中学到的东西比几乎任何其他方式都多。在过去的几周里，我学到了很多东西。我给自己制造了一个大麻烦。作为多年的系统管理员，我写了数百篇关于 Linux 的文章和五本书，我应该对 Linux 更了解。话又说回来，我们都会犯错，这是一个重要的教训：你永远不会因为有经验而不犯错。我不打算讨论我的错误的细节。告诉你这是一个错误就足够了，在我做之前我应该多考虑一下我在做什么。此外，细节并不是重点。经验不能让你免于犯下的每一个错误，但它可以帮助你恢复。这就是本文要讨论的内容：使用现场 USB 发行版启动并进入恢复模式。问题首先，我制造了问题，这本质上是 /etc/default/grub 文件的错误配置。接下来，我使用 Ansible 将错误配置的文件分发到我所有的物理计算机并运行 grub2-mkconfig。全部 12 个。这真的，真的很快。除了两台之外，所有的都无法启动。它们在 Linux 启动的早期阶段崩溃，出现各种无法定位 /root 文件系统的错误。我可以使用 root 密码进入“维护”模式，但是如果没有挂载 /root，即使是最简单的工具也无法访问。直接引导到恢复内核也不起作用。系统真的被破坏了。Fedora 恢复模式解决此问题的唯一方法是找到进入恢复模式的方法。当一切都失败时，Fedora 提供了一个非常酷的工具：用于安装 Fedora 新实例的 现场 USB Live USB 驱动器。将 BIOS 设置为从现场 USB 设备启动后，我启动到 Fedora 36 Xfce 的 现场 live 用户桌面。我在桌面上打开了两个相邻的终端会话，并在两者中都切换到了 root 权限。我在其中一个运行了 lsblk 以供参考。我使用该结果来识别 / 根分区以及 boot 和 efi 分区。我使用了我的一台虚拟机，如下所示。在这种情况下没有 efi 分区，因为此 VM 不使用 UEFI。# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 1.5G 1 loop loop1 7:1 0 6G 1 loop ├─live-rw 253:0 0 6G 0 dm / └─live-base 253:1 0 6G 1 dm loop2 7:2 0 32G 0 loop └─live-rw 253:0 0 6G 0 dm / sda 8:0 0 120G 0 disk ├─sda1 8:1 0 1G 0 part └─sda2 8:2 0 119G 0 part ├─vg01-swap 253:2 0 4G 0 lvm ├─vg01-tmp 253:3 0 10G 0 lvm ├─vg01-var 253:4 0 20G 0 lvm ├─vg01-home 253:5 0 5G 0 lvm ├─vg01-usr 253:6 0 20G 0 lvm └─vg01-root 253:7 0 5G 0 lvm sr0 11:0 1 1.6G 0 rom /run/initramfs/live zram0 252:0 0 8G 0 disk [SWAP] /dev/sda1 分区很容易识别为 /boot，根（/）分区也很明显。在另一个终端会话中，我执行了一系列步骤来恢复我的系统。特定的卷组名称和设备分区（例如 /dev/sda1）因系统而异。此处显示的命令特定于我的情况。目标是使用现场 USB 引导并完成启动，然后仅在镜像目录中挂载必要的文件系统，并运行 chroot 命令在 chroot 镜像目录中运行 Linux。这种方法绕过损坏的 GRUB（或其他）配置文件。但是，它提供了一个完整的运行系统，其中安装了所有原始文件系统以进行恢复，既是所需工具的来源，也是要进行更改的目标。以下是步骤和相关命令：创建目录 /mnt/sysimage 以提供 chroot 目录的位置。将根分区挂载到 /mnt/sysimage：# mount /dev/mapper/vg01-root /mnt/sysimage 将 /mnt/sysimage 设为你的工作目录：# cd /mnt/sysimage 挂载 /boot 和 /boot/efi 文件系统。挂载其他主要文件系统。此步骤不需要像 /home 和 /tmp 这样的文件系统：# mount /dev/mapper/vg01-usr usr # mount /dev/mapper/vg01-var var 绑定已挂载的重要文件系统，它们必须在已经 chroot 的系统和原始的现场系统之间共享，而后者仍然在外部运行：# mount --bind /sys sys # mount --bind /proc proc 一定要最后操作 /dev 目录，否则其他文件系统不能挂载：# mount --bind /dev dev chroot 到系统镜像：# chroot /mnt/sysimage 系统现在已经准备好了，无论你需要做什么，都可以把它恢复到一个工作状态。然而，有一次我能够在这种状态下运行我的服务器数天，直到我能够研究测试出真正的修复方法。我并不推荐这样做，但在紧急情况下，当有任务需要启动和运行时，这可能是一个选择。解决方案当我让每个系统进入恢复模式，修复就很容易了。因为我的系统现在就像成功启动一样工作，我只需对 /etc/default/grub 和 /etc/fstab 进行必要的更改并运行 grub2-mkconfig > boot/grub2/grub.cfg 命令。我使用 exit 命令退出 chroot 环境，然后重启主机。当然，我无法自动从我的意外事故中恢复过来。我必须在每台主机上手动执行整个过程，这是使用自动化快速和容易地传播我自己的错误的一点报应。得到教训尽管它们很有用，我曾经讨厌在我的一些系统管理员工作中举行的“经验教训”会议，但看来我确实需要提醒自己一些事情。因此，这里是我从这场自作自受的惨败中获得的“教训”。首先，无法引导的十个系统使用了不同的卷组命名方案，而我的新 GRUB 配置没有考虑到这一点。我只是忽略了它们可能不同的事实。彻底考虑清楚。并非所有系统都相同。测试一切。验证一切。永远不要做假设。现在一切正常。希望我也聪明一点。via: https://opensource.com/article/22/9/recover-linux-system-live-usb作者：David Both 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
几乎所有的事情都可以从 Linux 命令行完成，包括对 Xfce4 进行远程配置。与专有操作系统相比，我很欣赏 Linux 的一个特点是，几乎所有的东西都可以从命令行中进行管理和配置。意味着几乎所有的事情都可以在本地或者通过 SSH 远程登录进行管理。虽然有时候需要花费一点时间在互联网上搜索，但是你能想到的任务，是有可能从命令行完成的。问题有时候需要使用命令行对桌面进行远程配置。在这种特殊情况下，我需要响应远程用户的请求将在 Xfce 控制板上的工作区从四个减少到三个。这种配置只需要在互联网上搜索约 20 分钟就找到了。xfwm4 的默认工作区数量和许多其他设置可以在 /usr/share/xfwm4/defaults 这个文件中找到和修改。因此将 workspace_count=2 设置为 workspace_count=4 就改变了主机上所有用户的默认值。同时，非 root 用户可以执行 xfconf-query 命令来查询和设置 xfwm4 窗口管理器的各种属性。它应该由需要改变设置的用户使用，而不是由 root 使用。在下面的例子中，首先我验证了当前工作区数量为 4 ，然后将数量改为 2，最后确认了新设置。[user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count 4 [user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count -s 2 [user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count 2 [user@test1 ~]# 此更改会立即生效，用户可以马上看到，无需重新启动，甚至无需注销并重新登录。我曾在我的工作站上玩过这个游戏，当我输入设置不同数量的工作空间的命令时，可以观察到工作空间切换器的变化。我在哪儿都能找到乐子。;- )更多探索现在我解决了这个问题，我决深入了解一下 xfconf-query 命令。不幸的是，该工具没有手册或信息页，/usr/share 中也没有任何文档。退而求其次，使用 -h 选项获取一些帮助信息。$ xfconf-query -h Usage: xfconf-query [OPTION…] - Xfconf commandline utility Help Options: -h, --help 显示帮助选项 Application Options: -V, --version 版本信息 -c, --channel 查询/修改通道 -p, --property 查询/修改属性 -s, --set 更新权限的值 -l, --list 罗列属性（或者通道，如果没有用 -c 指定） -v, --verbose 详细输出 -n, --create 当新属性不存在，则创建它 -t, --type 指定属性值类型 -r, --reset 重置属性 -R, --recursive 递归（与 -r 一起使用） -a, --force-array 即使只有一个元素也强制采用数组 -T, --toggle 反转现有的布尔属性 -m, --monitor 监视属性更改的通道 这没有多大帮助，但我们还是可以从中找出一些有用的东西。首先，通道 是可以修的属性的分组。我对 general 通道下的 workspace_count 属性进行了更改。让我们看看完整的通道列表：$ xfconf-query -l Channels: xfwm4 xfce4-keyboard-shortcuts xfce4-notifyd xsettings xfdashboard thunar parole xfce4-panel xfce4-appfinder xfce4-settings-editor xfce4-power-manager xfce4-session keyboards displays keyboard-layout ristretto xfcethemer xfce4-desktop pointers xfce4-settings-manager xfce4-mixer 给定通道的属性也可以用下列的命令来查看。我使用 less 分页器，因为结果是一长串数据。我对下面的列表进行了裁剪，但留下了足够多的条目，你可以看到这些条目的类型。$ xfconf-query -c xfwm4 -l | less /general/activate_action /general/borderless_maximize /general/box_move /general/box_resize /general/button_layout /general/button_offset <裁剪> /general/workspace_count /general/workspace_names /general/wrap_cycle /general/wrap_layout /general/wrap_resistance /general/wrap_windows /general/wrap_workspaces /general/zoom_desktop (END) 你可以用这种方式探索所有的通道。我发现通道通常对应“设置管理器”中的各种设置。这些属性是你在这些对话框中设置的。请注意，并非你在“设置管理器”对话窗口中找到的所有设置都是 Xfce 桌面的一部分，因此它们没有对应的通道。屏幕保护程序就是一个例子，因为它是通用的 GNU 屏幕保护程序，并不是 Xfce 独有的。“设置管理器” 是 Xfce 定位这些配置工具的一个很好的中心位置。文档综上所述，xconf-query 命令似乎没有任何手册或信息页，并且我在网上发现了很多不正确的、记录不全的信息。我发现对 Xfce4 来说最好的文档是 Xfce 网站，关于 xconf-query 的一些具体信息可以在这里找到。via: https://opensource.com/article/21/1/remote-configuration-xfce4作者：David Both 选题：lujun9972 译者：Donkey-Hao 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Vim 是我最喜爱的编辑器。对于那些默认使用其他编辑器的程序，我对系统所做的这些改变可以使得 Vim 成为它们默认编辑器。我使用 Linux 大概有 25 年了，在那之前我还使用了几年的 Unix。在这段时间里，我对一些日常使用的工具形成了偏好。Vim 是我使用的最重要的工具之一。我在 90 年代初学习 Solaris 时，就开始使用 Vi 了，因为有人告诉我，它在任何系统上都能使用。从我的经验来看，确实是这样。我也试过其他编辑器，它们都能够胜任工作。但是，对于我来说，Vim 的使用效果最好。我经常使用它，以至于形成了肌肉记忆，甚至我在使用其他编辑器时也会下意识地去按 Vim 的快捷键。另外，我只是单纯地喜欢 Vim 而已。许多配置文件使用的名字是 Vi 而不是 Vim，你可以运行 vi 命令。不过，vi 命令其实是 vim 命令的一个链接。许多 Linux 工具使用的编辑器都是在模拟或是直接调用的 Nano、Emacs 或者 Vim。其他的一些工具允许用户（比如那些有着明确偏好的用户）使用他们喜欢的编辑器。举两个对我影响最大的例子，一个是 Bash 命令行，它默认使用 Emacs；另一个是 Alpine 文本模式的邮件客户端，它默认使用 Pico。事实上，Pico 是专门为 Pine 邮件客户端编写的，而 Pine 是 Alpine 的前身。并非所有使用外部编辑器的程序都是可配置的。有些程序只使用开发者指定的编辑器。对于那些可配置的应用程序，有不同的方法来选择你喜欢的编辑器。在 Linux 命令行中编辑除了实际编辑文本文件外，另一个我经常使用，且和编辑密切相关的工具是 Bash shell。Bash 的默认编辑器是 Emacs。虽然我也用过 Emacs，但我肯定更喜欢 Vim。所以很多年前，我把 Bash 命令行的默认编辑器从 Emacs 换成了 Vim，这对我来说更舒服。有很多种方法可以配置 Bash。你可以使用一个本地配置文件，比如 /home/yourhomedirectory/.bashrc，它只对你的用户账户进行默认修改，而不对同一系统的其他用户进行修改。我个人倾向于让这些改变成为全局性的，基本上就是我的个人账户和 root。如果你也想全局配置，你可以创建你自己的配置文件，并把它放在 /etc/profile.d 目录中。我在 /etc/profile.d 中添加了一个名为 myBashConfig.sh 的文件。/etc/profile.d 目录中存放了所有已安装的 shell 的启动文件。在启动终端会话时，每个 shell 仅会根据文件名的扩展名，读取为其准备的启动文件。例如，Bash shell 只读取扩展名为 .sh 的文件。<截断> alias vim='vim -c "colorscheme desert" ' # 把 vi 设置为 Bash 的默认编辑器 set -o vi # 为所有检查 $EDITOR 变量的程序设置默认编辑器为 vi EDITOR=vi <截断> 在这个全局 Bash 配置文件段中，set -o vi 将 Vi 设置为默认编辑器。这个 set 命令中的 -o 选项将 vi 定义为编辑器。为使配置生效，你需要关闭所有正在运行的 Bash 会话，并打开新的会话。现在，你现在可以使用所有你熟悉的 Vim 命令，包括光标移动。只要按下 Esc 键就可以进入 Vim 编辑模式。我特别喜欢多次使用 b 将光标移回多个字的功能。将 Vim 设置为其他程序的默认值一些 Linux 命令行工具和程序会检查 $EDITOR 环境变量来决定使用哪个编辑器。你可以用下面的命令检查这个变量的当前值。我在一个新安装的虚拟机上运行过该命令，以查看默认的编辑器到底是什么。# echo $EDITOR /usr/bin/nano # 默认情况下，检查 $EDITOR 环境变量的 Fedora 程序会使用 Nano 编辑器。在 myBashConfig.sh 中添加一行 EDITOR=vi（如上面的片段所示），可以将默认值改为 Vi（Vim）编辑器。然而，不是所有使用外部编辑器的命令行程序都会检查这个环境变量。在 Alpine 中编辑电子邮件几周前，我认为 Pico 不太适合作为我的电子邮件编辑器。我可以使用它，而且在从 Thunderbird 转到 Alpine 之后的一段时间内我也用了一段时间。但我发现，Pico 妨碍了我，我总是习惯使用 Vim 按键序列，这影响了我的工作效率。我在 Alpine 的用户帮助中看到，默认编辑器是可以修改的。我决定把它改成 Vim。实际上这很容易做到。在 Alpine 主菜单上，按 S 键进入设置，然后按 C 键进行配置。在 “ 编辑器设置 Composer Preferences ” 部分，按 X 选择 “ 启用外部编辑器命令 Enable Alternate Editor Command ” 和 “ 隐式启用外部编辑器 Enable Alternate Editor Implicitly ” 项目。在往下滚动几页的 “ 高级用户设置 Advanced User Preferences ” 部分，找到 `Editor 那一行。如果它还没有被修改的话，它应该是这样的：Editor = <No Value Set> 用光标栏突出显示 Editor 这一行，然后按回车键来编辑。将 <No Value Set> 改为 vim，再按回车键，然后按 E 键退出，最后按 Y 键保存修改。要用 Vim 编辑电子邮件，只需进入电子邮件正文，Vim 就会自动启动，就像 Pico 那样。所有我喜欢的编辑功能都还在，因为它实际上是在使用 Vim。甚至退出 Vim 的 Esc :wq 序列也是一样的。总结与其他编辑器相比，我更喜欢 Vim，对我的系统进行的这些改动后，那些默认使用其他编辑器的应用程序，将使用 Vim 来替代它们的默认编辑器。有些程序使用 $EDITOR 环境变量，因此你只需要做一次修改就够了。其他有用户配置选项的程序，如 Alpine，则必须为每个程序单独设置。这种可以选择你喜欢的外部编辑器的能力，非常符合 Unix 哲学的宗旨：“每个程序都只做一件事，而且要做得出色”。既然已经有几个优秀的编辑器，为什么还要再写一个呢？而且它也符合 Linux 哲学的宗旨：“使用你最喜欢的编辑器”。当然，你可以把你的默认文本编辑器改为 Nano、Pico、Emacs 或任何其他你喜欢的编辑器。via: https://opensource.com/article/22/2/configure-vim-default-editor作者：David Both 选题：lujun9972 译者：lkxed 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
用 systemd-analyze 洞悉并解决 Linux 启动性能问题。系统管理员的一部分工作就是分析系统性能，发现并解决引起性能不佳、启动时间长的问题。系统管理员也需要去检查 systemd 的配置和使用的其它方面。systemd 初始化系统提供了 systemd-analyze 工具，可以帮助发现性能问题和其他重要的 systemd 信息。在以前的文章《分析 systemd 日历和时间跨度》里，我用了 systemd-analyze 去分析 systemd 里的时间戳和时间跨度，但是这个工具还有很多其他用法，这个文章里我将再揭示一些。（LCTT 译注：systemd 是目前主流 Linux 发行版采用的系统管理系统）（LCTT 译注：为了区分英文的 “boot” 和 “startup” 的不同涵义，此处将 “boot” 翻译为“引导”，“startup” 翻译为“启动”。）概述启动Linux 启动过程是值得学习关注的地方，因为 systemd-analyze 工具很多功能聚焦在 启动 startup 过程。但是首先，要理解 引导 boot 和 启动 startup 。引导阶段从 BIOS 加电自检（POST）开始，结束于内核完成加载并控制主机系统，然后是开始了启动过程，也是 systemd 日志的开始点。这个系列的第二篇文章《理解 Linux 启动时的 systemd》中，我详细讨论了启动阶段的内容和过程。在这篇文章里，我想研究一下启动过程，看看需要多少时间和大部分时间花费在哪里。下面我将展示的结果来自我的主要工作站，这比虚拟机的结果要有趣得多。这个工作站包括一块 华硕 TUF X299 Mark 2 主板、一个英特尔 i9-7960X CPU（16 核 32 线程），64 G 内存。下面的一些命令非 root 用户也可以使用，但是我在这篇文章里使用了 root 用户，以避免在用户之间切换。检查启动过程有几种方法，最简单的 systemd-analyze 命令显示了启动的几个主要部分耗费的时间，包括内核启动、装载运行 initrd（即初始 ramdisk，这是一个用来初始化一些硬件、挂载 / 根文件系统的临时系统镜像），还有用户空间（加载所有使主机达到可用状态的程序和守护程序）。如果没有像该命令传递子命令，默认是 systemd-analyze time：[root@david ~]$ systemd-analyze Startup finished in 53.921s (firmware) + 2.643s (loader) + 2.236s (kernel) + 4.348s (initrd) + 10.082s (userspace) = 1min 13.233s graphical.target reached after 10.071s in userspace [root@david ~]# 这个输出中最值得注意的数据是在固件（BIOS）中花费的时间：几乎 54 秒。这是一个不太正常的时间，我的其他物理系统都没有花费这么长的时间来通过 BIOS。我的 System76 Oryx Pro 笔记本在 BIOS 阶段只花了 8.506 秒，我家里所有的系统都在 10 秒以内。在线搜索一阵之后，我发现这块主板以其超长的 BIOS 引导时间而闻名。我的主板从不“马上启动”，总是挂起，我需要关机再开机，BIOS 报错，按 F1 进入 BIOS 设置，选择要引导的驱动器完成引导，多花费的时间就是这样用掉的。不是所有主机都会显示固件数据（LCTT 译注：固件引导中不涉及 systemd）。我的不科学的实验使我相信，这个数据只显示给英特尔 9 代或以上的处理器。但这可能是不正确的。这个关于引导、启动的概述提供了很好的（虽然有限）的信息，但是还有很多关于启动的信息，我将在下面描述。分配责任你可以用 systemd-analyze blame 来发现哪个 systemd 单元的初始化时间最长。其结果按照初始化时间长短排序，从多到少：[root@david ~]$ systemd-analyze blame 5.417s NetworkManager-wait-online.service 3.423s dracut-initqueue.service 2.715s systemd-udev-settle.service 2.519s fstrim.service 1.275s udisks2.service 1.271s smartd.service 996ms upower.service 637ms lvm2-monitor.service 533ms lvm2-pvscan@8:17.service 520ms dmraid-activation.service 460ms vboxdrv.service 396ms initrd-switch-root.service <截断：删去了好多时间不长的条目> 因为很多服务是并行开始的，在 BIOS 之后所有单元加在一起的总数大大超过了 systemd-analyze time 汇总数。很多都是小数，不能显著的节省时间。这个命令提供的数据指明了改善启动时间的办法。无用的服务可以禁用（disable）。在这个启动过程中，似乎没有任何一个服务需要花费过长的时间。你可能会在每次启动时看到不同的结果。（LCTT 译注：并行启动服务的原因）关键链就像项目管理中的关键路径一样，关键链显示了在启动过程中发生的时间关键的事件链（LCTT 译注：systemd 可以定义服务间的依赖，构成关键链）。如果启动缓慢，这些是你想查看的 systemd 单元，因为它们是导致延迟的单元。这个工具不会显示所有启动的单元，只显示这个关键事件链中的单元。（LCTT 译注：相当于最短路径。并不显示依赖不在关键链上的服务单元）[root@david ~]# systemd-analyze critical-chain The time when unit became active or started is printed after the "@" character. The time the unit took to start is printed after the "+" character. graphical.target @10.071s └─lxdm.service @10.071s └─plymouth-quit.service @10.047s +22ms └─systemd-user-sessions.service @10.031s +7ms └─remote-fs.target @10.026s └─remote-fs-pre.target @10.025s └─nfs-client.target @4.636s └─gssproxy.service @4.607s +28ms └─network.target @4.604s └─NetworkManager.service @4.383s +219ms └─dbus-broker.service @4.434s +136ms └─dbus.socket @4.369s └─sysinit.target @4.354s └─systemd-update-utmp.service @4.345s +9ms └─auditd.service @4.301s +42ms └─systemd-tmpfiles-setup.service @4.254s +42ms └─import-state.service @4.233s +19ms └─local-fs.target @4.229s └─Virtual.mount @4.019s +209ms └─systemd-fsck@dev-mapper-vg_david2\x2dVirtual.service @3.742s +274ms └─local-fs-pre.target @3.726s └─lvm2-monitor.service @356ms +637ms └─dm-event.socket @319ms └─-.mount └─system.slice └─-.slice [root@david ~]# 前面有 @ 的数字表示单元激活开始启动所使用的绝对秒数。前面有 + 的数字显示单元启动所需的时间。系统状态有时候你需要确定系统的当前状态，systemd-analyze dump 命令转储了当前系统状态的大量数据。有主要的启动时间戳，一个每个 systemd 单元的列表，并对每个单元状态进行了完整描述：[root@david ~]# systemd-analyze dump Timestamp firmware: 1min 7.983523s Timestamp loader: 3.872325s Timestamp kernel: Wed 2020-08-26 12:33:35 EDT Timestamp initrd: Wed 2020-08-26 12:33:38 EDT Timestamp userspace: Wed 2020-08-26 12:33:42 EDT Timestamp finish: Wed 2020-08-26 16:33:56 EDT Timestamp security-start: Wed 2020-08-26 12:33:42 EDT Timestamp security-finish: Wed 2020-08-26 12:33:42 EDT Timestamp generators-start: Wed 2020-08-26 16:33:42 EDT Timestamp generators-finish: Wed 2020-08-26 16:33:43 EDT Timestamp units-load-start: Wed 2020-08-26 16:33:43 EDT Timestamp units-load-finish: Wed 2020-08-26 16:33:43 EDT Timestamp initrd-security-start: Wed 2020-08-26 12:33:38 EDT Timestamp initrd-security-finish: Wed 2020-08-26 12:33:38 EDT Timestamp initrd-generators-start: Wed 2020-08-26 12:33:38 EDT Timestamp initrd-generators-finish: Wed 2020-08-26 12:33:38 EDT Timestamp initrd-units-load-start: Wed 2020-08-26 12:33:38 EDT Timestamp initrd-units-load-finish: Wed 2020-08-26 12:33:38 EDT -> Unit system.slice: Description: System Slice Instance: n/a Unit Load State: loaded Unit Active State: active State Change Timestamp: Wed 2020-08-26 12:33:38 EDT Inactive Exit Timestamp: Wed 2020-08-26 12:33:38 EDT Active Enter Timestamp: Wed 2020-08-26 12:33:38 EDT Active Exit Timestamp: n/a Inactive Enter Timestamp: n/a May GC: no <截断：删除了大量的输出行> 在我的主工作站上，这个命令生成了 49680 行输出，大概 1.66MB，这个命令非常快，不需要等待。我很喜欢为各种连接设备（如存储设备）提供的大量细节。每个 systemd 单元有一个部分，包括各种运行时、缓存、日志目录的模式、启动单元的命令行、PID、开始时间戳，以及内存和文件限制等细节。systemd-analyze 的手册页里展示了 systemd-analyze --user dump 选项，目的是显示用户管理器的内部状态。但这个选项对我来说是失败的，互联网搜索之后表明它可能有一些问题。在 systemd 里，--user 实例用来管理和控制处理器给每个用户的进程资源。处理能力按分给每个用户的进程都属于一个控制组，我将在以后的文章中介绍。分析图表大多数啥都不懂的猥琐老板（PHB）和许多优秀的管理者都发现漂亮的图表比我通常喜欢的基于文本的系统性能数据更容易阅读和理解。但有时，即使是我也喜欢一个好的图表，systemd-analyze 提供了显示引导/启动数据的 SVG 矢量图表。下面的命令生成一个矢量图文件，来显示在引导和启动过程发生的事件。生成这个文件只需要几秒：[root@david ~]# systemd-analyze plot > /tmp/bootup.svg 这个命令创建了一个 SVG 文件，SVG 是一个定义了一系列图形矢量的文本文件，包括 Image Viewer、Ristretto、Okular、Eye of Mate、LibreOffice Draw 在内的这些可以生成图形的应用，可以用 SVG 来创建图像。我用 LibreOffice Draw（LCTT 译注：一个办公文档软件）来渲染一幅图形。这张图形很大，你需要放到很大才能看清细节。这里是它的一小部分：图中时间轴上零点（0）的左边是引导阶段，零点的右边是启动阶段。这一小部分显示了内核、initrd 和 initrd 启动的进程。这张图一目了然地显示了什么时候启动，启动需要多少时间，以及主要的依赖项。关键路径用红色高亮显示。另外一个生成图形输出的命令是 systemd-analyze plot，它生成了 DOT) 格式的文本依赖图。产生的数据流通过 dot 工具进行处理，这是一组用来从多种类型数据中生成矢量图文件的程序。这些 SVG 文件也能被上面列出的工具处理。首先，生成文件，在我的主工作站花了 9 分钟：[root@david ~]# time systemd-analyze dot | dot -Tsvg > /tmp/test.svg Color legend: black = Requires dark blue = Requisite dark grey = Wants red = Conflicts green = After real 8m37.544s user 8m35.375s sys 0m0.070s [root@david ~]# 我不会在这里重现输出，因为产生的图形就像一大堆意大利面条。但是你应该试试，看看我想让你看到的结果。条件在阅读 systemd-analyze(1) 的手册页时，我发现了一个更有趣的功能，但又有点通用，就是条件子命令。（是的，我确实在读手册页，而且我神奇地通过这种方式学到了很多东西！）。这个 condition 子命令能用来测试 systemd 单元文件中的条件和断言。它也可以在脚本中用来评估一个或多个条件 —— 如果所有条件都满足，则返回 0；如果有条件不满足，则返回 1。在其它情况下，它都会输出其结果文本。下面的例子来自手册页，稍微有点复杂。它测试了内核版本是否在 4.0 和 5.1 之间，主机是否使用交流电供电，系统结构是否是 ARM，以及 /etc/os-release 目录是否存在。我添加了 echo $? 来打印返回值。[root@david ~]# systemd-analyze condition 'ConditionKernelVersion = ! <4.0' \ 'ConditionKernelVersion = >=5.1' \ 'ConditionACPower=|false' \ 'ConditionArchitecture=|!arm' \ 'AssertPathExists=/etc/os-release' ; \ echo $? test.service: AssertPathExists=/etc/os-release succeeded. Asserts succeeded. test.service: ConditionArchitecture=|!arm succeeded. test.service: ConditionACPower=|false failed. test.service: ConditionKernelVersion=>=5.1 succeeded. test.service: ConditionKernelVersion=!<4.0 succeeded. Conditions succeeded. 0 [root@david ~]# 条件和断言的列表大约从 systemd.unit(5) 手册页的第 600 行左右开始。列出配置文件systemd-analyze 工具提供了一种将各种配置文件的内容发送到 STDOUT 的方法，如图所示。其基本目录是 /etc/。[root@david ~]# systemd-analyze cat-config systemd/system/display-manager.service # /etc/systemd/system/display-manager.service [Unit] Description=LXDM (Lightweight X11 Display Manager) #Documentation=man:lxdm(8) Conflicts=getty@tty1.service After=systemd-user-sessions.service getty@tty1.service plymouth-quit.service livesys-late.service #Conflicts=plymouth-quit.service [Service] ExecStart=/usr/sbin/lxdm Restart=always IgnoreSIGPIPE=no #BusName=org.freedesktop.lxdm [Install] Alias=display-manager.service [root@david ~]# 打了这么多字却和标准的 cat 命令做的差不多。我发现下一条命令小有帮助，它能在标准的 systemd 所在的位置搜索具有指定模式的内容：[root@david ~]# systemctl cat backup* # /etc/systemd/system/backup.timer # This timer unit runs the local backup program # (C) David Both # Licensed under GPL V2 # [Unit] Description=Perform system backups Requires=backup.service [Timer] Unit=backup.service OnCalendar=*-*-* 00:15:30 [Install] WantedBy=timers.target # /etc/systemd/system/backup.service # This service unit runs the rsbu backup program # By David Both # Licensed under GPL V2 # [Unit] Description=Backup services using rsbu Wants=backup.timer [Service] Type=oneshot Environment="HOME=/root" ExecStart=/usr/local/bin/rsbu -bvd1 ExecStart=/usr/local/bin/rsbu -buvd2 [Install] WantedBy=multi-user.target [root@david ~]# 这两个命令在每个文件的内容前面都有一个注释行，包含文件的完整路径和名称。单元文件检查当创建了一个新的单元文件，可以利用 verify 子命令帮助检查语法是否正确。它能指出来不正确的拼写，并列出缺失的服务单元。[root@david ~]# systemd-analyze verify /etc/systemd/system/backup.service 秉承 Unix/Linux 的“沉默是金”的宗旨，没有输出意味着扫描的文件中没有错误。安全性security 子命令检查指定服务的安全级别。它只能针对服务单元，其他类型的单元文件不起作用：[root@david ~]# systemd-analyze security display-manager NAME DESCRIPTION > ✗ PrivateNetwork= Service has access to the host's network > ✗ User=/DynamicUser= Service runs as root user > ✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP) Service may change UID/GID identities/capabilities > ✗ CapabilityBoundingSet=~CAP_SYS_ADMIN Service has administrator privileges > ✗ CapabilityBoundingSet=~CAP_SYS_PTRACE Service has ptrace() debugging abilities > ✗ RestrictAddressFamilies=~AF_(INET|INET6) Service may allocate Internet sockets > ✗ RestrictNamespaces=~CLONE_NEWUSER Service may create user namespaces > ✗ RestrictAddressFamilies=~… Service may allocate exotic sockets > ✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP) Service may change file ownership/access mode/capabilities unres> ✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER) Service may override UNIX file/IPC permission checks > ✗ CapabilityBoundingSet=~CAP_NET_ADMIN Service has network configuration privileges > ✗ CapabilityBoundingSet=~CAP_SYS_MODULE Service may load kernel modules <截断> ✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG Service may issue vhangup() > ✗ CapabilityBoundingSet=~CAP_WAKE_ALARM Service may program timers that wake up the system > ✗ RestrictAddressFamilies=~AF_UNIX Service may allocate local sockets > → Overall exposure level for backup.service: 9.6 UNSAFE ? lines 34-81/81 (END) 是的，表情符是输出的一部分。但是，当然，许多服务需要几乎完全访问所有的东西，以便完成它们的工作。我针对几个服务运行了这个程序，包括我自己的备份服务；结果可能有所不同，但最底下一行似乎大多是一样的。这个工具对于在严格的安全环境检查和修复用户空间的服务单元是很有用的。我不认为我们的大多数都能用到它。最后总结这个强力的工具提供了一些有趣而惊人的有用选项。本文探讨的大部分内容是关于使用 systemd-analyze 来深入了解 Linux 使用 systemd 的启动性能。它还可以分析 systemd 的其他方面。其中有些工具的作用有限，有几个应该完全忘记。但在解决启动和其他 systemd 功能的问题时，大多数都能起到很好的作用。资源互联网上关于 systemd 有很多信息，但是很多过于简略、晦涩，甚至是误导。除了这篇文章中提到的资源外，以下网页提供了关于systemd启动的更详细和可靠的信息。这个列表在我开始写这一系列文章后有所增长，以反映我所做的研究。systemd.unit(5) 手册页 包含了一份单元文件部分及其配置选项的清单，并对每个部分进行了简明的描述。Fedora 项目有一个很好的实用 systemd 指南。它包含了配置、管理和维护使用 systemd 的 Fedora 计算机所需的几乎所有知识。Fedora 项目还有一份很好的 备忘录，将旧的 SystemV 命令与 systemd 命令进行了对照。Red Hat 文档包含了对 单元文件结构 的详细描述和其他重要的信息。关于 systemd 技术的细节和创建它的原因，可以去看 Freedesktop.org systemd 详述。Linux.com 的“更多 systemd 乐趣”提供了很多高级的 systemd 信息和技巧。此外，systemd 设计者和主要开发者 Lennart Poettering 也为 Linux 系统管理员撰写了一系列深度技术文档，尽管这些文章写于 2010 年 4 月到 2011 年 9 月，现在看也是非常适应时宜。关于 systemd 及其生态系统的其他好文章，大部分都是基于这些文章的。Rethinking PID 1systemd for Administrators, Part Isystemd for Administrators, Part IIsystemd for Administrators, Part IIIsystemd for Administrators, Part IVsystemd for Administrators, Part Vsystemd for Administrators, Part VIsystemd for Administrators, Part VIIsystemd for Administrators, Part VIIIsystemd for Administrators, Part IXsystemd for Administrators, Part Xsystemd for Administrators, Part XIvia: https://opensource.com/article/20/9/systemd-startup-configuration作者：David Both 选题：lujun9972 译者：jiamn 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用这个简单的方法来迁移一个网站以及管理防火墙配置。你有过把一个 WordPress 网站迁移到一台新主机上的需求吗？我曾经迁移过好多次，迁移过程相当简单。当然，的的市场时候我都不会用通用的推荐方法，这次也不例外 —— 我用更简单的方法，这才是我推荐的方法。这个迁移方法没有破坏性，因此如果出于某些原因你需要还原到原来的服务器上，很容易可以实现。一个 WordPress 网站的组成部分运行一个基于 WordPress 的网站有三个重要组成部分：WordPress 本身，一个 web 服务器，如 Apache（我正在用），以及 MariaDB。MariaDB 是 MySQL 的一个分支，功能相似。业界有大量的 Web 服务器，由于我使用了 Apache 很长时间，因此我推荐用 Apache。你可能需要把 Apache 的配置方法改成你用的 Web 服务器的方法。初始配置我使用一台 Linux 主机作为防火墙和网络路由。在我的网络中 Web 服务器是另一台主机。我的内部网络使用的是 C 类私有网络地址范围，按 无类别域间路由 Classless Internet Domain Routing （CIDR）方式简单地记作 192.168.0.0/24。对于防火墙，相比于更复杂的 firewalld，我更喜欢用非常简单的 IPTables。这份防火墙配置中的一行会把 80 端口（HTTP）接收到的包发送给 Web 服务器。在 /etc/sysconfig/iptables 文件中，你可以在注释中看到，我添加了规则，把其他入站服务器连接转发到同一台服务器上合适的端口。# Reroute ports for inbound connections to the appropriate web/email/etc server. # HTTPD goes to 192.168.0.75 -A PREROUTING -d 45.20.209.41/255.255.255.248 -p tcp -m tcp --dport 80 \ -j DNAT --to-destination 192.168.0.75:80 我使用 命名虚拟主机 named virtual host 来配置原来的 Apache Web 服务器，因为我在这个 HTTPD 实例上运行着多个网站。使用命名虚拟主机配置是个不错的方法，因为（像我一样）未来你可能会在运行其他的网站，这个方法可以使其变得容易。/etc/httpd/conf/httpd.conf 中需要迁移的虚拟主机的网站相关部分请参考下面代码。这个片段中不涉及到 IP 地址的修改，因此在新服务器上使用时不需要修改。<VirtualHost *:80> ServerName www.website1.org ServerAlias server.org DocumentRoot "/var/website1/html" ErrorLog "logs/error_log" ServerAdmin me@website1.org <Directory "/var/website1/html"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> </VirtualHost> 在迁移之前，你需要在 httpd.conf 的最顶端附近找到 Listen 声明并修改成类似下面这样。这个地址是服务器的真实私有 IP 地址，不是公开 IP 地址。Listen 192.168.0.75:80 你需要修改新主机上 Listen 的 IP 地址。前期工作准备工作分为以下三步：安装服务配置防火墙配置 web 服务器安装 Apache 和 MariaDB如果你的新服务器上还没有 Apache 和 MariaDB，那么就安装它们。WordPress 的安装不是必要的。dnf -y install httpd mariadb 新服务器防火墙配置确认下新服务器上的防火墙允许访问 80 端口。你\_每台\_电脑上都有一个防火墙，对吗？大部分现代发行版使用的初始化配置包含的防火墙会阻止所有进来的网络流量，以此来提高安全等级。下面片段的第一行内容可能已经在你的 IPTables 或其他基于防火墙的网络过滤器中存在了。它标识已经被识别为来自可接受来源的入站包，并绕过后面的其它 INPUT 过滤规则，这样可以节省时间和 CPU 周期。片段中最后一行标识并放行 80 端口新进来的请求到 HTTPD 的连接。-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT <删节> # HTTP -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 下面的示例 /etc/sysconfig/iptables 文件是 IPTables 最少规则的例子，可以允许 SSH（端口 22）和 HTTPD（端口 80）连接。*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT # SSHD -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT # HTTP -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT # Final disposition for unmatched packets -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT 在新服务器主机上我需要做的就是在 /etc/sysconfig/iptables 文件的防火墙规则里添加上面片段的最后一行，然后重新加载修改后的规则集。iptables-restore /etc/sysconfig/iptables 大部分基于红帽的发行版本，如 Fedora，使用的是 firewalld。我发现对于它的适用场景（如家用、小到中型企业）而言，它过于复杂，因此我不用它。我建议你参照 firewalld 网页 来向 firewalld 添加入站端口 80。你的防火墙及其配置可能跟这个有些差异，但最终的目的是允许新 Web 服务器 80 端口接收 HTTPD 连接。HTTPD 配置在 /etc/httpd/conf/httpd.conf 文件中配置 HTTPD。像下面一样在 Listen 片段中设置 IP 地址。我的新 Web 服务器 IP 地址是 192.168.0.125。Listen 192.168.0.125:80 复制（对应要迁移的网站的） VirtualHost 片段，粘贴到新服务器上 httpd.conf 文件的末尾。迁移过程只有两组数据需要迁移到新服务器 —— 数据库本身和网站目录结构。把两个目录打包成 tar 文档。cd /var ; tar -cvf /tmp/website.tar website1/ cd /var/lib ; tar -cvf /tmp/database.tar mysql/ 把两个 tar 文件复制到新服务器。我通常会把这类文件放到 /tmp 下，这个目录就是用来做这种事的。在新服务器上运行下面的命令，把 tar 文档解压到正确的目录。cd /var ; tar -xvf /tmp/website.tar cd /var/lib ; tar -xvf /tmp/database.tar WordPress 的所有文件都在 /var/website1 下，因此不需要在新服务器上安装它。新服务器上不需要执行 WordPress 安装过程。这个目录就是需要迁移到新服务器上的全部内容。最后一步是启动（或重启）mysqld 和 httpd 服务守护进程。WrodPress 不是一个服务，因此不使用守护进程的方式来启动。systemctl start mysqld ; systemctl start httpd 启动之后，你应该检查下这些服务的状态。systemctl status mysqld ● mariadb.service - MariaDB 10.5 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-08-21 14:03:44 EDT; 4 days ago Docs: man:mariadbd(8) https://mariadb.com/kb/en/library/systemd/ Process: 251783 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS) Process: 251805 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=0/SUCCESS) Process: 251856 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS) Main PID: 251841 (mariadbd) Status: "Taking your SQL requests now..." Tasks: 15 (limit: 19003) Memory: 131.8M CPU: 1min 31.793s CGroup: /system.slice/mariadb.service └─251841 /usr/libexec/mariadbd --basedir=/usr Aug 21 14:03:43 simba.stmarks-ral.org systemd[1]: Starting MariaDB 10.5 database server... Aug 21 14:03:43 simba.stmarks-ral.org mariadb-prepare-db-dir[251805]: Database MariaDB is probably initialized in /var/lib/mysql already, n> Aug 21 14:03:43 simba.stmarks-ral.org mariadb-prepare-db-dir[251805]: If this is not the case, make sure the /var/lib/mysql is empty before> Aug 21 14:03:44 simba.stmarks-ral.org mariadbd[251841]: 2021-08-21 14:03:44 0 [Note] /usr/libexec/mariadbd (mysqld 10.5.11-MariaDB) startin> Aug 21 14:03:44 simba.stmarks-ral.org systemd[1]: Started MariaDB 10.5 database server. systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Drop-In: /usr/lib/systemd/system/httpd.service.d └─php-fpm.conf Active: active (running) since Sat 2021-08-21 14:08:39 EDT; 4 days ago Docs: man:httpd.service(8) Main PID: 252458 (httpd) Status: "Total requests: 10340; Idle/Busy workers 100/0;Requests/sec: 0.0294; Bytes served/sec: 616 B/sec" Tasks: 278 (limit: 19003) Memory: 44.7M CPU: 2min 31.603s CGroup: /system.slice/httpd.service ├─252458 /usr/sbin/httpd -DFOREGROUND ├─252459 /usr/sbin/httpd -DFOREGROUND ├─252460 /usr/sbin/httpd -DFOREGROUND ├─252461 /usr/sbin/httpd -DFOREGROUND ├─252462 /usr/sbin/httpd -DFOREGROUND └─252676 /usr/sbin/httpd -DFOREGROUND Aug 21 14:08:39 simba.stmarks-ral.org systemd[1]: Starting The Apache HTTP Server... Aug 21 14:08:39 simba.stmarks-ral.org httpd[252458]: AH00112: Warning: DocumentRoot [/var/teststmarks-ral/html] does not exist Aug 21 14:08:39 simba.stmarks-ral.org httpd[252458]: Server configured, listening on: port 80 Aug 21 14:08:39 simba.stmarks-ral.org systemd[1]: Started The Apache HTTP Server. 最终的修改现在所需的服务都已经运行了，你可以把 /etc/sysconfig/iptables 文件中 HTTDP 的防火墙规则改成下面的样子：-A PREROUTING -d 45.20.209.41/255.255.255.248 -p tcp -m tcp --dport 80 \ -j DNAT --to-destination 192.168.0.125:80 然后重新加载设置的 IPTables 规则。iptables-restore /etc/sysconfig/iptables 由于防火墙规则是在防火墙主机上，因此不需要把外部 DNS 入口改成指向新服务器。如果你使用的是内部 DNS 服务器，那么你需要把 IP 地址改成内部 DNS 数据库里的 A 记录。如果你没有用内部 DNS 服务器，那么请确保主机 /etc/hosts 文件里新服务器地址设置得没有问题。测试和清理请确保对新配置进行测试。首先，停止旧服务器上的 mysqld 和 httpd 服务。然后通过浏览器访问网站。如果一切符合预期，那么你可以关掉旧服务器上的 mysqld 和 httpd。如果有失败，你可以把 IPTables 的路由规则改回去到旧服务器上，直到问题解决。之后我把 MySQL 和 HTTPD 从旧服务器上删除了，这样来确保它们不会意外地被启动。总结就是这么简单。不需要执行数据库导出和导入的过程，因为 mysql 目录下所有需要的东西都已经复制过去了。需要执行导出/导入过程的场景是：有网站自己的数据库之外的数据库；MariaDB 实例上还有其他网站，而你不想把这些网站复制到新服务器上。迁移旧服务器上的其他网站也很容易。其他网站依赖的所有数据库都已经随着 MariaDB 的迁移被转移到了新服务器上。你只需要把 /var/website 目录迁移到新服务器，添加合适的虚拟主机片段，然后重启 HTTPD。我遵循这个过程把很多个网站从一个服务器迁移到另一个服务器，每次都没有问题。via: https://opensource.com/article/21/9/migrate-wordpress作者：David Both 选题：lujun9972 译者：lxbwolf 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出