分类 技术 下的文章

引言

这篇概述文章将告诉你为何以及如何迁移你的当前分区到 Btrfs 文件系统。如果你对此感兴趣,请阅读这篇分步指南来完成。

从 Fedora 33 开始,新安装的 Fedora 操作系统默认文件系统为 Btrfs。我确信大部分用户现在已经听说了它的优势:写时复制、内置校验、灵活的压缩方式、简易的快照和回滚方式。它确实是一个现代化的文件系统,为桌面存储带来新的功能。

在升级到 Fedora 33 后,我想利用 Btrfs 的优势,但对我个人来说,我不想因为“只是为了改变文件系统”而去重装整个系统。我发现(只有)寥寥无几的具体如何做转换的教程,所以我决定在这里分享我的详细经验。

小心!

这样做你是在玩火。希望你阅读以下内容时不要感到惊讶:

在编辑分区和转换文件系统时,你的数据可能会被破坏和丢失。最终,你可能会得到一个不能启动的操作系统,并面临数据恢复的风险。你可能会无意删除你的分区,或者以其它方式破坏了你的操作系统。

这些转换过程即使对于生产系统来说也是安全的 —— 前提是你提前做好了计划,对关键数据做好了备份和回滚计划。作为一个 可以执行超级权限的系统管理员,你可以在没有限制、没有任何常规安全防护措施的情况下,做任何事情。

安全的方式:重装 Fedora

重装操作系统是转换文件系统到 Btrfs 的 “官方” 方式,推荐给大多数用户使用。因此,如果在这个教程中有那么一点不确定,就选择这种方式。步骤大致如下:

  1. 备份你的主文件夹和你系统中可能会用到的任何数据,比如 /etc。(编者按:虚拟机也是这样)
  2. 将已安装的安装包以列表形式保存到到文件中。
  3. 重新安装 Fedora,删除你当前的分区,并选择新的 Btrfs 默认分区方案。
  4. 恢复主文件夹的内容,并使用软件包列表文件重装软件包。

对于详细的步骤和命令,请看一位社区用户在 ask.fedoraproject.org 站点的评论。如果正确完成,你将得到一个和之前一样的操作系统,使丢失数据的风险最小化。

转换的利弊

让我们快速澄清一下:这种文件系统转换有什么优势和劣势?

优势:

  • 当然,不需要重新安装!你的系统里的所有文件和之前一模一样。
  • 技术上来说,没有备份的情况下,就地进行是可能的。
  • 你会学到许多关于 Btrfs 的知识!
  • 如果所有都按计划进行,会是相当快的一个过程。

劣势:

  • 你必须熟悉终端环境和 shell 命令。
  • 你可能会丢失数据,参见上文。
  • 如果出了什么问题,你得自己解决。

特别之处:

  • 你需要大约 20% 的可用磁盘空间才能成功转换。但对于完整的备份和重装方式,你可能需要的空间更多。
  • 你可以在转换过程中自定义你分区的所有参数,但如果选择重装,你也可以从 Anaconda 自定义。

LVM 怎么办?

