分类 技术 下的文章

最近升级的软件引起问题了?虽然你总是可以调查问题以解决它,但有时,回到以前的工作版本可以节省时间和精力。如果新的版本引入了一个 bug,你可以在你这一边什么都不做,对吗?

好消息是,你可以在 Ubuntu 和 Debian 中轻松地降级 apt 软件包。

你所要做的就是像这样使用 apt 命令:

sudo apt install package_name=package-version-number

这似乎很容易,但你如何获得确切的版本号?还有哪些旧版本被支持?你可以通过以下方式获得这个细节:

sudo apt-cache policy package_name

让我用一个现实生活中的例子来解释这些。

降级 apt 包

最近,我正在更新承载 It's FOSS 社区论坛的 Ubuntu 服务器。

我做了通常的 apt update && apt upgrade,在更新安装时,事情变得糟糕。

很明显,最新版本的 Docker 不支持 aufs 存储驱动。为了减少停机时间,我选择了降级到以前的 Docker 版本。

检查当前安装的软件包版本:

Installed Docker version

然后检查可以安装的可用版本:

sudo apt-cache policy package_name

它可能会抛出一个巨大的列表,或者只是一个小列表:

All installable versions of an apt package

如果它显示至少有一个比当前版本更早的版本,你就很幸运了。

现在,你可能认为一个软件包的版本号将只由数字组成。但情况可能并不总是这样。

基本上,你复制 500(优先级数字)之前的全部内容。

brave-browser:
  Installed: 1.48.158
  Candidate: 1.48.164
  Version table:
     1.48.164 500
        500 https://brave-browser-apt-release.s3.brave.com stable/main amd64 Packages
 *** 1.48.158 500
        500 https://brave-browser-apt-release.s3.brave.com stable/main amd64 Packages
        100 /var/lib/dpkg/status
     1.47.186 500
        500 https://brave-browser-apt-release.s3.brave.com stable/main amd64 Packages
     1.47.171 500
        500 https://brave-browser-apt-release.s3.brave.com stable/main amd64 Packages
     1.46.153 500

当你得到了软件包的编号,用它来降级已安装的软件包,像这样:

sudo apt install package_name=package-version-number

Downgrading an installed package via apt-get command

当然,你会看到一个关于降级软件包的警告。

Downgrading apt package

但是当这个过程完成,你的软件包就会被降级到给定的旧版本。

所以,也许要保留它?

所以,你刚刚学会了降级 apt 软件包。但如果你不注意的话,该软件包会在下一次系统更新时再次升级。

不希望这样吗?你可以 阻止一个软件包被更新。像这样使用 apt-mark 命令:

sudo apt-mark hold package_name

我希望这个快速技巧能帮助你在需要时降级 apt 软件包。如果你有问题或建议,请告诉我。


via: https://itsfoss.com/downgrade-apt-package/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

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

学习如何以及何时在 Lua 中使用 while 和 repeat until 循环。

控制结构是编程语言的一个重要特征,因为它们使你能够根据通常在程序运行时动态建立的条件来指导程序的流程。不同的语言提供了不同的控制,在 Lua 中,有 while 循环、for 循环和 repeat until 循环。这篇文章涵盖了 whilerepeat until 循环。由于它们的灵活性,我在一篇 单独的文章 中介绍 for 循环。

条件是由一个使用运算符的表达式来定义的,运算符是你在数学课上可能认识的符号的一个花哨的术语。Lua 中有效的运算符有:

  • == 等于
  • ~=不等于
  • < 小于
  • > 大于
  • 小于或等于
  • >= 大于或等于

这些被称为关系运算符,因为它们比较两个值之间的关联。还有一些逻辑运算符,其含义与英语中的含义相同,可以纳入条件中,进一步描述你想检查的状态:

  • and
  • or

下面是一些条件的例子:

  • foo > 3:变量 foo 是否大于 3?foo 必须是 4 或更大才能满足这个条件。
  • foo >= 3foo 是否大于或等于 3?foo 必须是 3 或更大才能满足这个条件。
  • foo > 3 and bar < 1foo 是否大于 3 而 bar 小于 1?要满足这个条件,foo 变量必须在 bar 为 0 的同时为 4 或更大。
  • foo> 3 or bar < 1foo 是否大于 3?或者,bar 是否小于 1?如果 foo 是 4 或更大,或者 bar 是 0,那么这个条件就是真的。如果 foo 是 4 或更大,而 bar 是 0,会怎样?答案出现在本文的后面。

