分类 技术 下的文章

一份简单的指南:如何针对 GNOME 桌面环境来创建你的自定义的深色和浅色壁纸。

GNOME 42 将备受期待的深浅主题带到 GNOME 桌面环境。它也带来壁纸的深色和浅色版本,当你切换深色或浅色主题时,它会自动地转换。

因此,默认情况下,GNOME 给予你一套预配置的深色和浅色壁纸。但是如果你想要在主题更改时自动地转换成另一种不同的壁纸要怎么做呢?

下面是如何在 GNOME 中配置和创建你自己的深浅壁纸的方法。

如何针对 GNOME 桌面环境来创建自定义的深浅壁纸

第一,确保你手边有两个版本的壁纸。一般来说,它们应该是标准的 PNG 或 JPG 图像文件。例如,我们针对这个示例使用下面的两张壁纸。

Sample light and dark wallpaper for demo

但是,如果你没有合适的深浅壁纸,或者正在查找更多的壁纸,在这篇指南的结尾,我将让你知道如何获取它们,或者如何自己准备它们。请跟着我阅读。

第二,我们需要为我们自己创建一个模式文件。壁纸的自动更换是由一个名为 adwaita.xml 的 XML 文件处理的,它定义了特定的深色和浅色的背景标记。因此,我们将为壁纸创建我们自己的 XML 文件。

为做到这一点,从 GitLab 复制 adwaita.xml 的内容,并创建一个新的 XML 文件。你能够会在这个文件中看到两个标记 – filenamefilename-dark。这两个 XML 标记包含这两个壁纸的完整的限定的路径。现在,在这两个标记下添加你的图像文件的路径,如我下图所示。。

Change the XML file

第三,把这个文件保存到 /home/<your_name>/.local/share/gnome-background-properties,(请将 <your_name> 替换为你的用户名)文件名任意。如果这里没有 gnome-background-properties 目录,就创建它。针对这个示例,我使用 my_cool_backgrounds.xml 文件名。

Save the file

这样,你就准备好了所有的东西。最后,打开 “ 设置 Settings ” 并转到 “ 外观 Appearance ” 标签页,你应该会看到一个新的壁纸选项。

选择你自己的自定义的深浅壁纸,尽情享受。

Appearance tab has now your own custom light and dark wallpaper

如何下载或制作你自己的动态壁纸

当然,你必然会想,谁有时间去查找和创建壁纸的日夜版本?这里有一些网站来向你提供预制好的动态壁纸,你可以轻松地下载和安装。

我推荐的一个网站是 dynamicwallpaper.club ,它有一些高达 6K 的极好的高质量的壁纸,可用于 macOS。你可以轻松地下载它们。

此外,如果你打算从上述网站下载,请记住该网站的图像文件是 heic 格式的,因为这个网站是针对 macOS 的。 高效视频编码 High-Efficiency Video Coding (HEIC)是苹果的专有的 HEIF( 高效图像文件 High-Efficiency Image File )专有版本。

那么,如何在 Linux 系统中转换它们? 好吧,在 Ubuntu 或 Fedora Linux 中,你需要一个驱动程序来查看和转换动态的 heic 图像文件。打开一个终端,运行下面的命令开安装驱动程序。

Ubuntu 用户 –

sudo apt install heif-gdk-pixbuf

Fedora 用户 –

sudo dnf install libheif

只针对使用 KDE Plasma 的 Fedora/Ubuntu 用户(没有这个插件的帮助,Plasma 应用程序就不能打开 heic 格式的图像文件):

sudo apt install qt-heif-image-plugin
sudo dnf install qt-heif-image-plugin

最后,使用你喜欢的图像查看器打开 heic 图像文件,并将其保存为 JPG/PNG 图像文件。

最好,不要忘记在下面的评论区告诉我,你是否能够针对 GNOME 桌面环境来创建你自己的自定义的深浅壁纸了。

Custom Light and Dark wallpaper in GNOME – transition

感谢阅读。


via: https://www.debugpoint.com/2022/04/custom-light-dark-wallpaper-gnome/