在近期几次 Fedora 安装中,LVM 布局一直是默认的。如果你有一个带有多个分区(例如 //home)的 LVM 分区布局,你得以某种方式合并它们,来获得 Btrfs 所有性能。

如果选择这样做,你可以单独转换分区到 Btrfs 文件系统,同时保留卷组。然而,迁移到 Btrfs 文件系统的优势之一是摆脱 LVM 分区布局强加的限制。你也可以利用 Btrfs 文件系统提供的收发功能在转换后来合并分区。

另见 《Fedora 杂志》: 利用 LVM 回收硬盘空间从 Btrfs 快照中恢复文件 以及 在 Btrfs 和 LVM-ext4 两者之间做选择

了解 Btrfs

建议阅读以下内容对 Btrfs 文件系统是什么有一个基础的了解。如果你没有把握,只有选择重装 Fedora 这种安全的方式。

必须了解的:

有用的资源:

转换步骤

创建一个实时镜像

由于不能转换已挂载的文件系统,我们将通过 Fedora 实时镜像 Live Image 进行。安装 Fedora 镜像写入工具,然后 “烧录” Fedora 33 到你的 U 盘中来创建实时镜像。

释放磁盘空间

btrfs-convert 会在分区的剩余空间重新创建文件系统的元数据,同时保持所有已有的 ext4 文件系统数据还在它当前的位置上。

不幸的是,所需的剩余空间的大小无法提前知道:如果没有足够的空间,转换将会失败(但不会破坏数据)。这里有一些释放空间有用的方法:

  • 利用 baobab 来识别大容量的文件和文件夹,然后移除。如果可能的话,不要手动删除主文件夹以外的文件。
  • 清理旧的系统日志:journalctl –vacuum-size=100M
  • 如果你正使用 Docker,请小心地使用类似 docker volume prunedocker image prune -a 这样的工具。
  • 清理 GNOME Boxes 之类的虚拟机内不用的镜像。
  • 清理不用的软件包和 Flatpak 包:dnf autoremoveflatpak remove –unused
  • 清理软件包缓存:pkcon refresh force -c -1dnf clean all
  • 如果你有把握,你可以谨慎的清理 ~/.cache 文件夹。

转换到 Btrfs

备份你所有有价值的数据,确保你的系统已完全更新,然后重启到实时镜像。运行 gnome-disks 工具找到你所拥有的设备的路径,比如 /dev/sda1(如果你在使用 LVM,它可能看起来有所不同)。检查文件系统然后执行转换:(编者按:以下命令使用 root 用户运行,谨慎使用!)

$ sudo su -
# fsck.ext4 -fyv /dev/sdXX (请替换为你的具体的设备路径)
# man btrfs-convert (阅读它)
# btrfs-convert /dev/sdXX (请替换为你的具体的设备路径)

这将会花十几分钟甚至几个小时,依据分区的大小和是机械硬盘还是固态硬盘。如果你看到错误,你可能需要更多剩余空间。作为最后的手段,你可以尝试 btrfs-convert -n

怎样回滚?

如果因为某些原因转换失败,你的分区将保持在 ext4 文件系统或者它之前的状态。如果你想在成功转换之后回滚,简单如下:

# btrfs-convert -r /dev/sdXX
警告! 如果你做了以下这些事情之一,你将永久失去回滚的功能:碎片整理、均衡或者删除 ext2_saved 子卷。

由于 Btrfs 文件系统的写时复制特性,你可以安全的复制/移动甚至删除文件、创建子卷,因为 ext2_saved 会保持引用旧数据。

挂载和检查

现在这个分区应该已经有了 Btrfs 文件系统。挂载它然后查看你的文件……和子卷!

# mount /dev/sdXX /mnt (请替换为你的具体的设备路径)
# man btrfs-subvolume (阅读它)
# btrfs subvolume list / (使用 -t 以表格方式查看)

因为你已经阅读了 相关的手册页,你应该知道创建子卷快照是安全的,并且有 ext2-saved 子卷作为你之前数据的简易备份。

是时候阅读 Btrfs 系统管理指南了,这样你就不会把常规文件夹和子卷混淆了。

创建子卷

我们希望实现一个“扁平”子卷布局,这和 Anaconda 默认创建的布局相同:

toplevel (卷根目录,不能被默认挂载)
  +-- root (子卷根目录,被挂载到 /)
  +-- home (子卷根目录,被挂载到 /home)

你可以跳过这个步骤,或者使用一个不同的布局。这种特殊结构的优势是你可以轻松的创建 /home 的快照,并且对每个子卷使用不同的压缩和挂载参数。

# cd /mnt
# btrfs subvolume snapshot ./ ./root2
# btrfs subvolume create home2
# cp -a home/* home2/

这里我们已经创建了两个子卷。root2 是一个完整的分区快照,而 home2 开始是一个空子卷,然后我们往里复制内容。(这个 cp 命令不会重复数据,所以会很快。)

  • /mnt 目录(顶层子卷),删除除了 root2home2ext2_saved 之外的所有内容。
  • 重命名 root2home2 子卷为 roothome
  • root 子卷里,清空 home 目录,以便之后我们能够挂载 home 子卷。

如果都做对了,那就很简单了!

修改 fstab 分区表

为了重启之后挂载新卷,必须要修改 fstab,用新的行来代替旧的 ext4 文件系统挂载行。

你可以使用 blkid 命令来找到你的分区的 UUID。

UUID=xx / btrfs subvol=root 0 0 (请替换为你的具体 UUID)
UUID=xx /home btrfs subvol=home 0 0 (请替换为你的具体 UUID)

(注意如果指向的是同一个分区,那么这两个 UUID 是相同的。)

这些都是新安装的 Fedora 33 的默认值。在 fstab 中,你也可以选择自定义压缩和添加类似 noatime 这样的参数。

可以查看 关于压缩参数的维基页面man 5 btrfs 了解所有相关的参数。

chroot 到系统

如果你曾经做过系统恢复,我想你肯定知道这些命令。这里,我们将得到一个 基本上 在你系统里的 shell 提示符,可以访问网络。

首先,我们必须重新挂载 root 子卷到 /mnt 目录,然后挂载 /boot/boot/efi 分区(它们可能有所不同,这取决于你的文件系统布局):

# umount /mnt
# mount -o subvol=root /dev/sdXX /mnt (请替换为你的具体的设备路径)
# mount /dev/sdXX /mnt/boot (请替换为你的具体的设备路径)
# mount /dev/sdXX /mnt/boot/efi (请替换为你的具体的设备路径)

然后我们继续挂载系统设备:

# mount -t proc /proc /mnt/proc
# mount --rbind /dev /mnt/dev
# mount --make-rslave /mnt/dev
# mount --rbind /sys /mnt/sys
# mount --make-rslave /mnt/sys
# cp /mnt/etc/resolv.conf /mnt/etc/resolv.conf.chroot
# cp -L /etc/resolv.conf /mnt/etc
# chroot /mnt /bin/bash
$ ping www.fedoraproject.org

重装 GRUB 及内核

最容易的方法就是重装 GRUB 和 内核,因为它完成了所有必要的配置 —— 现在我们可以访问网络了。所以,在 chroot 环境内部:

# mount /boot/efi
# dnf reinstall grub2-efi shim
# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
# dnf reinstall kernel-core
...或者干脆重新生成 initramfs:
# dracut --kver $(uname -r) --force

如果你是支持 UEFI 的系统,这里是适用的。如果你是 BIOS 的系统,请查看下面的文档。重启之前,让我们查看是否一切正常:

# cat /boot/grub2/grubenv
# cat /boot/efi/EFI/fedora/grub.cfg
# lsinitrd /boot/initramfs-$(uname -r).img | grep btrfs

你应该在 grubenvgrub.cfg 有正确的分区 UUID 或指向(grubenv 可能没有更新,如有必要可以编辑它),并在 grub.cfg 中看到 insmod btrfs 配置和在 initramfs 镜像中有 btrfs 模块。

参见: Fedora 系统管理指南中的 重装 GRUB 2验证初始 RAM 磁盘镜像

重启

现在系统能够正常启动。如果不能,别慌,回到实时镜像修复这个问题。最坏的情况下,你可以从那里重装 Fedora 。

首次启动之后

检查你的新 Btrfs 文件系统一切都正常。如果你觉得没问题,你需要回收旧的 ext4 快照使用的空间,进行碎片整理和平衡子卷。后两者可能要花一些时间,并且相当耗费资源。

对此你必须这样挂载顶级子卷:

# mount /dev/sdXX -o subvol=/ /mnt/someFolder
# btrfs subvolume delete /mnt/someFolder/ext2_saved

然后,当机器有空闲时间时,运行这些命令:

# btrfs filesystem defrag -v -r -f /
# btrfs filesystem defrag -v -r -f /home
# btrfs balance start -m /

最后,有一个 “非写时复制” 属性,对于新系统,这个属性是为虚拟机镜像文件夹自动设置的。如果你使用虚拟机的话,可以设置它:

# chattr +C /var/lib/libvirt/images
$ chattr +C ~/.local/share/gnome-boxes/images

这个属性只会对在这些文件夹里的新文件生效。复制镜像并删除原镜像,你可以通过 lsattr 确认结果。

总结

我真心希望你发现这个教程是有用的,并且能够对是否在你的系统上转换为 Btrfs 做出谨慎而明智的决定。祝你成功转换!

欢迎在评论中分享你的经验,或者遇到更深层次的问题,请在 ask.fedoraproject.org 提问。


via: https://fedoramagazine.org/convert-your-filesystem-to-btrfs/

作者:Gergely Gombos 选题:lujun9972 译者:hwlife 校对:wxy

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

这是一个有趣的工具,它可以替代 apt-get 来安装 Ubuntu 上的第三方 deb 包。它应该能帮为你节省时间!

deb-get

Ubuntu MATE 的负责人 Martin Wimpress 为 Linux 用户带来了另一个有趣的项目。

你可能不知道,这个 Martin 经常开发一些有趣的东西。去年,我们报道了 Quickemu,它通过一个基于 QEMU 的 GUI 工具,帮助用户在 Linux 中创建虚拟机,使这个过程变得简单。

现在,他又带来了一个有趣的 deb-get 工具,其目标是为第三方 .deb 包模仿 apt-get 的支持。

让我们来详细了解一下它吧!

Deb Get:使用 CLI 无缝安装第三方 deb 包

当官方软件库中没有你想安装的软件包时(比如 Google Chrome、Vivaldi 等),你必须先 添加一个 PPA(非官方/官方) 或者下载 .deb 文件后 手动安装

如果我现在告诉你,你可以直接在终端中安装它们,就好像官方软件库中有它们一样呢?

这就是 deb-get 工具想要做到的事。

通常,当在终端中安装一个软件包时,你会使用下面的命令:

sudo apt install packagename

或者

sudo apt-get install packagename

要使用这个工具,你只需把 apt-get 替换为 deb-get,其他格式保持不变。就像下面这样:

sudo deb-get install packagename

举个例子,通常,我们 在 Linux 上安装 Vivaldi 时需要添加 PPA 或下载 .deb 文件。

现在,如果你在系统上配置好了 deb-get 工具(配置指南在本文末尾),你就可以使用以下命令轻松地安装 Vivaldi:

sudo deb-get install vivaldi-stable

另外,类似于 apt-get upgrade,你可以使用下面的命令来升级软件包:

sudo deb-get upgrade
注意: 虽然 deb-get 使安装第三方 .deb 包变得很容易,但它是有限制的,你只能安装它提供的核实列表中的软件。不过,它已经支持许多 必要的应用程序,相信支持的软件包列表很快就会扩大。

你也可以使用下面的命令,检查你 deb-get 可用软件包的列表:

sudo deb-get list

deb-get

在基于 Ubuntu 的发行版上设置 deb-get

deb-get 工具适用于 Ubuntu 22.04 LTS(我测试过),也应该适用于其他基于 Ubuntu 的发行版。

你可以使用下面的命令来安装它:

sudo apt install curl && curl -sL https://raw.githubusercontent.com/wimpysworld/deb-get/main/deb-get | sudo -E bash -s install deb-get

或者,你可以在它的 GitHub 发布页面 手动下载它的 deb 包。

要了解更多关于它的信息,以及可用的命令/功能,你可以访问它的 GitHub 页面

你怎么看待 deb-get 试图实现支持第三方软件包的 apt-get?你认为它有用吗?请在评论区留言,发表你的看法吧!

来源:OMG!Ubuntu!


via: https://news.itsfoss.com/deb-get-ubuntu/

作者:Ankush Das 选题:lkxed 译者:lkxed 校对:wxy

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

ZeroTier 是一个加密的虚拟主干网,允许多台机器像在一个网络上一样通信。

自动化是现在的一个热门话题。在我作为网站可靠性工程师(SRE)的日常工作中,我的部分职责是将尽可能多的重复性任务自动化。但是我们当中有多少人在日常生活、非工作生活中这样做呢? 今年,我专注于自动化工作,以便我们可以专注于重要的事情。

在实现一切自动化的同时,我在一些远程站点上遇到了困难。我不是一个网络专家,所以我开始研究我的选择。在研究了各种虚拟专用网络(VPN)、硬件端点、防火墙规则以及支持多个远程站点的所有东西后,我感到困惑、暴躁,并对这一切的复杂性感到沮丧。

然后我发现了 ZeroTier。ZeroTier 是一个加密的虚拟主干网,允许多台机器像在一个网络上一样通信。代码全部是开源的,你可以自行托管控制器,或者使用 ZeroTierOne 服务,有免费或付费计划。我现在使用的是它们的免费计划,它很强大、可靠,而且非常稳定。

因为我使用的是 Web 服务,所以我不打算详细介绍运行控制器和根服务。ZeroTier 在他们的 文档 中对如何做到这一点有完整的参考,而且非常好。

在 Web 用户界面中创建了我自己的虚拟网络之后,客户端的安装几乎是微不足道的。ZeroTier 有 APT、RPM、FreeBSD 和许多其他平台的软件包,所以让第一个节点上线不需要什么努力。

安装完毕后,客户端就会连接到控制器服务,并为节点生成一个唯一的 ID。在 Linux 上,你使用 zerotier-cli 命令来加入一个网络,使用 zerotier-cli join NETWORKID 命令:

$ sudo zerotier-cli info
200 info 469584783a 1.x.x ONLINE

你也可以使用 zerotier-cli 来获得连接和可用节点的列表,改变网络设置,以及离开网络。

Image of Setting up a New Node

在加入一个网络后,你必须批准该节点的访问,可以通过网络控制台或调用应用程序编程接口(API)。这两种方法在 ZeroTier 网站上都有文档说明。连接两个节点后,无论你身在何处或位于防火墙的哪一侧,你都可以相互连接,就像你们在同一个建筑的同一个网络中。我的主要用例之一是 远程访问我的家庭助理环境,而不需要打开防火墙端口或将其暴露在互联网上(关于我的家庭助理设置和相关服务的更多信息,见后文)。

我自己做的一件事是为内部 DNS 设置了一个 Beta ZeroNDS 服务。这为我管理自己的名称服务或为我所有的私人主机和 IP 地址创建公共记录减少了很多复杂性。我发现操作说明非常简单直白,并且能够在大约 5 分钟内为我的私人网络建立一个 DNS 服务器。每个客户端必须允许 Zerotier 设置 DNS,这在 GUI 客户端中非常简单。要使它在 Linux 客户端上使用,请使用:

$ sudo zerotier-cli setNETWORKID allowDNS=1

在你添加和删除主机时,不需要其他更新,它“就能工作”。

$ sudo zerotier-cli info
200 info 469584845a 1.x.y ONLINE
$ sudo zerotier-cli join
93afae596398153a 200 join OK
$ sudo zerotier-cli peers
200 peers
<ztaddr> <ver> <role> <lat> <link> <TX> <RX> <path>
61d294b9cb - PLANET 112 DIRECT 7946 2812 50.7.73.34/9993
62f865ae71 - PLANET 264 DIRECT 7946 2681 50.7.76.38/9993
778cde7190 - PLANET 61 DIRECT 2944 2901 103.195.13.66/9993
93afae5963 1.x LEAF 77 DIRECT 2945 2886 35.188.31.177/41848
992fcf1db7 - PLANET RECT 79124 DI47 2813 195. 181.173.159/9993

我只提到了它所有功能的表面。ZeroTier 还允许在 ZeroTier 网络之间建立桥接、高级路由规则等。它们甚至有一个 Terraform 提供者 和一个 很棒的 Zerotier 资源 清单。到今天为止,我正在使用 ZeroTier 连接四个物理站点的机器,其中三个在 NAT 防火墙后面。Zerotier 的设置很简单,而且管理起来几乎完全不费力。


via: https://opensource.com/article/22/5/zerotier-network

作者:Kevin Sonney 选题:lkxed 译者:geekpi 校对:wxy

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

这里为准备从 20.04 LTS 迁移到 22.04 LTS 的用户列出了十个最重要的变化。

如果你是一位 Ubuntu 20.04 LTS “Focal Fossa” 用户,并准备迁移到 Ubuntu 22.04 LTS “Jammy Jellyfish”,这篇文章将为你提供一些指引。在这两个 LTS 版本之间存在巨大的结构性变化,这在 LTS 分支中一般比较罕见。对比下来,不难发现本次更新一次性改变了大量的内容。

了解了这一点之后,本文将针对普通用户关切的方面,列出十个发生根本性变化的特性,并为用户提供一些指引。

Ubuntu 22.04 LTS 与 Ubuntu 20.04 LTS – 特性变化

1、徽标、颜色和 Plymouth 动画

第一个你会注意到的视觉变化便是基调颜色相比早期的两个“棕橙色”变得更“橙色”。同时 Canonical 对徽标进行了修改,这一点体现在开机时 Plymouth 动画中。新的徽标乍一看会显得有些怪异,但看久了会比较顺眼,至少我认为这是一个十分与众不同的徽标。

New Ubuntu logo and Plymouth

2、安装

Ubuntu 的默认安装程序并没有看到太多变化。我们其实更希望最新的 基于 Flutter 的安装程序 能够最终落地,但并没有。基于此,整体安装流程并未发生变化。我仅能够观察到对话框和按钮的强调色发生了变化。从功能角度而言,安装流程并未发生任何变化。

Colour differences between two LTS Versions

3、锁屏与登录界面、桌面的初始界面以及壁纸

锁屏与登录界面的渐变变得更为精细,密码框采用了无边框设计。初次登录时的布局和壁纸发生了很大的变化。桌面的 “家目录” 快捷方式被重命名为 “Home”,而非你的用户名,但回收站快捷方式则移到了左侧的任务栏中,并用分隔符与其他任务栏图标隔开了。

除此之外,顶部状态栏并未大改。系统托盘的菜单则进行了细微的修正,布局更为宽松。这些变化主要来自于 GNOME 42 的变化。

日历菜单并未发生变化。

Ubuntu 20.04 Vs Ubuntu 22.04 – Login Screen

Ubuntu 20.04 Vs Ubuntu 22.04 – Lock Screen

Difference between Ubuntu 20.04 and Ubuntu 22.04 – default look

4、桌面布局和 GNOME 版本升级

一个十分明显的变化就是 GNOME 版本由 GNOME 3.36 升级到了 GNOME 42。这是所有升级用户都会看到的显而易见的升级。Ubuntu 22.04 LTS 搭载的 GNOME 42 带来了水平的工作区视图以及水平的应用视图。所以,迁移之后手势从垂直转变为水平会有一些不习惯,但用一段时间就好了。

如果你的设备是触控屏的笔记本电脑或屏幕,经过一点学习之后,新的 GNOME 42 手势会给你十分顺滑的使用体验。以下是桌面、应用和工作区的对比图。

Activities View Difference – Ubuntu 20.04 and 22.04

Application View Difference – Ubuntu 20.04 and 22.04

5、新的强调色与显示样式

有一个我非常喜欢的变化是最新的浅色和深色主题。早先 Ubuntu 有三个选择:浅色、深色和混合(标准)。这在 GNOME 42 中发生了改变,因为其本身就带有内置的浅色和深色模式。另一方面,它还引入了一个新的强调色选项(这并不是原本的 GNOME 42 带来的),允许用户在全局进行自定义。

当然,你还不能像 KDE Plasma 一样选择自定义的强调色。这些变化大多来自于最近的 libadwaita 和 GTK4 对 GNOME Shell 和原生应用程序的移植。

而当你在 Ubuntu 22.04 LTS 中打开深色模式,它会自动应用于所有支持的应用,这是一个与 Ubuntu 20.04 LTS 十分显著的区别。

Accent Color and other changes

How Accent colour change impact looks in Ubuntu 22.04 LTS

6、文件管理器

在这个版本中,文件管理器的版本由 3.36.x 升级到了 42。区别是你能看到更为紧凑的设计、在文字和选项之间更为合理的布局,以及顶部控制栏的小工具风格,这一切都归功于 GTK4 和对底层错误的修复。文件中的地址栏有些不同,目录之间有一个分隔符,而汉堡菜单在最后。当然,这些变化都较为细微,你可能不会感受到它们之间有什么不同。

Files Difference – Ubuntu 20.04 vs 22.04

7、截图工作流的变化

另一个值得注意并且需要用户进行学习的是截图方式的改变。它完全改变了。早先你按下 Print Screen 键时,会自动截图并保存到图片文件夹中。现在有了 GNOME 42 内置的截图和录屏工具,工作流程被完全改变。

当你在截图时,你会发现有三个选项,你可以选择某个区域、全屏截图或者特定窗口。更重要的是,你还能选择是否让光标出现在截图中,此外还有录屏功能可选。选择完成之后点击“捕捉”按钮,这张图片将在被保存到图片文件夹,并同时复制到你的剪切板。

New Screenshot tool in Ubuntu 22.04 LTS

总体而言,相较于之前多了一个步骤。

在所有应用程序窗口顶部的右键菜单上,增添了一个新的截图选项。

Take Screenshot option in top bar menu

8、 Firefox 浏览器成为了 Snap 版本

此外,Firefox 浏览器在本次更新中变成了 Snap 版本。而此前在 20.04 LTS 中,Firefox 浏览器以 deb 包形式呈现。这对于一般用户而言区别不大。

但是 Firefox 浏览器的 Snap 沙箱运行模式使得安装 GNOME 扩展工具时会产生问题,同时在同等硬件条件之下相较于之前的版本会显得更慢。

这个最为常用的应用的 Snap 迁移所带来的后续影响我们将拭目以待。

9、不同的设置窗口

在设置中出现了一个新的面板:多任务。多任务面板允许你调整触发角以及激活窗口边缘。此外你可以指定工作区的数量,并设置自动删除空的工作区。而针对多显示器用户,现在可以选择仅在主屏幕上显示工作区或是在所有屏幕上显示工作区。

New Multitasking Panel in Settings

10、主题和应用更新

此外,软件的变化带来了不同的响应式外观并能够适应任何形式。软件商店同时带来了新的界面,包含了按照类别分类的软件视图以及“编辑之选”栏目。

应用详情页面变得更加易读,重要的信息,例如总下载大小、评分、安全标记以及应用截图都以更可辨别地方式呈现。

GNOME Software – Home page difference

GNOME Software – Details page difference

最后,这两个版本的内部差异出现在软件包、官方桌面环境主题和错误修正上。下面是对重要软件包版本变化的一个对比:

20.0422.04
GCC 10.3GCC 11.2
Hplip 3.20.3Hplip 3.21.12
LibreOffice 6.4.7LibreOffice 7.3.2
(未引入)Pipewire 0.3.48
Python3 3.8.2Python3 3.10.1
Samba 4.13Samba 4.15
Systemd 245.4Systemd 249.11

总结

总而言之,这是 Ubuntu LTS 分支历次更新中变化最大的一次,不论是从视觉上还是特性角度。

我希望这个指南能够令读者了解两个版本之间的主要区别,以及应当预期什么样的使用体验。

祝好~


via: https://www.debugpoint.com/2022/04/difference-ubuntu-22-04-20-04/

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

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

这是一篇关于在 Ubuntu Linux 系统中如何删除 Snap,以得到一个无 Snap 系统的教程。

由 Canonical 开发的 Snap 软件包在一些场景下是有益的。它为终端用户直接提供了轻便且快速的程序更新。不仅如此,它还有其他的好处,比如它打包了所有依赖包,并允许安装同一个应用的多个版本。此外,它运行在沙盒模式,提供了安全和其他方面的好处。

在这些好处中, Snap 技术也有一些地方备受争论。举个例子,几乎所有使用 Snap 软件包的用户都说它的性能较差,包括它的启动时间要比本地 deb 或者 RPM 软件包时间要长。另外,由于它的设计,程序安装的体积巨大,浪费磁盘空间,因为它打包了所有用到的依赖包。

不仅如此,由于沙盒的天然属性,Snap 程序可能无法访问你的 Linux 桌面的几个部分,除非提供了适当的权限。

这个指南阐述了你如何从 Ubuntu 系统中完全移除 Snap。

这些步骤在 Ubuntu 22.04 LTS Jammy Jellyfish 中进行了测试。然而,它应该也适用于所有的 Ubuntu 系统版本。

警告:这些步骤将会移除 Ubuntu 系统中两个关键的程序:软件商店和 Firefox。尝试这些步骤之前确认你已经对书签和 Firefox 的其它设置做了备份。

在 Ubuntu Linux 移除 Snap 软件包

1、在你的系统中打开一个终端,使用以下命令查看已经安装的 Snap 软件包的列表。它显示了 Snap 软件包,比如 Firefox,软件商店,主题以及其它默认已经安装的核心软件包。

snap list

 Ubuntu Snap 包列表

2、按照以下的顺序移除 Snap 软件包。首先移除 Firefox。然后是软件商店,和用以上命令看到的你的系统中的其它软件包。

sudo snap remove --purge firefox
sudo snap remove --purge snap-store
sudo snap remove --purge gnome-3-38-2004
sudo snap remove --purge gtk-common-themes
sudo snap remove --purge snapd-desktop-integration
sudo snap remove --purge bare
sudo snap remove --purge core20
sudo snap remove --purge snapd

3、最后,通过 apt 命令移除 Snap 服务。

sudo apt remove --autoremove snapd

移除 Snap 包和其它

这还没完,即使你用以上命令移除了 Snap 软件包,但是如果你没有关闭 apt 触发器,sudo apt update 命令会再一次将 Snap 安装回来。

4、所以,要关闭它,我们需要在 /etc/apt/preferences.d/ 目录下创建一个 apt 设置文件 nosnap.pref 来关闭 Snap 服务。

sudo gedit /etc/apt/preferences.d/nosnap.pref

5、添加以下的命令行,并保存该文件。

Package: snapd
Pin: release a=*
Pin-Priority: -10

创建设置文件

如果你知道如何使用它,那么这个 apt 设置文件是一个潜在的工具。举个例子,在以上的状态中,Pin-Priority -10 意思就是阻止 Snap 软件包的安装。

与这个教程不相关的,举个例子,如果你想给所有发行版代号为 “bulleye” 的软件包超高优先权的话,那么就可以查看这些设置文件。如果你想了解更多,你可以访问 apt 手册页

Package: *
Pin: release n=bullseye
Pin-Priority: 900

6、回到我们的主题,一旦你已经保存和关闭以上文件,从终端中再次运行以下命令。

sudo apt update

7、最后,从 Ubuntu 中移除 Snap 的步骤全部完成。

从 Ubuntu 移除 Snap 后使用 deb 文件安装软件商店和 Firefox

你已经移除了 Firefox 和软件商店,但是你的工作还需要它们。

要安装 apt 版的 GNOME 软件商店,你可以使用以下命令。确保使用 --install-suggests 参数。否则,将会再次安装上 Snap 版本的软件包管理器!

sudo apt install --install-suggests gnome-software

要安装 Firefox,通过以下命令使用官方 PPA 仓库。

sudo add-apt-repository ppa:mozillateam/ppa
sudo apt update
sudo apt install -t 'o=LP-PPA-mozillateam' firefox

添加 PPA 仓库

从 PPA 仓库以 deb 文件形式安装 Firefox

一旦你已经安装完 Firefox,使用以下命令开启自动更新。要了解更多,访问此页

echo 'Unattended-Upgrade::Allowed-Origins:: "LP-PPA-mozillateam:${distro_codename}";' | sudo tee /etc/apt/apt.conf.d/51unattended-upgrades-firefox

最后但同样重要,当运行 apt 时,为 Firefox 创建另一个设置文件给予以上 PPA 仓库超高优先权。如果你不这么做,apt update 命令会再次安装 Snap 版本 Firefox,并把它的“ Snap 朋友们”带回来 ???。

sudo gedit /etc/apt/preferences.d/mozillateamppa

最后,添加这些命令行并保存文件。

Package: firefox*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 501

完成。

在 Ubuntu 系统恢复到 Snap 软件包

如果你改变想法,移除该设置文件,并通过以下命令再次启动安装程序。

sudo rm /etc/apt/preferences.d/nosnap.pref
sudo apt update && sudo apt upgrade
sudo snap install snap-store
sudo apt install firefox

总结

关于在 Ubuntu 下移除 Snap 软件包做个总结,我想说的是这些处理 Snap 软件包的方法实属无奈。主要是这对新用户来说很困难。我希望这个指南能帮助你处理好 Snap 软件包。完结撒花。


via: https://www.debugpoint.com/2022/04/remove-snap-ubuntu/

作者:Arindam 选题:lujun9972 译者:hwlife 校对:turbokernel, wxy

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

如果你打算在今年探索 Rust,请下载我们的免费 Rust 速查表,以供快速参考基础知识。

 title=

Rust 是一门相对较新的编程语言,受到各个企业的 程序员的欢迎。尽管如此,它仍是一门建立在之前所有事物之上的语言。毕竟,Rust 不是一天做出来的,所以即便 Rust 中的一些概念看起来与你从 Python、Java、C++ 等编程语言学到的东西大不相同,但它们都是基于同一个基础,那就是你一直与之交互(无论你是否知道)的 CPU 和 NUMA( 非统一内存访问 Non Uniform Memory Access )架构,因此 Rust 中的一些新功能让人感觉有些熟悉。

现在,我的职业不是程序员。我没耐心但我又有点儿强迫症。当我需要完成某件事时,如果一门语言不能帮助我相对较快地获得想要的结果,那么我很少会受到鼓舞而使用它。Rust 试图平衡两个矛盾:现代计算机对安全和结构化代码的需求,和现代程序员对编码工作事半功倍的渴望。

安装 Rust

rust-lang.org 网站有丰富的的文档指导如何安装 Rust,但通常,它就像下载 sh.rustup.rs 脚本并运行它一样简单。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs
$ less sh.rustup.sh
$ sh ./sh.rustup.rs

没有类

Rust 没有类,也不使用 class 关键字。Rust 确实有 struct 数据类型,但它的作用是充当数据集合的一种模板。因此,你可以使用 结构体 struct ,而不是创建一个类来表示虚拟对象:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

你可以像使用类一样使用它。例如,当定义完 Penguin 结构,你就可以创建它的实例,并与该实例进行交互:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(),
    species: "R adeliæ".to_owned(), 
    extinct: false, 
    classified: 1841 };

  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