While 循环

只要满足某个条件,while 循环就会执行指令。例如,假设你正在开发一个应用来监测正在进行的僵尸末日。当没有剩余的僵尸时,就不再有僵尸末日了:

zombie = 1024

while (zombie > 0) do
  print(zombie)
  zombie = zombie-1
end

if zombie == 0 then
  print("No more zombie apocalypse!")
end

运行代码,看僵尸消失:

$ lua ./while.lua
1024
1023
[...]
3
2
1
No more zombie apocalypse!

until 循环

Lua 还有一个 repeat until 循环结构,本质上是一个带有 catch 语句的 while 循环。假设你在从事园艺工作,你想追踪还剩下什么可以收获的东西:

mytable = { "tomato", "lettuce", "brains" }
bc = 3

repeat
   print(mytable[bc])
   bc = bc - 1
until( bc == 0 )

运行代码:

$ lua ./until.lua
brains
lettuce
tomato

这很有帮助!

无限循环

一个无限循环有一个永远无法满足的条件,所以它无限地运行。这通常是一个由错误逻辑或你的程序中的意外状态引起的错误。例如,在本文的开头,我提出了一个逻辑难题。如果一个循环被设定为 foo > 3 or bar < 1 运行 ,那么当 foo 为 4 或更大而 bar 为 0 时,会发生什么?

下面是解决这个问题的代码,为了以防万一,还使用了 break 语句安全捕获:

foo = 9
bar = 0

while ( foo > 3 or bar < 1 ) do
  print(foo)
  foo = foo-1

  -- safety catch
  if foo < -800000 then
    break
  end
end

你可以安全地运行这段代码,但它确实模仿了一个意外的无限循环。有缺陷的逻辑是 or 运算符,它允许这个循环在 foo 大于 3 和 bar 小于 1 的情况下继续进行。and 运算符有不同的效果,但我让你去探索。

无限循环实际上有其用途。图形应用使用技术上的无限循环来保持应用程序窗口的开放。我们没有办法知道用户打算使用这个程序多久,所以程序无限地运行,直到用户选择退出。在这些情况下使用的简单条件显然是一个总是被满足的条件。下面是一个无限循环的例子,为了方便起见,还是内置了一个安全陷阱:

n = 0

while true do
  print(n)
  n = n+1

  if n > 100 then
  break
  end
end

条件 while true 总是被满足,因为 true 总是为真。这是比写 while 1 == 1 或类似的永远为真的简洁方式。

Lua 中的循环

从示例代码中可以看出,尽管有不同的实现方式,但循环基本上都是朝着同一个目标工作。选择一个对你来说有意义的,并且在你需要执行的处理过程中效果最好的。以防万一你需要它:终止失控循环的键盘快捷键是 Ctrl+C


via: https://opensource.com/article/23/2/lua-loops-while-repeat-until

作者:Seth Kenlon 选题:lkxed 译者:geekpi 校对:wxy

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

Planby 是一个 JavaScript 组件,用于帮助创建流媒体服务、音乐和体育赛事等的时间表、时间线和电子节目指南(EPG)。

几年来,我在电视在线和视频点播(VOD)行业工作。在开发一个调度器网络应用时,我意识到在电子节目指南(EPG)和调度方面没有好的解决方案。诚然,对于大多数网络开发者来说,这是一个小众的功能,但对于电视应用来说,这是一个常见的需求。我看到并分析了许多网站实现了他们自己的 EPG 或时间表,我经常想,为什么每个人似乎都在发明他们自己的解决方案,而不是致力于开发一个大家都能使用的共享解决方案。这就是我开始开发 Planby 的时候。

Planby 是一个 React(JavaScript)组件,帮助你为在线电视和视频点播(VOD)服务、音乐和体育赛事等创建计划、时间线和电子节目指南(EPG)。Planby 使用自定义的虚拟视图,允许你对大量的数据进行操作,并以友好和有用的方式呈现给你的观众。

Planby 有一个简单的 API,你可以与第三方 UI 库集成。组件的主题是根据应用设计的需要定制的。

时间线性能