作者:Arindam 选题:lujun9972 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Gitbase 是一个由 Go 驱动的开源项目,它使得我们可以在 Git 仓库上运行 SQL 查询。

Git 已经成为了代码版本控制的事实标准。虽然 Git 已经很流行了,但想用它来对源代码仓库的历史和内容进行深度分析,仍然是一件复杂的事情。

另一方面,SQL 则是一个经过实际检验、适合查询大型代码库的的语言,毕竟 Spark 和 BigQuery 等项目都采用了 SQL 作为查询语言。

因此,在 source{d} 公司,我们顺理成章地结合了这两种技术来创建了 Gitbase:这是一个用 SQL 对 Git 仓库进行大规模分析的“代码即数据”解决方案。

Gitbase 是一个完全开源的项目,它站在一系列巨人的肩膀上,是它们使 Gitbase 的发展成为可能。本文旨在指出其中的主要部分。

Gitbase 试验场 提供了一种使用 Gitbase 的可视化方式。

使用 Vitess 解析 SQL

Gitbase 将 SQL 作为用户接口。这意味着我们需要解析基于 MySQL 协议传输的 SQL 请求,并理解它们。幸运的是,我们在 YouTube 的朋友和他们的 Vitess 项目已经实现了这一点。Vitess 是一个数据库集群系统,用于 MySQL 的水平扩展。

我们直接截取一些重要的代码片段,并把它做成了一个 开源项目。这个项目允许任何人在几分钟内编写一个 MySQL 服务器(正如我在 justforfunc 的专题:CSVQL - 用 SQL 处理 CSV 中所展示的那样)。

用 go-git 读取 Git 储存库

当成功解析了一个请求,我们还需要读取数据集里的 Git 仓库,才能够知道该如何回复它。为此,我们集成了 source{d} 最成功的仓库 go-git。go-git 是一个高度可扩展的纯 Go 语言的 Git 实现。

这使得我们能够轻松地分析以 siva 文件格式存储在磁盘上的源代码仓库(siva 也是一个 source{d} 的开源项目),或是直接使用 git clone 克隆的仓库。

使用 Enry 检测编程语言,使用 Babelfish 解析文件

Gitbase 并没有将其分析能力局限于 Git 历史记录上。它还使用(显然也是)我们的开源项目 Enry 集成了语言检测功能,并使用 Babelfish 实现了程序解析的功能。Babelfish 是一个用于通用源代码解析的自托管服务器,它可以将代码文件转化为 通用抽象语法树 Universal Abstract Syntax Trees (UAST)。

这两个功能在 Gitbase 中呈现为用户函数 LANGUAGEUAST。结合使用两个函数,许多查询请求都成为了可能,比如“找到上个月修改次数最多的函数名称”。

让它快速运行

Gitbase 经常要分析非常大的数据集,比如公共 Git 档案,其中有来自 GitHub 的 3TB 源代码(见 公告)。为了做到这一点,每份 CPU 处理能力都很重要。

这就是为什么我们又集成了另外两个项目:Rubex 和 Pilosa。

使用 Rubex 和 Oniguruma 加快正则表达式的速度

Rubex 是 Go 的 regexp 标准库包的一个准替代品。之所以还不能完成替代,是因为他们没有在 regexp.Regexp 类型上实现 LiteralPrefix 方法,不过我也是直到现在才听说这个方法。

Rubex 的高性能得归功于高度优化的 C 语言库 Oniguruma,它使用 cgo 来调用这个库。

使用 Pilosa 索引加快查询速度

索引基本上是每个关系型数据库的众所周知的特性,但 Vitess 却没有实现索引,因为它不是真正需要。

还好开源的 Pilosa 再一次拯救了我们,它是一个用 Go 实现的分布式位图索引,使得 Gitbase 可以用于大规模的数据集。Pilosa 是开源的,它极大地加快了对多个海量数据集的查询。

总结