impl 数据类型与 struct 数据类型结合使用,你可以实现一个包含函数的结构体,并且可以添加继承和其他与类相似的特性。

函数

Rust 中的函数很像其他语言中的函数。每个函数都代表一组严谨的任务,你可以在需要时调用它们。主函数名必须是 main

fn 关键字声明函数,后跟函数名称和函数接受的所有参数。

fn foo() {
  let n = 8;
  println!("Eight is written as {}", n);
}

通过参数,将信息从一个函数传递到另一个函数。例如,我已经创建了一个 Penguin 类(结构),并且我有一个 Penguin 的实例为 p,将目标函数的参数指定为 Penguin 类型,就可把 p 的属性从一个函数传递到另一个函数。

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(), 
    species: "R adeliæ".to_owned(), 
    extinct: false, classified: 1841 };
  printer(p);
}

fn printer(p: Penguin) {
  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

变量

Rust 默认创建的为 不可变 immutable 变量。这意味着你创建的变量以后无法更改。这段代码虽然看起来没问题,但无法编译:

fn main() {
  let n = 6;
  let n = 5;
}

但你可以使用关键字 mut 声明一个 可变 mutable 变量,因此下面这段代码可以编译成功:

fn main() {
  let mut n = 6;
  println!("Value is {}", n);
  n = 5;
  println!("Value is {}", n);
}

编译

Rust 编译器,至少就其报错信息而言,是可用的最好的编译器之一。当你在 Rust 中出错时,编译器会真诚地告诉你做错了什么。实际上,仅通过从编译器错误消息中学习,我就了解了 Rust 的许多细微差别(就我理解到的 Rust 的任何细微差别而言)。即便有时错误消息太过于模糊,而不知所以然,互联网搜索几乎总能得到解释。

启动 Rust 程序的最简单方法是使用 cargo,它是 Rust 的包管理和构建系统。

$ mkdir myproject
$ cd myproject
$ cargo init 

以上命令为项目创建了基本的基础架构,最值得注意的是 src 子目录中的 main.rs 文件。打开此文件,把我为本文生成的示例代码粘贴进去:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(), species: "R adeliæ".to_owned(), extinct: false, classified: 1841 };
  printer(p);
  foo();
}