实现时间线功能时,最重要的是性能。你有可能在许多不同频道处理无穷无尽的数据流。应用可能不断地在刷新、移动和滚动。你希望用户与内容的互动是流畅的。

还有一个潜在的问题是设计不当。有时,一个应用以列表的形式实现 EPG 时间线,你必须垂直滚动,这意味着你必须点击按钮在时间上左右移动,这很快就会变得很累。更重要的是,有时与 EPG 互动的自定义功能(如评级、选择你最喜欢的频道、从右到左(RTL)阅读等)根本无法使用,或者即便它们可用,也会导致性能问题。

我经常面临的另一个问题是,应用的数据传输过于冗长。当一个应用在你滚动浏览 EPG 的时候请求数据,时间线会感觉很慢,甚至会崩溃。

什么是 Planby?

这就是 Planby 的作用。Planby 是从头开始建立的,使用 React 和 Typescript 以及少量的资源。它使用一个自定义的虚拟视图,允许你对大量的数据进行操作。它向用户显示节目和频道,并根据时间和指定频道自动定位所有元素。当一个资源不包含任何内容时,Planby 会计算定位,使时间段正确对齐。

Planby 有一个简单的界面,包括所有必要的功能,如侧边栏、时间轴本身、愉快的布局和实时节目刷新。此外,还有一个可选的功能,允许你隐藏任何你不想包括在布局中的元素。

Planby 有一个简单的 API,允许你作为开发者实现你自己的项目以及用户的偏好。你可以使用 Planby 的主题来开发新的功能,也可以制作自定义的样式来配合你选择的设计。你可以很容易地整合其他功能,如日历、评级选项、用户最喜欢的列表、滚动、“现在” 按钮、录制计划、追播内容等等。更重要的是,你可以添加自定义的全局样式,包括 RTL 功能。

最重要的是,它在 MIT 许可下开源。

尝试 Planby

如果你想尝试一下 Planby,或者只是想了解一下它,请访问 Git 仓库。在那里,我已经有了一些例子,你可以阅读文档了解详情。该软件包也可以通过 npm 获得。


via: https://opensource.com/article/22/11/react-timeline-planby

作者:Karol Kozer 选题:lkxed 译者:geekpi 校对:wxy

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

探索 Tcl 的基本语言结构,包括用户输入、输出、变量、条件评估、循环和简单函数。

我的 Tcl 之旅始于最近需要将一个困难的基于 Java 的命令行配置工具自动化。我使用 Ansible 做了一些自动化编程,偶尔也会使用 expect 模块。坦率地说,我发现这个模块的作用有限,原因包括:难以对相同的提示进行排序,难以捕捉到额外步骤的值,控制逻辑的灵活性有限,等等。有时你可以用 shell 模块来代替。但有时你会遇到那种特立独行、过于复杂的命令行程序,似乎无法实现自动化。

就我而言,我正在自动安装我公司的一个程序。最后的配置步骤只能通过命令行来完成,通过几个不规范的、重复的提示和需要捕捉的数据输出。好在传统的 Expect 是唯一的答案。要使用 Expect 的基本功能,并不需要对 Tcl 有很深的了解,但你了解的越多,你就能从它那里得到更多的力量。这是后续文章的话题。现在,我探讨一下 Tcl 的基本语言结构,包括用户输入、输出、变量、条件判断、循环和简单函数。

安装 Tcl

在 Linux 系统上,我使用这个:

# dnf install tcl
# which tclsh
/bin/tclsh

在 macOS 上,你可以使用 Homebrew 来安装最新的 Tcl:

$ brew install tcl-tk
$ which tclsh
/usr/local/bin/tclsh

在 Tcl 中猜数字

从创建基本的可执行脚本 numgame.tcl 开始:

$ touch numgame.tcl
$ chmod 755 numgame.tcl

接着在你的文件中开始编码,标题是通常的 #!:

#!/usr/bin/tclsh

这里有一些关于 Tcl 的简单介绍,以便与本文一起追踪。

第一点是,Tcl 处理的都是字符串。变量通常被当作字符串处理,但可以自动切换类型和内部表示(这一点你通常无法看到)。函数可以把它们的字符串参数解释为数字(expr),并且只通过值传递。字符串通常使用双引号或大括号来划分。双引号允许变量扩展和转义序列,而大括号则完全没有扩展。

