分类 技术 下的文章

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 以供参考。我使用该结果来识别 / 根分区以及 bootefi 分区。我使用了我的一台虚拟机,如下所示。在这种情况下没有 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(或其他)配置文件。但是,它提供了一个完整的运行系统,其中安装了所有原始文件系统以进行恢复,既是所需工具的来源,也是要进行更改的目标。

以下是步骤和相关命令:

  1. 创建目录 /mnt/sysimage 以提供 chroot 目录的位置。
  2. 将根分区挂载到 /mnt/sysimage
# mount /dev/mapper/vg01-root /mnt/sysimage
  1. /mnt/sysimage 设为你的工作目录:
# cd /mnt/sysimage
  1. 挂载 /boot/boot/efi 文件系统。
  2. 挂载其他主要文件系统。此步骤不需要像 /home/tmp 这样的文件系统:
# mount /dev/mapper/vg01-usr usr

# mount /dev/mapper/vg01-var var
  1. 绑定已挂载的重要文件系统,它们必须在已经 chroot 的系统和原始的现场系统之间共享,而后者仍然在外部运行:
# mount --bind /sys sys

# mount --bind /proc proc
  1. 一定要最后操作 /dev 目录,否则其他文件系统不能挂载:
# mount --bind /dev dev
  1. 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 Mint 与 Windows 11(或 Windows 10)同时安装并制作双引导系统的完整指南。

如果你是新 Linux 用户,想在不删除 OEM 安装的 Windows 的情况下安装 Linux Mint,请遵循本指南。完成下面描述的步骤后,你应该拥有一个双引导系统,你可以在其中学习和在 Linux 系统中完成工作,而无需引导 Windows。

1、开始之前你需要什么?

启动到你的 Windows 系统并从官方网站下载 Linux Mint ISO 文件。 ISO 文件是 Linux Mint 的安装镜像,我们将在本指南中使用它。

在官网(图1),下载 Cinnamon 桌面版的 ISO(适合所有人)。

下载链接

图 1:从官网下载 Linux Mint

下载后,将 U 盘插入你的系统。然后使用 Rufus 或 Etcher 将上面下载的 .ISO 文件写入该 USB 驱动器。

2、准备一个分区来安装 Linux Mint

正常情况下,Windows 笔记本电脑通常配备 C 盘和 D 盘。C 盘是安装 Windows 的地方。对于新的笔记本电脑,D 驱动器通常是空的(任何后续驱动器,如 E 等)。现在,你有两个选项可供选择:一是 缩小 C 盘 为额外的 Linux 安装腾出空间。第二个是使用其他驱动器/分区,例如 D 盘或 E盘。

选择你希望的方法。

如果你选择使用 D 盘或 E 盘用于 Linux 系统,请确保先禁用 BitLocker,然后再禁用现代 OEM 安装的 Windows 笔记本电脑附带的所有其他功能。

  • 从开始菜单打开 Windows PowerShell 并键入以下命令(图 2)以禁用 BitLocker。根据你的目标驱动程序更改驱动器号(这里,我使用了驱动器 E)。
manage-bde -off E

图 2:禁用 Windows 驱动器中的 BitLocker 以安装 Linux

如果你选择缩小 C 盘(或任何其他驱动器),请从开始菜单打开“ 磁盘管理 Disk Management ”,它将显示你的整个磁盘布局。

  • 右键单击​​并在要缩小的驱动器上选择“ 缩小卷 Shrink Volume ”(图 3),以便为 Linux Mint 腾出位置。

图 3:磁盘分区中的压缩卷选项示例

  • 在下一个窗口中,在“ 输入要缩小的空间量(以 MB 为单位) Enter the amount of space to shrink in MB ”下以 MB 为单位提供你的分区大小(图 4)。显然,它应该小于或等于“ 可用空间大小 Size of available space ”中提到的值。因此,对于 100 GB 的分区,给出 100*1024=102400 MB。
  • 完成后,单击“ 缩小 Shrink ”。

图 4:输入 Linux 分区的大小