fn printer(p: Penguin) {
  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

fn foo() {
  let mut n = 6;
  println!("Value is {}", n);
  n = 8;
  println!("Eight is written as {}", n);
}

使用 cargo build 命令进行编译:

$ cargo build

执行 target 子目录下的二进制程序,或者直接运行 cargo run 命令来运行你的项目:

$ cargo run
Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 6
Eight is written as 8

Crates

任何语言的大部分便利都来自于它的库或模块。在 Rust 中,进行分发和跟踪的库称为 “crate”(箱子)。crates.io 是一个很好的社区 crate 注册网站。

把一个 crate 添加到你的 Rust 项目,首先要在 Cargo.toml 文件中添加这个 crate。例如,要安装随机数函数,我使用名为 rand 的 crate,使用 * 作为通配符,以确保在编译时获得最新版本:

[package]
name = "myproject"
version = "0.1.0"
authors = ["Seth <[email protected]>"]
edition = "2022"

[dependencies]
rand = "*"

在 Rust 代码中使用它需要在最顶行使用 use 语句:

use rand::Rng;

以下是一些创建随机种子和随机范围的示例代码:

fn foo() {
  let mut rng = rand::thread_rng();
  let mut n = rng.gen_range(1..99);

  println!("Value is {}", n);
  n = rng.gen_range(1..99);
  println!("Value is {}", n);
}

你可以使用 cargo run 来运行它,它会检测代码是否被更改并触发一个新的构建。构建过程中下载名为 randcrete 和它依赖的所有 crate,编译代码,然后运行它:

$ cargo run
Updating crates.io index
Downloaded ppv-lite86 v0.2.16
Downloaded 1 crate (22.2 KB) in 1.40s
 Compiling libc v0.2.112
 Compiling cfg-if v1.0.0
 Compiling ppv-lite86 v0.2.16
 Compiling getrandom v0.2.3
 Compiling rand_core v0.6.3
 Compiling rand_chacha v0.3.1
 Compiling rand v0.8.4
 Compiling rustpenguin v0.1.0 (/home/sek/Demo/rustpenguin)
 Finished dev [unoptimized + debuginfo] target(s) in 13.97s
 Running `target/debug/rustpenguin`

Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 70
Value is 35

Rust 速查表

Rust 是一门令人非常愉快的语言。集成了在线注册网站、有用的编译器和几乎直观的语法,它给人的适当的现代感。

但请不要误会,Rust 仍是一门复杂的语言,它具有严格的数据类型、强作用域变量和许多内置方法。Rust 值得一看,如果你要探索它,那么你应该下载我们的免费 Rust 速查表,以便快速了解基础知识。越早开始,就越早了解 Rust。当然,你应该经常练习以避免生疏。

Rust 速查表

via: https://opensource.com/article/22/1/rust-cheat-sheet

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

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