第二点是 Tcl 语句可以用分号隔开,但通常不这样。语句行可以用反斜杠字符来分割,然而,典型的做法是将多行语句放在大括号内,以避免需要这样做。大括号只是更简单,下面的代码格式也反映了这一点。大括号允许对字符串进行延迟求值。在 Tcl 进行变量替换之前,值被传递给函数。

最后,Tcl 使用方括号进行命令替换。方括号之间的任何东西都会被送到 Tcl 解释器的一个新的递归调用中进行求值。这对于在表达式中间调用函数或为函数生成参数是很方便的。

过程

虽然在这个游戏中没有必要,但我先举一个在 Tcl 中定义函数的例子,你可以在以后使用:

proc used_time {start} {
    return [expr [clock seconds] - $start]
}

使用 proc 将其设定为一个函数(或过程)定义。接下来是函数的名称。然后是一个包含参数的列表;在本例中是一个参数 {start} ,然后是函数主体。注意,主体的大括号在这一行开始,它不能在下面一行。该函数返回一个值。返回值是一个复合求值(方括号),它从读取系统时钟 [clock seconds] 开始,并进行数学运算以减去 $start 参数。

设置、逻辑和完成

你可以在这个游戏的其余部分增加更多的细节,进行一些初始设置,对玩家的猜测进行迭代,然后在完成后打印结果:

set num [expr round(rand()*100)]
set starttime [clock seconds]
set guess -1
set count 0

puts "Guess a number between 1 and 100"

while { $guess != $num } {
    incr count
    puts -nonewline "==> "
    flush stdout
    gets stdin guess

    if { $guess < $num } {
        puts "Too small, try again"
    } elseif { $guess > $num } {
        puts "Too large, try again"
    } else {
        puts "That's right!"
    }
}

set used [used_time $starttime]

puts "You guessed value $num after $count tries and $used elapsed seconds"

前面的 set 语句建立变量。前两个求值表达式用于识别 1 到 100 之间的随机数,下一个保存系统时钟启动时间。

putsgets 命令用于来自玩家的输出和输入。我使用的 puts 暗示输出是标准输出。gets 需要定义输入通道,所以这段代码指定 stdin 作为用户的终端输入源。

puts 省略行末终止符时,需要 flush stdout 命令,因为 Tcl 缓冲了输出,在需要下一个 I/O 之前可能不会被显示。

从这里开始,while 语句说明了循环控制结构和条件逻辑,需要给玩家反馈并最终结束循环。

最后的 set 命令调用我们的函数来计算游戏的耗时秒数,接着是收集到的统计数字来结束游戏。

玩吧!

$ ./numgame.tcl
Guess a number between 1 and 100
==> 100
Too large, try again
==> 50
Too large, try again
==> 25
Too large, try again
==> 12
Too large, try again
==> 6
Too large, try again
==> 3
That's right!
You guessed value 3 after 6 tries and 20 elapsed seconds

继续学习

当我开始这个练习时,我怀疑回到 90 年代末的流行语言对我有多大的帮助。一路走来,我发现 Tcl 有几处让我非常喜欢的地方,我最喜欢的是方括号内的命令求值。与其他许多过度使用复杂闭包结构的语言相比,它似乎更容易阅读和使用。我以为它是一种 已消亡的语言,但实际上它仍在蓬勃发展,并在多个平台上得到支持。我学到了一些新的技能,并对这种古老的语言有了新的认识。

https://www.tcl-lang.org 上查看官方网站。你可以找到最新的源代码、二进制发行版、论坛、文档,以及仍在进行的会议信息的参考。


via: https://opensource.com/article/23/2/learn-tcl-writing-simple-game

作者:James Farrell 选题:lkxed 译者:geekpi 校对:wxy

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

如果你在 Ubuntu 22.04 及以后的版本中使用 PPA 或添加外部仓库,你有可能会看到这样的信息:

W: https://packagecloud.io/slacktechnologies/slack/debian/dists/jessie/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

ubuntu key is stored legacy

首先,这不是一个错误,而是一个警告信息。警告并不会导致程序停止工作。即使你在更新过程中看到这个警告信息,你也可以继续升级你的系统。

如果你不想看到这个警告信息,你可以采取一些手动步骤来摆脱它。