现在,你应该会看到一个“ 未分配空间 Unallocated Space ”,如下所示(图 5)。右键单击它并选择“ 新建简单卷 New Simple Volume ”。

图 5:创建未分配空间

  • 此向导将使用文件系统准备和格式化分区。注意:你可以在 Windows 本身中或在 Linux Mint 安装期间执行此操作。Linux Mint 安装程序也为你提供了创建文件系统表和准备分区的选项,我建议你在这里做。
  • 在接下来的一系列屏幕中(图 6、7 和 8),以 MB 为单位给出分区大小,分配驱动器号(例如 D、E、F)和文件系统为 fat32。

图 6:新建简单卷向导-page1

图 7:新建简单卷向导-page2

图 8:新建简单卷向导-page3

  • 最后,你应该会看到你的分区已准备好安装 Linux Mint。你应该在 Mint 安装期间按照以下步骤选择此选项。

图 9:安装 Linux 的最终分区

  • 作为预防措施,记下分区大小(你刚刚在图 9 中作为示例创建的分区)以便在安装程序中快速识别它。

3、在 BIOS 中禁用安全启动

插入 USB 驱动器并重新启动系统。

  • 开机时,反复按相应的功能键进入 BIOS。你的笔记本电脑型号的按键可能不同。下面是主要笔记本电脑品牌的参考。