我想通过这篇博文,亲自感谢开源社区,是他们让我们在如此短的时间内创建了 Gitbase,这是谁也没想到的。在 source{d} 公司,我们是开源的坚定信仰者,github.com/src-d 下的每一行代码(包括我们的 OKR 和投资者委员会)都可以证明这一点。

你想尝试一下 Gitbase 吗?最快、最简单的方法就是使用 source{d} 引擎。从 sourced.tech/engine 下载它,只需一个命令就能让 Gitbase 运行起来。

想了解更多吗?请查看我在 Go SF meetup 的演讲录音。

这篇文章 最初发表在 Medium 上,经授权后在此重新发布。


via: https://opensource.com/article/18/11/gitbase

作者:Francesc Campoy 选题:lkxed 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

首先,什么是 Seafile ?

Seafile 是一个自托管文件同步程序,采用客户端/服务器模式,即你有笔记本、手机等多个设备,能够连接到一个中心服务器。

不像类似 Nextcloud 或 ownCloud 这些更流行的替代品一样,Seafile 试图遵循 “只做一件事,但是要做好” 的理念。同样,Seafile 没有内置额外的类似联系人或者日历聚合的功能。

相反,Seafile 只专注于文件同步、共享及与之相关的事情,仅此而已。但正因为如此,它最终做的非常好。

使用 Docker 和 NGINX 部署 Seafile 服务器

高级教程

我们的许多教程都是针对初学者的。这篇则不然,它是为那些经常鼓捣 DIY 项目和喜欢自托管的高级用户设计的。这个教程假定你可以熟练的使用命令行,而且你至少对我们将要使用的程序有一定的了解。

虽然整个过程完全可以不使用 NGINX ,但是使用 NGINX 更加容易配置,而且在将来更加容易的自托管更多的服务。

如果你想完全使用 Docker 环境,你也可以 在 Docker 内部设置 NGINX ,但是它这会使事情变得更加复杂,并且不能够带来太多好处。同样,在本教程里也不会涉及这些。

安装设置 NGINX

在这个教程中,我会使用 Ubuntu,因此会使用 apt 来安装软件包。如果你使用 Fedora 或者一些其他非 Debian 发行版,请使用你的发行版的 包管理器

NGINX 既是一个网页浏览器,又是一个代理服务器。它将起到 Seafile 服务器和互联网之间网络连接的作用,同时也使一些任务更容易处理。

要安装 NGINX ,使用以下命令:

sudo apt install nginx

如果你想使用 HTTPS(也就是浏览器中的小挂锁),你需要安装 Certbot

sudo apt install certbot python3-certbot-nginx

下一步,你需要设置 NGINX 来连接我们之后将要设置的 Seafile 实例。

首先,运行以下命令:

sudo nano /etc/nginx/sites-available/seafile.conf

键入下方的文本到文件中:

server {
  server_name localhost;
  location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

重要: 将 server_name 一行的 localhost 替换为你要访问你的服务器的地址(比如 seafile.example.com 或者 192.168.0.0)。不确定要输入什么吗?

  • 如果你只是为了测试,使用 localhost 。这个设置将 只允许你从你的电脑访问服务器 ,仅此而已。
  • 如果你想通过你的本地 Wi-Fi 连接使用 Seafile(与你在同一 Wi-Fi 网络上),你应该键入 你的计算机 IP 地址。你也可以考虑 设置一个静态 IP 地址,尽管这不是必须的。
  • 如果你有一个公网 IP 地址,你知道它指向你的系统,就使用它。
  • 如果你有一个域名(比如 example.comexample.org)和公网 IP 地址,更改你的 DNS 设置,将域名指向你的系统的 IP 地址。这也需要将公网 IP 指向你的系统。

现在你需要复制配置文件到 NGINX 的查找目录中,然后重启 NGINX :

sudo ln -s /etc/nginx/sites-available/seafile.conf /etc/nginx/sites-enabled/seafile.conf
sudo systemctl restart nginx

如果你要安装 Cerbot,你也需要运行以下命令来设置 HTTPS :

sudo certbot

如果要重定向 HTTP 流量 到 HTTPS ,选择 2

现在可以来确认我们目前设置的一切都是否正常工作。如果你访问你的站点,你应该看到一个屏幕上写着 502 Bad Gateway 字样。

安装 Docker 和 Docker Compose

现在要进入有趣的部分了!

首先,你需要安装 DockerDocker Compose 。Docker Compose 需要利用 docker-compose.yml 文件,这将使管理多个 Docker 容器 的 Seafile 需求变得更加容易。

Docker 和 Docker Compose 可以用以下的命令来安装:

sudo apt install docker.io docker-compose

检查 Docker 是否安装并运行,运行以下命令:

sudo docker run --rm hello-world

如果你完全安装成功,你应该在终端能看到这几行文字:

如果你想避免在 docker 命令的开始添加 sudo 的话,你可以运行以下的命令将你自己添加到 docker 组:

sudo groupadd docker
sudo usermod -aG docker $USER

这个教程的其余部分假定你已经运行了以上两个命令。如果你没有运行,在所有 dockerdocker-compose 的命令都添加 sudo

安装 Seafile 服务器

这部分比之前部分明显容易的多。你所需要做的是输入一些文本到文件,然后运行一些命令。

打开一个终端,然后创建一个 Seafile 服务器用来储存内容的目录,并进入目录中:

mkdir ~/seafile-server && cd ~/seafile-server

转到你创建的目录然后运行以下命令:

nano docker-compose.yml

下一步,在弹出的窗口中键入以下文本内容:

version: '2.0'
services:
  db:
    image: mariadb
    container_name: seafile-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - ./data/mariadb:/var/lib/mysql
    networks:
      - seafile-net

  memcached:
    image: memcached
    container_name: seafile-memcached
    entrypoint: memcached -m 256
    networks:
      - seafile-net
          
  seafile:
    image: seafileltd/seafile-mc
    container_name: seafile
    ports:
      - "8080:80"
    volumes:
      - ./data/app:/shared
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD=password
      - TIME_ZONE=Etc/UTC
      - [email protected]
      - SEAFILE_ADMIN_PASSWORD=password
      - SEAFILE_SERVER_LETSENCRYPT=false
      - SEAFILE_SERVER_HOSTNAME=docs.seafile.com
    depends_on:
      - db
      - memcached
    networks:
      - seafile-net

networks:
  seafile-net:

在保存文件之前,一些参数需要更改:

  • MYSQL_ROOT_PASSWORD:更换强壮的密码,你不必记住它,所以不要尝试挑选简单的密码。如果你需要帮助生成一个,请使用 密码生成器 。我建议使用 20 位字符长度并且避免使用任何的特殊字符(!@#$%^&* 等符号)。
  • DB_ROOT_PASSWD:更改你为 MYSQL_ROOT_PASSWORD 设置的值 。
  • SEAFILE_ADMIN_EMAIL:设置管理员帐户的电子邮件地址。
  • SEAFILE_ADMIN_PASSWORD:设置管理员帐户密码。避免与MYSQL_ROOT_PASSWORD 或者 DB_ROOT_PASSWD 密码相同。
  • SEAFILE_SERVER_HOSTNAME:在 NGINX 配置中设置 Seafile 的服务器主机名。

完成之后,你可以运行 docker-compose 整个运行起来:

docker-compose up -d

可能需要花一到两分钟,取决于你的网速,因为需要拉下几个 Seafile 需要运行的几个容器。

完成以后,还需要几分钟来完成。你也可以通过以下命令来检查运行状态:

docker logs seafile

当完成了,你将会看到如下输出:

下一步,你只需要在你的浏览器里键入你设置的 SEAFILE_SERVER_HOSTNAME 的地址,然后你应该看到登录屏幕的页面。

就这样!现在一切功能齐全,准备用客户端来使用。

安装 Seafile 客户端

Seafile 移动客户端在 Google PlayF-Droid苹果商店 都是可用的。Seafile 也有 Linux、Windows 和 Mac 桌面客户端可用,可在 此处 找到。

通过 seafile-gui 软件包,可以在 Ubuntu 系统轻松获得 Seafile :

sudo apt install seafile-gui

通过 seafile-client 软件包 Seafile 也包含在 Arch 用户的 AUR 包管理器中。

结语

请尽情探索客户端及其所能提供的一切。我将在未来的一篇文章中详细阐述 Seafile 客户端的所有功能。(敬请期待 ?)

总的来说,如果有什么错误,或者你有什么问题,请在下方评论 – 我会尽我所能回应。


via: https://itsfoss.com/deploy-seafile-server-docker/

作者:Hunter Wittenborn 选题:lujun9972 译者:hwlife 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我们对最近发布的 Linux Mint Debian Edition 5(LMDE 5)的性能、稳定性和用户友好性等方面进行了评测。这里是我们的发现。

在 Linux Mint Debian Edition LMDE 4(Debbie)发布两年多后,Linux Mint 团队宣告了 Linux Mint Debian Edition LMDE 5(LMDE 5)的发布。LMDE 5 基于 Debian 11 Bullseye ,它带来了长期支持的 Linux 内核 5.10 和 Debian 软件包源。除内核版本以外,大多数的应用程序和软件包与 Linux Mint 20.3 几乎完全相同。

让我们深入了解一下。

LMDE 5 评测

我们测试 Linux Mint Debian Edition 5(LMDE 5)是在现有的较旧的硬件下:

  • 英特尔酷睿 i3 第一代
  • 4GB DDR3 内存
  • 博通芯片
  • 英伟达® GeForce® 315M
  • 固态硬盘

ISO 下载、现场介质和安装

从新设计的 Linux Mint 网站找到并下载 ISO 文件是很容易的。 现场介质 Live media 启动很顺利,通过桌面上的安装图标启动了安装程序。

LMDE 使用的一款修改版的 Debian 安装器。它不是 Calamares 。普通的 Debian 安装器是很难操作的,[在我看来] 有点 让新用户感到困惑 。但是,Linux Mint 团队使其非常容易安装,只需几个步骤,并从 Debian 安装器中移除了所有使人困惑的选项。

你只需要提供安装位置、键盘布局、名字和密码,就可以开始安装了。安装器的分区系统使用 GParted ,它很方便好用。

因此,在我的测试的虚拟机和物理机硬件中,安装过程都很顺利。

在物理机系统中安装花费了 4 到 5 分钟,而虚拟机系统中的安装时间约为 3 分钟。

第一印象

Linux Mint Debian Edition 5  Desktop

如果你熟悉 Linux Mint 早期的 Cinnamon 桌面,那么你不会在这个 Debian 版本中找到什么不同。它们是一样的。如果你是第一次使用 Linux Mint 的 Cinnamon 桌面环境,那么在你完成你的安装后,你会看到一个漂亮而干净的桌面。

桌面图标、完美调整过的颜色和主题、底部任务栏、系统托盘,这一切都配合有序,让你能够立刻上手。

不管你使用低端还是高端的硬件,LMDE 都能快速响应,应用程序能够很好的工作。应用程序的切换和整体桌面的响应都很可靠。

你得到的是经过良好测试的应用程序和软件包,而基于 Debian 的稳定性,很少会出现故障。这意味着不必担心软件包的冲突、更新缺失,以及 Linux 系统的常见问题。

预装的应用程序

Linux Mint(不仅仅是 Debian 版本)的优势之一是它的预装的应用程序。许多 Linux 发行版由于 ISO 大小等原因,在 ISO 安装程序中不包括必要的应用程序。

但是,Linux Mint 团队全心全意为它们的用户考虑,打包了所有你需要的必要应用程序。这照顾到了大多数用户的需求。它有助于减少最终用户在安装 LMDE 5 后搜索和安装兼容应用程序方面的负担。

例如,在 LMDE 5 中,已默认安装下面的必备软件,随时待用:

  • 绘图应用
  • 多媒体:Celluloid 媒体播放器、Hypnotix、Rythmbox
  • Torrent 客户端:Transmission 3.0
  • 完整的办公套件:LibreOffice 7.0
  • Email 客户端:Thunderbird 91.0
  • 网页浏览器:Firefox 97.0

这不是所有。对于下面的所有的具体使用情况,你都会得到一个专门的原生应用程序。用户不需要为这些寻找一个单独的应用程序:

  • 屏幕截图和屏幕保护程序
  • 减少眼睛疲劳的工具
  • USB 格式化工具和镜像写入器
  • 便签
  • Synaptic 软件包管理器
  • 系统备份和恢复
  • 防火墙工具

LMDE5 的性能表现怎么样?

看到一个发行版按照预期的表现,总是令人感兴趣的。而 LMDE 5 的性能表现远超预期。

在空闲状态下,它消耗 750 MB 的内存和 2% 的 CPU 。

Performance During the light workload

接下来,我使用下面的任务让它完成繁重的工作负载:

  • Firefox(打开三个标签页,其中一个播放 YouTube 视频)
  • LibreOffice Calc(打开一个表格)
  • 绘图应用程序(打开一个实例)
  • 设置
  • 一个终端窗口
  • 文件管理器

在上述的工作负载中,它消耗了大约 1.5 GB 的内存和 14% 的 CPU 。显然,大部分的资源都被 Firefox 消耗了。

Performance During heavy workload

在我看来,这是一个完美的指标,而且对旧硬件进行了很好的优化分配。上述指标是在物理机系统上测量的。

连接性

连接性是任何操作系统的不可或缺的一部分。LMDE 5 能够连接到 Wi-Fi(使用一款老旧的博通芯片)和连接到蓝牙音箱,而不需任意的额外调整。

在我的测试期间,音量控制与蓝牙守护进程配合得很好。

此外,我们也测试了 USB 接口设备的热插拔,它们可以自动侦测和挂载,而没有遇到任何问题。

所以,没有什么意外,这也是意料之中的。

有什么错误吗?

我在测试期间没有遇到任何错误。一切都运行良好。

但是当我关闭我的物理测试系统的笔记本盖板时,我发现一个错误。在它进入待机状态后,不能将其唤醒。我无法看到登录屏幕,屏幕是黑色的,没有任何光标。我必须因重启才能进入系统。

这可能是我测试设备上的特定硬件设备的问题。我相信它在新的硬件系统上不会有任何的问题。

总结

总结一下 LMDE 5 的评测,它显然是最稳定、最优化的 Linux 发行版。如果你计划在未来两年或更长的时间段内使用一款用于日常用途的系统,你可以信赖这个版本。因此,如果你需要一款非基于 Ubuntu 的稳定的、快速的、低维护率的长期日用系统,并运行在你的旧机器或新机器上,这会是一个完美的选择。请试试。

你可以 在官方网站上 下载 LMDE 5 。

感谢阅读。


via: https://www.debugpoint.com/2022/03/linux-mint-debian-edition-5-review/

作者:Arindam 选题:lujun9972 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

了解对新的储存设备分区的基础知识,然后下载我们的速查表,让信息近在咫尺。

 title=

在 21 世纪,我们往往认为数据存储是理所当然的。我们有许多存储介质,相对价格便宜,而且有许多不同的可用类型。然而,不论你获得的免费云存储空间有多少,没有比有一个物理硬盘空间来存储重要的数据更好了(或容量真的很大的,而当你又在一个慢速网络上时)。然而,没有几块硬盘买回来就是现成的,至少在理想的状况下可以直接使用的。无论你是买了一块新硬盘,还用不同分区安装一个系统,你需要知道怎么在 Linux 上为磁盘分区。

这篇文章介绍了 GNU Parted ,它磁盘分区最好的工具之一。如果你偏向使用图形化程序,而不算终端命令行,请阅读我的《为 Linux 格式化驱动器》这篇文章。

磁盘标签、分区和文件系统

技术上来说,一个硬盘驱动器不需要很多软件,就可用作存储设备。然而,在没有分区表和文件系统等现代惯例的情况下使用硬盘是困难的、不切实际的,而且对你的数据不安全。

关于硬盘驱动器,这里有三个你需要知道的重要概念:

  • 磁盘标签 disk label (或者 分区表 partition table )是放置在磁盘驱动器起始位置的元数据,它告诉计算机可用的存储是何种类型、以及它在磁盘驱动器的位置等信息。
  • 分区 partition 是一个识别文件系统位置的边界。举个例子,如果你有一个 512GB 的硬盘,你可以用占用所有磁盘容量(512GB)分成一个分区,或者分成两个分区,每个占用 256GB ,或者分成三个分区,占用各种不同大小的空间等等。
  • 文件系统 filesystem 是一个硬盘驱动器和计算机两者约定俗成的存储方案。计算机必须知道怎样读取文件系统来拼凑存储在驱动器上的数据,并且必须知道怎样写入数据到文件系统并保持数据的完整性。

GNU Parted 程序管理着前两个概念:磁盘标签和分区。Parted 对文件系统有所了解,但是它把文件系统的实现细节交给了其他类似 mkfs 这样的工具。

下载 GNU Parted 速查表

确定磁盘驱动器的位置

使用 GNU Parted 之前,你必须确定你的驱动器在你的系统上的位置。首先,将你要格式化的磁盘驱动器连接到你的系统,然后用 parted 命令查看连接到你的计算机的设备:

$ parted /dev/sda print devices
/dev/sda (2000GB)
/dev/sdb (1000GB)
/dev/sdc (1940MB)

你最新连接设备的名称在字母表上晚于连接时间更长的设备。举个例子,/dev/sdc 最有可能是我刚刚连接的磁盘。我能通过它的容量大小来确认,相比于我的工作站上的主要驱动器的 TB 大小来说,因为我知道我插入的 U 盘只有 2GB(1940MB,足够接近)大小。如果你不能确定,你可以得到的更多关于你想要分区的驱动器的信息:

$ parted /dev/sdc print
Model: Yoyodyne Tiny Drive 1.0 (scsi)    
Disk /dev/sdc: 1940MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2048kB  1024kB  BS           Bloat  Hidden
 2      2049kB  1939MB  1937MB  FAT32        MyDrive

有些驱动器比其他驱动器有更多的元数据。这个磁盘表明它的物理驱动器品牌是 Yoyodyne ,此外,在磁盘的起始处包含了一个小的隐藏分区,后面是一个兼容 Windows 的臃肿的 FAT32 分区。这确实是我要重新打算格式化的驱动器。

继续之前,确认 你已经确定了要分区的正确驱动器。 对错误的驱动器重新分区会导致数据丢失。 为了安全起见,在本文中所有具有潜在破环性的命令都指向在你的系统中不太可能有的 /dev/sdX 设备。

创建磁盘标签(或者分区表)

要在磁盘上创建一个分区,驱动器必须要有一个 磁盘标签 disk label 。磁盘标签也被叫做 分区表 partition table ,所以 Parted 对两个术语都接受。

要创建一个磁盘卷标,使用 mklabelmktable 子命令:

$ parted /dev/sdX mklabel gpt

这个命令在 /dev/sdX 的驱动器前面创建了一个 gpt 标签,删除了任何可能存在的标签。这是一个快速的过程,因为所有被替换的信息都是关于分区的元数据。

创建分区

要在磁盘创建分区,使用 mkpart 子命令,后跟可选的分区名称,再跟分区的开始和结束位置。如果你在磁盘上只需要一个分区,那么大小调整是容易的:开始位置输入 1 ,结束位置输入 100% 。使用 --align opt 参数允许 Parted 调整分区边界位置便于磁盘获得最佳性能:

$ parted /dev/sdX --align opt \
mkpart example 1 100%

print 子命令查看你的新分区:

$ parted /dev/sdX print
Model: Yoyodyne Tiny Drive 1.0 (scsi)
Disk /dev/sdi: 1940MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size  
 1      1049kB  1939MB  1938MB

你不必将整个磁盘用作一个分区。分区的优势是在一个磁盘上可以存在多个文件系统,它们之间不会相互干扰。在确定分区大小的时候,你可以使用 unit 子命令来设置你想用的测量方法。Parted 可以理解 扇区 sector 柱面 cylinder 磁头 head 字节 byte 、KB、MB、GB、TB 和百分比。(LCTT 译注:具体使用方法请参阅手册页)

你也可以指定你打算使用的分区的文件系统。这并不会创建文件系统,但是它为你以后方便使用提供了元数据。

将磁盘对半分,一个是 XFS 文件系统,另一个是 EXT4 文件系统:

$ parted /dev/sdX --align opt \
mkpart xfs 1 50%
$ parted /dev/sdX --align opt \
mkpart ext4 51% 100%

命名分区

除了标记分区用于什么文件系统之外,你也可以为每个分区命名。一些文件管理器和工具可以读取分区名称,能够帮助你区分驱动器。例如,我经常有几个不同的驱动器连接到我的媒体工作站,每个属于一个不同的项目。当创建这些驱动器的时候,我同时命名了分区和文件系统,这样,无论我怎么看我的系统,有重要数据的位置都会被清楚地标示出来。

要命名一个分区,你必须知道它的序号:

$ parted /dev/sdX print
[...]
Number  Start   End     Size   File system  Name     Flags
 1      1049kB  990MB   989MB  xfs          example
 2      1009MB  1939MB  930MB  ext4         noname

要命名分区 1:

$ parted /dev/sdX name 1 example
$ parted /dev/sdX print
[...]
Number  Start   End     Size   File system  Name     Flags
 1      1049kB  990MB   989MB  xfs          example
 2      1009MB  1939MB  930MB  ext4         noname

创建文件系统

要让你的驱动器能够正常使用,你必须在新分区上创建一个文件系统。GNU Parted 并不做这些,因为它只是一个分区管理器。在磁盘上创建文件系统的 Linux 命令是 mkfs,但也有一些有用的工具可以让你用来创建特定类型的文件系统。例如,mkfs.ext4 创建 EXT4 文件系统,mkfs.xfs 创建 XFS 文件系统等等。

你的分区位于磁盘驱动器的“内部” ,所以你不是在 /dev/sdX 上创建文件系统,而是在 /dev/sdX1 上为第一个分区创建文件系统,在 /dev/sdX2 上为第二个分区创建,以此类推。

这里是一个创建 XFS 文件系统的例子:

$ sudo mkfs.xfs -L mydrive /dev/sdX1

下载我们的速查表

Parted 是一个灵活而强大的工具。你可以发出命令,如本文所示的那样,或者激活一个交互模式以不断 “连接” 你指定的驱动器:

$ parted /dev/sdX
(parted) print
[...]
Number  Start   End     Size   File system  Name     Flags
 1      1049kB  990MB   989MB  xfs          example
 2      1009MB  1939MB  930MB  ext4         noname

(parted) name 1 mydrive
(parted)

如果你打算经常使用 Parted ,下载我们的 GNU Parted 速查表,让信息近在咫尺。


via: https://opensource.com/article/21/4/linux-parted-cheat-sheet

作者:Seth Kenlon 选题:lujun9972 译者:hwlife 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

用 systemd-analyze 洞悉并解决 Linux 启动性能问题。

 title=

系统管理员的一部分工作就是分析系统性能,发现并解决引起性能不佳、启动时间长的问题。系统管理员也需要去检查 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 译注:一个办公文档软件)来渲染一幅图形。这张图形很大,你需要放到很大才能看清细节。这里是它的一小部分:

 title=

图中时间轴上零点(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)
[email protected]
After=systemd-user-sessions.service [email protected] 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 及其生态系统的其他好文章,大部分都是基于这些文章的。


via: https://opensource.com/article/20/9/systemd-startup-configuration

作者:David Both 选题:lujun9972 译者:jiamn 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出