有两种方法;正确的方法和快速而不优雅的方法。阅读这两种方法,看看你对哪一种感到满意。

方法 1:导入密钥(正确但复杂的方法)

首先,列出所有添加到你系统中的 GPG 密钥。

sudo apt-key list

这将显示一个存储在你系统中的巨大的密钥列表。你在这里要做的是寻找与警告信息相关的密钥。

abhishek@itsfoss:~$ sudo apt-key list
[sudo] password for abhishek: 
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
/etc/apt/trusted.gpg
--------------------
pub   rsa4096 2014-01-13 [SCEA] [expired: 2019-01-12]
      418A 7F2F B0E1 E6E7 EABF  6FE8 C2E7 3424 D590 97AB
uid           [ expired] packagecloud ops (production key) <abhishek@itsfoss>

pub   rsa4096 2016-02-18 [SCEA]
      DB08 5A08 CA13 B8AC B917  E0F6 D938 EC0D 0386 51BD
uid           [ unknown] https://packagecloud.io/slacktechnologies/slack (https://packagecloud.io/docs#gpg_signing) <abhishek@itsfoss>
sub   rsa4096 2016-02-18 [SEA]

/etc/apt/trusted.gpg.d/audio-recorder-ubuntu-ppa.gpg
----------------------------------------------------
pub   rsa4096 2015-08-30 [SC]
      42EF 41ED 9813 B713 D4F1  F06D 5CF1 2638 ACF9 669F
uid           [ unknown] Launchpad PPA for Team audio-recorder

/etc/apt/trusted.gpg.d/danielrichter2007-ubuntu-grub-customizer.gpg
-------------------------------------------------------------------
pub   rsa1024 2010-10-08 [SC]
      59DA D276 B942 642B 1BBD  0EAC A8AA 1FAA 3F05 5C03

你要怎么做?仔细阅读该信息:

W: https://packagecloud.io/slacktechnologies/slack/debian/dists/jessie/InRelease: Key is stored in legacy

在我的例子中,仓库有 packagecloudslacktechnologies 等关键词。它显示在 apt-key 列表输出的顶部。在你的情况下,你可能需要滚动一下。

在这种罕见的情况下,由 Slack 添加的外部仓库,有两个 GPG 密钥。其中一个已经过期,我会忽略它。你可能不会有这样的情况。

你应该看到 pub 后一行的最后 8 个字符(不包括空格):

/etc/apt/trusted.gpg
--------------------
pub   rsa4096 2014-01-13 [SCEA] [expired: 2019-01-12]
      418A 7F2F B0E1 E6E7 EABF  6FE8 C2E7 3424 D590 97AB
uid           [ expired] packagecloud ops (production key) <abhishek@itsfoss>

pub   rsa4096 2016-02-18 [SCEA]
      DB08 5A08 CA13 B8AC B917  E0F6 D938 EC0D 0386 51BD
uid           [ unknown] https://packagecloud.io/slacktechnologies/slack (https://packagecloud.io/docs#gpg_signing) <abhishek@itsfoss>

因此,从 DB08 5A08 CA13 B8AC B917 E0F6 D938 EC0D 0386 51BD 这行中,我将提取最后8个字符 0386 51BD,去掉空格,然后用它来导入 /etc/apt/trusted.gpg.d 目录下专用文件中的 GPG 密钥:

sudo apt-key export 038651BD | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/slack.gpg

我在这里创建了一个新的文件 slack.gpg,以防你没有注意到它。我把它命名为 slack.gpg 是因为它与我之前安装的 Slack 应用有关。文件名并不重要,但它对识别有好处。

如果命令运行成功,你将不会看到任何信息。你可以通过检查新创建的 gpg 文件是否存在来验证。

import gpg key to trusted ubuntu

再次运行更新,现在你应该不会再看到警告信息了。

方法 2:复制到 trusted.gpd.d 目录中(快速而不优雅的方法)

如果你觉得手动做上面的事情不舒服,那么,你可以忽略这个警告信息。我的意思是,忽略它总是一种选择。

另一个选择是把 /etc/apt/trusted.gpg 文件复制到 /etc/apt/trusted.gpg.d 目录。毕竟,Ubuntu 只是抱怨说它需要 /etc/apt/trusted.gpg.d 目录下的 GPG 密钥。