笔记本厂商进入 BIOS 的功能键
宏碁F2DEL
华硕PC 使用 F2,主板是 F2DEL
戴尔F2F12
惠普ESCF10
LenovoF2Fn + F2
Lenovo(台式机)F1`
Lenovo(ThinkPad)Enter + F1
微星DEL
微软 Surface 平板按住音量增加键
ORIGIN PCF2
三星F2
索尼F1F2F3
东芝F2
  • 你应该禁用 BIOS 安全设置并确保将启动设备优先级设置为 U 盘。
  • 然后按 F10 保存并退出。

4、安装 Linux Mint

如果一切顺利,你应该会看到一个安装 Linux Mint 的菜单。选择 “Start Linux Mint……” 选项。

图 10:Linux Mint GRUB 菜单启动安装

片刻之后,你应该会看到 Linux Mint Live 桌面。在桌面上,你应该会看到一个安装 Linux Mint 的图标以启动安装。

在下一组屏幕中,选择你的语言、键盘布局、选择安装多媒体编解码器并点击继续按钮。

在安装类型窗口中,选择 “ 其他 Something Else ” 选项。

在下一个窗口(图 11)中,仔细选择以下内容:

图11:选择 Windows 11 安装 Linux Mint 的目标分区

  • 在“ 设备 Device ”下,选择刚刚创建的分区;你可以通过我之前提到的要记下的分区大小来识别它。
  • 然后点击“ 更改 Change ”,在编辑分区窗口中,选择 Ext4 作为文件系统,选择格式化分区选项和挂载点为 /
  • 单击“ 确定 OK ”,然后为你的系统选择“ 引导加载程序 boot loader ”;理想情况下,它应该是下拉列表中的第一个条目。
  • 仔细检查更改。因为一旦你点击立即安装,你的磁盘将被格式化,并且无法恢复。当你认为一切准备就绪,请单击“ 立即安装 Install Now ”。

在以下屏幕中,选择你的位置,输入你的姓名并创建用于登录系统的用户 ID 和密码。安装应该开始(图 12)。

图 12:安装中

安装完成后(图 13),取出 U 盘并重新启动系统。

图 13:安装完成

如果一切顺利,在成功安装为双引导系统后,你应该会看到带有 Windows 11 和 Linux Mint 的 GRUB。

现在你可以使用 Linux Mint 并体验快速而出色的 Linux 发行版。

总结

在本教程中,我向你展示了如何在装有 OEM 的 Windows 的笔记本电脑或台式机中使用 Linux Mint 创建一个简单的双启动系统。这些步骤包括分区、创建可引导 USB、格式化和安装。

尽管上述说明适用于 Linux Mint 21 Vanessa;但是,它现在应该可以用于所有其他出色的 Linux 发行版

如果你遵循本指南,请在下面的评论框中告诉我你的安装情况。

如果你成功了,欢迎来到自由世界!


via: https://www.debugpoint.com/linux-mint-install-windows/

作者:Arindam 选题:lkxed 译者:gpchn 校对:wxy

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

对 GNOME 43 桌面环境的各种功能的介绍,以及它给你的日常需求和工作流程带来的变化和影响。

通过 GNOME OS 运行的 GNOME 43

这篇文章总结了所有关于 GNOME 43 的必要信息,包括功能、发布时间表等等。GNOME 43 版本可能是自 GNOME 40 以来在功能和对你的工作流程影响最大的一个版本。

主要的变化包括更新的 Shell 和更快的性能,内含了 GTK4 和 libadwaita 的转换,翻新的文件应用和 Web 应用的奇妙变化。

所有这些必要的变化都是早该进行的,并将改变你在 GNOME 桌面上的传统工作流程,使你的工作效率更高。

时间表

GNOME 43 于 2022 年 9 月 21 日 正式发布

  • GNOME 43 测试版:2022 年 8 月 31 日
  • GNOME 43 候选版:2022 年 9 月 4 日
  • GNOME 43 最终版:2022 年 9 月 21 日

GNOME 43 的功能

1、核心 Shell 的变化

  • 终于,得益于 Wayland 最近的工作,GNOME 有了对高分辨率的滚轮支持。所以,如果你有一个高分辨率的显示器,用一个高级的鼠标(比如罗技 MX Master 3)来滚动应该成为了一种享受。
  • 除了上述情况,GNOME 43 中的 直接扫描输出 direct scanout 支持将有助于多显示器环境。
  • 服务器端的窗口装饰得到了基本的颜色支持。
  • Shell 还实现了一个功能,当焦点改变时,通知会消失,并不等待超时。
  • 和每个版本一样,你在整个桌面上会体验到更好的动画性能,改进了网格和概览导航以及关键的更新,这给你带来了顺滑的体验。

这些就是核心变化的关键总结。现在,让我们来谈谈快速设置。

2、新的快速设置菜单

系统托盘中的快速设置完全改变了。快速设置项目和菜单现在采用药丸状的切换按钮,用鲜艳的颜色来显示系统中正在发生的事情。该菜单也是动态的,并支持层叠的菜单项目。此外,你可以在快速设置中选择音频设备。

这里有一个快速演示,更多的屏幕截图和文章,请阅读:GNOME 43 快速设置

GNOME 43 的快速设置演示

3. 文件应用

GNOME 文件应用 Files 在 GNOME 43 版本中增加了很多功能。这个应用程序的改进清单非常巨大。文件管理器是任何桌面环境中使用最多的应用程序。因此,文件应用中的变化对整个用户群的影响最大。

这是 GTK4 版的文件应用第一次亮相(它在 GNOME 42 发布时还没有准备好),它将会彻底改变你的工作流程。

我将尝试用一个简短的列表来解释其中的大部分内容。否则,这将是一篇冗长的文章。我将单独推送另一篇关于文件应用的功能的文章。

自适应侧边栏

可以让你访问导航、收藏夹、网络驱动器等的文件应用侧边栏是响应式的。当文件应用窗口的大小达到一定程度时,它会 自动隐藏 自己。如果你工作时有很多打开的窗口,而且显示器较小,那么这是一个熟悉而方便的功能。

另一个令人兴奋的功能是,当侧边栏完全隐藏时,在左上方会出现一个图标,点击可使其可见。

自动隐藏侧边栏的文件应用 43

徽章

很久以前,GNOME 中就有了徽章,后来它们消失了。因此,徽章在 GNOME 43 中以文件和目录旁边的小图标的形象卷土重来。这些图标代表着类型,如符号链接、只读等。此外,这些图标会根据你的主题改变它们的颜色,而且一个文件也可以有多个图标。

GNOME 43 中的徽章

橡皮筋选择

接下来是期待已久的橡皮筋选择功能,它 终于到来了。现在你可以通过拖动选择机制来选择文件和文件夹。这是用户要求最多的功能之一。

橡皮筋选择功能

GtkColumnView 代替了 GtkTreeView

当你把鼠标放在列视图中的项目上时,你会看到一个焦点行,这是 GNOME 43 文件应用的另一个关键功能。但是它在 树形视图不能显示,可能计划在下一次迭代中实现。

GtkColumnView 启用了焦点行

重新设计的属性窗口,具有交互式的权限和可执行文件检测功能

通过采用 GTK4,属性窗口 完全改变了。该窗口现在更加简洁,设计合理,只在需要的时候显示必要的项目。

此外,属性对话框可以确定文件类型并提供合适的选项。例如,如果你查看一个 Shell 脚本或文本文件的属性,你会得到一个选项,使其可执行。相反,图像文件的属性不会给你一个可执行的选项。

智能属性窗口

标签式视图的改进

文件的标签式视图得到了一些 额外的更新。最值得注意的是,当拖动文件到标签时,可以适当地聚焦,在当前聚焦的标签之后创建标签,等等。

重新设计的右键菜单

对文件或文件夹的主要右键菜单进行了分组。首先,打开选项被归入一个子菜单中。其次,复制/粘贴/剪切选项被合并到一个组中。最后,垃圾箱、重命名和压缩选项被归为一组。

此外,“ 在终端打开 Open in terminal ”的选项对所有文件和文件夹都可用。然而,仍然缺失一个“创建新文件”的选项(这是我在这个版本中所期望的)。(LCTT 译者:预计 GNOME 44 文件应用将出现此功能)

各种上下文菜单

其他变化

文件应用中其他醒目的变化是垃圾箱图标,以及其他位置(网络驱动器、磁盘)在右键菜单中有了属性菜单。

最后,文件应用的偏好窗口被重新设计,以显示更多的基本项目。重新设计后,普通用户可以很容易地找到适当的文件设置。

4、Web 应用

让我们抽出一些时间来谈谈我们心爱的 Epiphany,又称 GNOME Web,是 GNOME 桌面上基于 WebKit 的原生网页浏览器。

这些更新早就应该开始了,并且终于从这个版本开始出现了。

首先,GNOME Web 现在支持 WebExtension API。它可以让你在网络中下载和安装火狐和谷歌浏览器的扩展。以下是做法:

  • 从 Firefox 附加组件或谷歌 Chrome 扩展页面下载任何扩展文件(xpi 或 crx 文件)。
  • 点击汉堡菜单,选择 扩展程序 Extensions
  • 最后,点击 添加 Add 来安装它们。

WebExtension 的支持是使 Web 应用尽快可用的关键步骤。

其次,可以使用火狐浏览器同步选项,让你通过火狐浏览器账户登录 Web 应用,同步书签和其他浏览器项目。

使用火狐账户登录 Web 应用

Web 应用中其他值得注意的变化包括对 “查看源代码” 的支持、GTK4 的移植工作和一个更新的 PDF 库(PDF.js 2.13.216)。

Web 应用中仍然缺少的一个关键组件是 通过 GStreamer 支持WebRTC。一旦这个功能出现,它将是一个适合日常使用的浏览器。

希望有一天,我们都有一个体面的非火狐、非 Chromium 的替代浏览器。

5、设置应用

设置应用 Settings 的窗口中,大部分改进和视觉微调在这个版本中出现。重要的变化包括警报中的 “狗叫声” 在经过长时间的 有趣的对话 后现在已经消失。

此外,引入了一个新的设备安全面板,日期和时间面板中的时区地图也修改了。

设置窗口的侧边栏也是响应式的,并为你提供自动隐藏功能,如上图所示的文件应用一样。

6、软件应用

GNOME 软件应用 Software 有两个关键的变化。这些变化使你可以在一个页面上查看应用程序的更多信息。

首先,一个新“该作者的其他应用程序”部分,为你提供了一个由当前应用程序的作者编写的应用程序列表。这有助于发现并告诉你应用作者有多受欢迎。

其次,GNOME 43 软件应用现在在一个单独的窗口中为你提供了 Flatpak 应用程序所需的详细权限列表。因此,你可以在安装它们之前确认该应用程序所需权限。

另一个关键的视觉变化是在应用程序概览主页面上新增了 “适用于 Fedora/任何发行版”部分,这需要配置。

软件应用中的开发者的其他应用程序部分

7、气候变化墙纸

我不确定这个功能是否有了。因为我找不到它,但我听说过它。所以,我想我应该在这里提到它。

这个功能是,GNOME 43 带来了一张背景墙纸,显示了全球温度在几十年间是如何从 海洋条纹 上升的。该墙纸包含了垂直的彩色编码条,表示低和高的温度。我认为这是一个很好的提示,也是提高人们认识的努力。这是它在 GitLab 中的 提交

此外,还有几张新的 白天和黑夜 的新鲜壁纸。

这就是我可以找到并总结的所有基本变化。除了这些,GNOME 43 还有大量的错误修复、性能改进和代码清理。

Fedora 37 将在发布时采用 GNOME 43,它的某些部分应该在 10 月发布的 Ubuntu 22.10 中出现。

总结

GNOME 43 是一个标志性的版本,因为它改变了几个基本的设计,影响了数百万用户的工作流程。快速设置的转变是非常棒的,而且早该如此了。此外,文件应用、Web 应用和设置应用的必要改变将提高你的工作效率。

此外,新功能的到来,同时保持了设计准则和美学的理念。一个好的用户界面需要一个深思熟虑的过程,而开发者在这个版本中做了完美的工作。

所以,差不多就是这样了。这就是 GNOME 43 的内容。如果你打算得到这个更新并想从 KDE 跳到 GNOME,请告诉我!

?️请在下面的评论区让我知道你最喜欢的功能。

举杯~


via: https://www.debugpoint.com/gnome-43/

作者:Arindam 选题:lkxed 译者:wxy 校对:wxy

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

微软的 WSL 现已支持 systemd,为用户提供了更好的体验。你可阅读此文了解更多。

systemd 已可用于 WSL

WSL( Windows 的 Linux 子系统 Windows Subsystem for Linux )终于拥有了对 systemd 的支持,这是在 systemd 的创建者加入微软的几个月后实现的。

更多 Linux 开发者们加入微软,systemd 的创建者也加入这一行列

而这已通过微软和 Cannonical 的合作成为可能。

如果你好奇 systemd 是什么

systemd 是一套 Linux 系统的基本组成模块。它提供了一个系统和服务管理器,作为 PID 1 运行,并启动系统的其他部分。

来自:systemd.io

它作为一个初始化系统,启动并维持用户空间其他服务的正常运行。

让我们看看它是如何被引入 WSL 的。

systemd 增强 WSL 的体验

在 WSL 中引入 systemd,主要是为改善 Windows 机器上的 Linux 工作流程。

像 Debian、Ubuntu、Fedora 等,都是默认运行 systemd 的。因此,这项整合将使这些发行版的用户更方便地在 WSL 上做更多工作。

很多关键的 Linux 程序也是靠 systemd 实现的。例如 snap、microk8s 和 LXD 都依赖它。

即使我们有 不含 systemd 的发行版 可用,它们也并不适合所有人。因此,在 WSL 上添加对 systemd 的支持是很有意义的。

systemd 的存在也使得在 Windows 中使用更多工具来测试和运行成为可能,从而带来更好的 WSL 体验。

它是如何实现的

WSL 背后的团队必须修改其架构,它们让 WSL 的初始化进程在 Linux 发行版中以 systemd 的一个子进程启动。

正如其 官方公告 所述,这样做使得 WSL 初始化程序能够为 Windows 和 Linux 子系统之间的通讯提供必要的基础。

它们还做了额外的修改,通过防止 systemd 保持 WSL 实例的活动以确保系统的干净关机。

你亦可访问他们的 官方文档 以了解更多。

在 WSL 上使用 systemd

现有的 WSL 用户必须在他们的系统上手动启用 systemd,以防止由于 systemd 的引入而导致的启动问题。

首先,你必须确保你的系统运行的是 0.67.6 或更高版本的 WSL。

你可以通过以下命令检查你的 WSL 版本。

wsl --version

如果你正在运行旧版本,你可以通过 微软应用商店 Microsoft Store 或者以下命令更新它。

wsl --update

此外,如果你不是 Windows 预览体验成员 Windows Insider ,你可以到 WSL 发行页面 下载它来体验。

为了让 systemd 在你的系统上运行,你需要修改 wsl.conf 这个文件以确保 systemd 在启动时运行。

wsl.conf 添加以下几行以使 WSL 在启动时运行 systemd

[boot]
systemd=true

最后,重启你的 WSL 实例以见证更改。

随着对 systemd 的支持,微软在 WSL 的发展又前进了一大步,这将使得 WSL 吸引更多用户。

? 是否对 WSL 支持 systemd 感到兴奋?或是你更喜欢无 systemd 的发行版?


via: https://news.itsfoss.com/systemd-wsl/

作者:Sourav Rudra 选题:lkxed 译者:vvvbbbcz 校对:wxy

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

本快速指南介绍了在 Arch Linux 和其他发行版中使用终端设置和连接 WiFi 所需的步骤。

本指南非常适合没有 GUI 只有终端且没有其他有线互联网连接可用的情况。这些步骤可帮助你手动检测无线网卡和设备,并通过终端密码验证连接到 WiFi 热点。

本指南使用 iwd(Net Wireless Daemon)通过终端连接到 WiFi。

在 Arch Linux 和其他发行版中使用终端连接到 WiFi

1、设置 iwd

iwd 包有三个主要模块:

  • iwctl:无线客户端
  • iwd:守护进程
  • iwmon:监控工具

在终端中输入:

iwctl

iwctl 提示符

如果找不到该命令,那么需要从 此处 下载安装包。

从任何其他具有互联网连接的系统/笔记本电脑获取帮助,以通过安装 USB 下载和安装软件包。

或者,如果你有一个可连接互联网的 USB 网卡,那么将其插入你的系统。并通过以下命令安装。

USB 网卡应该可以在 Arch 和当今大多数 Linux 系统中开箱即用,连接到互联网。

Arch:

pacman -S iwd

Debian、Ubuntu 和其他类似发行版:

sudo apt-get install iwd

Fedora:

sudo dnf install iwd

如果你看到了 iwctl 提示符(如下所示),那么继续下一步。

2、配置

运行以下命令以获取系统的无线设备名称

device list

iwctl – 设备列表

获取 WiFi 网络列表,请运行以下命令。在以下命令和所有其他命令中将 wlan0 替换为你的设备名称。

station wlan0 get-networks

iwctl – 可用网络

该命令为你提供具有安全类型和信号强度的可用 WiFi 网络列表。

3、连接

连接到 WiFi 网络,请使用上述 get-networks 命令中的 WiFi 接入点名称运行以下命令。

station wlan0 connect

出现提示时输入你的 WiFi 密码。

使用 iwctl 连接到 WiFi

如果一切顺利,你现在可以连接到互联网。

使用指南

如下所示,你可以使用简单的 ping 命令检查连接。ping 回复成功的数据包传输表示连接稳定。

ping -c 3 google.com

你还可以使用以下命令检查连接状态。

station wlan0 show

iwd/var/lib/iwd 中保存 .psk 后缀的配置文件,其中带有你的接入点名称。此文件包含使用你的 WiFi 网络的密码和 SSID 生成的哈希文件。

CTRL+D 退出 iwctl 提示符。

总结

我希望本指南可以帮助你通过终端连接到互联网。当你没有其他方式连接到 WiFi 时,这会有所帮助。例如,如果你在独立系统(不是 VM)中安装 Arch Linux,那么需要连接到互联网以通过终端使用 pacman 下载软件包。

如果你遇到任何问题,请在下面的评论栏中指出错误消息。


via: https://www.debugpoint.com/connect-wifi-terminal-linux/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

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

开源库 GObject 和 libsoup 做了很多工作,因此你可以专注于使用 C 语言开发神奇的应用。

GLib 对象系统 Object System (GObject)是一个为 C 语言提供灵活且可扩展的面向对象框架的库。在这篇文章中,我将使用该库的 2.4 版本进行演示。

GObject 库继承了 ANSI C 标准,拥有一些常见的数据类型,例如:

  • gchar:字符型
  • guchar:无符号字符型
  • gunichar:32 位定宽 Unicode 字符型
  • gboolean:布尔型
  • gint8gint16gint32gint64:有符号 8、16、32 和 64 位整数
  • guint8guint16guint32guint64:无符号 8、16、32 和 64 位整数
  • gfloat:IEEE 754 标准单精度浮点数
  • gdouble:IEEE 754 标准双精度浮点数
  • gpointer:泛指针

函数指针

GObject 库还引入了类和接口的类型和对象体系。之所以可以,是因为 ANSI C 语言可以理解函数指针。

你可以这样做来声明函数指针:

void (*my_callback)(gpointer data);

首先,你需要给变量 my_callback 赋值:

void my_callback_func(gpointer data)
{
  //do something
}

my_callback = my_callback_func;

函数指针 my_callback 可以这样来调用:

gpointer data;
data = g_malloc(512 * sizeof(gint16));
my_callback(data);

对象类

GObject 基类由 2 个结构(GObjectGObjectClass)组成,你可以继承它们以实现你自己的对象。

你需要在结构体中先嵌入 GObjectGObjectClass

struct _MyObject
{
  GObject gobject;
  //your fields
};

struct _MyObjectClass
{
  GObjectClass gobject;
  //your class methods
};

GType my_object_get_type(void);

对象的实现包含了公有成员。GObject 也提供了私有成员的方法。这实际上是 C 源文件中的一个结构,而不是在头文件。该类通常只包含函数指针。

一个接口不能派生自另一个接口,比如:

struct _MyInterface
{
  GInterface ginterface;
  //your interface methods
};

通过调用 g_object_get()g_object_set() 函数来访问属性。若要获取属性,你必须提供特定类型的返回位置。建议先初始化返回位置:

gchar *str

str = NULL;

g_object_get(gobject,
  "my-name", &str,
  NULL);

或者你想要设置属性:

g_object_set(gobject,
  "my-name", "Anderson",
  NULL);

libsoup HTTP 库

libsoup 项目为 GNOME 提供了 HTTP 客服端和服务端使用的库。它使用 GObjects 和 glib 主循环与集成到 GNOME 应用,并且还具有用于命令行的同步 API。

首先,创建一个特定身份验证回调的 libsoup 会话。你也可以使用 cookie。

SoupSession *soup_session;
SoupCookieJar *jar;

soup_session = soup_session_new_with_options(SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_AUTH_BASIC,
  SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_AUTH_DIGEST,
  NULL);

jar = soup_cookie_jar_text_new("cookies.txt",
  FALSE);     

soup_session_add_feature(soup_session, jar);
g_signal_connect(soup_session, "authenticate",
  G_CALLBACK(my_authenticate_callback), NULL);

然后你可以像这样创建一个 HTTP GET 请求:

SoupMessage *msg;
SoupMessageHeaders *response_headers;
SoupMessageBody *response_body;
guint status;
GError *error;

msg = soup_form_request_new("GET",
  "http://127.0.0.1:8080/my-xmlrpc",
  NULL);

status = soup_session_send_message(soup_session,
  msg);

response_headers = NULL;
response_body = NULL;

g_object_get(msg,
  "response-headers", &response_headers,
  "response-body", &response_body,
  NULL);

g_message("status %d", status);
cookie = NULL;
soup_message_headers_iter_init(&iter,
response_headers);

while(soup_message_headers_iter_next(&iter, &name, &value)){    
  g_message("%s: %s", name, value);
}

g_message("%s", response_body->data);
if(status == 200){
  cookie = soup_cookies_from_response(msg);
  while(cookie != NULL){
    char *cookie_name;
    cookie_name = soup_cookie_get_name(cookie->data);
    //parse cookies
    cookie = cookie->next;
  }
}

当网络服务器进行身份认证时,会调用身份认证回调函数。

这是一个函数签名:

#define MY_AUTHENTICATE_LOGIN "my-username"
#define MY_AUTHENTICATE_PASSWORD "my-password"

void my_authenticate_callback(SoupSession *session,
  SoupMessage *msg,
  SoupAuth *auth,
  gboolean retrying,
  gpointer user_data)
{
  g_message("authenticate: ****");
  soup_auth_authenticate(auth,
                         MY_AUTHENTICATE_LOGIN,
                         MY_AUTHENTICATE_PASSWORD);
}

一个 libsoup 服务器

想要基础的 HTTP 身份认证能够运行,你需要指定回调函数和服务器上下文路径。然后再添加一个带有另一个回调的处理程序。

下面这个例子展示了在 8080 端口监听任何 IPv4 地址的消息:

SoupServer *soup_server;
SoupAuthDomain *auth_domain;
GSocket *ip4_socket;
GSocketAddress *ip4_address;
MyObject *my_object;
GError *error;

soup_server = soup_server_new(NULL);
auth_domain = soup_auth_domain_basic_new(SOUP_AUTH_DOMAIN_REALM, "my-realm",
  SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, my_xmlrpc_server_auth_callback,
  SOUP_AUTH_DOMAIN_BASIC_AUTH_DATA, my_object,
  SOUP_AUTH_DOMAIN_ADD_PATH, "my-xmlrpc",
  NULL);

soup_server_add_auth_domain(soup_server, auth_domain);
soup_server_add_handler(soup_server,
  "my-xmlrpc",
  my_xmlrpc_server_callback,
  my_object,
  NULL);

ip4_socket = g_socket_new(G_SOCKET_FAMILY_IPV4,
  G_SOCKET_TYPE_STREAM,
  G_SOCKET_PROTOCOL_TCP,
  &error);

ip4_address = g_inet_socket_address_new(g_inet_address_new_any(G_SOCKET_FAMILY_IPV4),
  8080);
error = NULL;
g_socket_bind(ip4_socket,
  ip4_address,
  TRUE,
  &error);
error = NULL;
g_socket_listen(ip4_socket, &error);

error = NULL;
soup_server_listen_socket(soup_server,
  ip4_socket, 0, &error);

示例代码中,有两个回调函数。一个处理身份认证,另一个处理对它的请求。

假设你想要网页服务器允许用户名为 my-username 和口令为 my-password 的凭证登录,并且用一个随机且唯一的用户 ID 字符串设置会话 cookie。

gboolean my_xmlrpc_server_auth_callback(SoupAuthDomain *domain,
  SoupMessage *msg,
  const char *username,
  const char *password,
  MyObject *my_object)
{
  if(username == NULL || password == NULL){
    return(FALSE);
  }

  if(!strcmp(username, "my-username") &&
     !strcmp(password, "my-password")){
    SoupCookie *session_cookie;
    GSList *cookie;
    gchar *security_token;
    cookie = NULL;

    security_token = g_uuid_string_random();
    session_cookie = soup_cookie_new("my-srv-security-token",
      security_token,
      "localhost",
      "my-xmlrpc",
      -1);

     cookie = g_slist_prepend(cookie,
       session_cookie);  
     soup_cookies_to_request(cookie,
       msg);
    return(TRUE);
  }
  return(FALSE);
}

对上下文路径 my-xmlrpc 进行处理的函数:

void my_xmlrpc_server_callback(SoupServer *soup_server,
  SoupMessage *msg,
  const char *path,
  GHashTable *query,
  SoupClientContext *client,
  MyObject *my_object)
{
  GSList *cookie;
  cookie = soup_cookies_from_request(msg);
  //check cookies
}

更加强大的 C 语言

希望我的示例展现了 GObject 和 libsoup 项目给 C 语言带来了真正的提升。像这样在字面意义上扩展 C 语言,可以使 C 语言更易于使用。它们已经为你做了许多工作,这样你可以专注于用 C 语言开发简单、直接的应用程序了。


via: https://opensource.com/article/22/5/libsoup-gobject-c

作者:Joël Krähemann 选题:lkxed 译者:Donkey-Hao 校对:wxy

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