你仍然要使用终端。打开它并使用以下命令:

sudo cp /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d

现在,如果你运行更新,你就不会再看到 “Key is stored in legacy trusted.gpg keyring” 的警告信息。

quick dirty way to fix apt key stored legacy

总结

我曾经写过一篇关于 弃用 apt-key 的详细文章。显然,那篇文章让一些读者感到困惑,因此我写了这篇文章,给他们提供摆脱该信息的直接步骤。

正如我之前所说,这是一个警告信息,目前可以忽略。解决这个问题的责任在于外部软件开发者和 Ubuntu 开发者。外部软件开发者应该确保他们的 GPG 密钥不再被添加到 /etc/apt/trusted.gpg 文件中。

终端用户不应该为他们的懒惰而承担痛苦。

那么,你是用哪种方法来摆脱 “key is stored in legacy” 的警告信息的呢?第一个方法还是第二个方法?


via: https://itsfoss.com/key-is-stored-in-legacy-trusted-gpg/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

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

本指南将详细解释你在 Arch Linux 中安装 MATE 桌面所需的步骤。

本指南分为两部分。第一部分讨论安装基础 Arch 系统。第二部分是在 Arch Linux 上安装完整的 MATE 桌面环境。

本文在以下版本中进行了测试:MATE 1.24 和 MATE 1.26。

什么是 MATE 桌面?

当 GNOME 桌面从 GNOME 2 改变方向到 GNOME 3 时,改变了用户交互和界面,MATE 桌面仍然延续了“较旧的”或者说“传统的” GNOME 2 的开发方向。因此,MATE 桌面环境保留了 Linux 中的传统桌面体验。它速度快,内存消耗低。在我看来,MATE 桌面环境是一个被低估的桌面环境,需要更多的关注!

MATE 团队一直在继续开发,它是一个基于 GNOME 2 的流行桌面之一,但同时支持更新的技术。你可以在其 官方网站 上了解更多信息。

在 Arch Linux 中安装 MATE 桌面

第一部分: 安装 Arch Linux

如果你已经安装了 Arch Linux,则可以跳过此步骤,直接转到下面的 MATE 桌面安装部分。

要快速安装 Arch Linux,请按照这个自动化的 archinstall 指南 进行操作,该指南非常容易上手。安装完成后,继续至第二部分。

第二部分:在 Arch Linux 中安装 MATE 桌面

重新启动后,从 GRUB 中选择 Arch Linux。在 Arch Linux 提示符下,按顺序运行以下命令。这些命令将安装 Xorg 服务器、显示管理器、MATE 桌面组件、控制器包以及其他应用程序。

对于所有命令,请使用默认值,即在询问时按 Enter 键。

安装 Xorg。安装大小大约为 80 MB。

sudo pacman -S --needed xorg

安装显示管理器和 MATE 桌面组件。安装大小大约为 380 MB。

sudo pacman -S --needed mate mate-extra ttf-freefont lightdm lightdm-gtk-greeter
LCTT 译注:在 Arch Linux 中,很多时候 lightdm 显示管理器需要额外的配置才能正常启用。可以参考:LightDM - ArchWiki。除此之外,可以安装 lightdm-gtk-greeter-settings 来对 lightdm-gtk-greeter 进行配置。

安装 MATE 包

安装应用软件:

这只是一个参考。你也可以安装你所需要的内容。

sudo pacman -S --needed firefox vlc filezilla leafpad xscreensaver archlinux-wallpaper

现在是时候以服务的方式启用显示管理器和网络管理器了。这样,下次登录时,它们就可以通过 systemd 自动运行了。

systemctl enable lightdm
systemctl enable NetworkManager

使用重启命令重启系统:

reboot

如果一切顺利,你应该在 MATE 桌面上看到登录提示。

现在你可以使用刚刚创建的用户 ID 和密码登录。一个超快速和传统的 MATE 桌面将欢迎你的到来。

Arch Linux 中的 MATE 桌面

我希望本指南能帮助你从头开始创建自己的 Arch Linux 环境,并使用传统的 MATE 桌面。


via: https://www.debugpoint.com/mate-desktop-arch-linux-install/

作者:Arindam 选题:lkxed 译者:Chao-zhi 校对:wxy

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