分类 技术 下的文章

mkosi 是一个轻量级工具,用于从发行版软件包构建镜像。本文介绍如何使用 mkosi 从 RHEL 和 RHEL 通用基础镜像 Universal Base Image (UBI)的软件包构建镜像。RHEL UBI 是 RHEL 的一个子集,可以在没有订阅的情况下免费使用。

mkosi 特性

mkosi 支持一些输出格式,但最重要的是 可发现磁盘镜像 Discoverable Disk Images (DDI)。同一个 DDI 可用于引导容器、或运行在虚拟机、抑或是复制到 U 盘以引导真实物理机,然后从 U 盘复制到磁盘以引导系统。该镜像具有标准化的布局和描述其用途的元数据。

mkosi 依赖其他工具来完成大部分工作:使用 systemd-repart 在磁盘镜像上创建分区,使用 mkfs.btrfs / mkfs.ext4 / mkfs.xfs 等创建文件系统,并使用 dnf / apt / pacman / zypper 下载和解压包。

mkosi 支持一系列发行版:Debian 和 Ubuntu、Arch Linux、openSUSE,当然还包括 Fedora、CentOS Stream 及其衍生版本,以及最近的 RHEL UBI 和 RHEL 。由于实际的“重活”是由其他工具完成的,mkosi 可以进行交叉构建。这意味着可以使用一个发行版构建各种其他发行版的镜像。唯一的要求是主机上安装了相应的工具。Fedora 有原生的 aptpacmanzypper,因此它为使用 mkosi 构建任何其他发行版提供了良好的基础。

它还有一些有趣的功能:镜像可以由非特权用户创建,或者在没有设备文件的容器中创建,特别是没有对回环设备的访问权限。它还可以在没有特权的情况下将这些镜像启动为虚拟机(使用 qemu)。

配置是声明性的,非常容易创建。使用 systemd-repart 创建磁盘分区,并使用 repart.d 配置文件定义应该如何完成此操作。

有关更多详细信息,请参见 Daan DeMeyer 在 All Systems Go 大会上的两个演讲:《systemd-repart: Building Discoverable Disk Images》 和 《mkosi: Building Bespoke Operating System Images》。

项目目标

mkosi 的一个目标是允许对软件项目进行针对不同发行版的测试。它将为一个发行版创建一个镜像(使用该发行版的软件包),然后将软件项目编译并安装到该镜像中,插入不属于软件包的额外文件。但是,首个阶段,即从软件包创建镜像的过程,本身就是有用的。这是我们将首先展示的内容。

我们 [1] 最近添加了对 RHEL 和 RHEL UBI 的支持。让我们从 RHEL UBI 开始,利用发行版软件包创建镜像。

请注意,下面的示例要求 mkosi 19,而且不适用于更早的版本。

带有 Shell 的基本 RHEL UBI 镜像

$ mkdir -p mkosi.cache
$ mkosi \
    -d rhel-ubi \
    -t directory \
    -p bash,coreutils,util-linux,systemd,rpm \
    --autologin

上面的命令指定了发行版 rhel-ubi,输出格式 directory,并请求安装软件包 bashcoreutils、…、rpmrpm 通常不需要放到镜像内部,但在这里用于内省会很有用。我们还启用了以 root 用户自动登录。

在启动构建之前,我们创建了缓存目录 mkosi.cache。当存在缓存目录时,mkosi 会自动使用它来持久化下载的 RPM 包。这将使相同软件包集合的后续调用速度更快。

然后,我们可以使用 systemd-nspawn 将此镜像作为容器启动:

$ sudo mkosi \
    -d rhel-ubi \
    -t directory \
    boot
systemd 252-14.el9_2.3 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS -FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
Detected virtualization systemd-nspawn.
Detected architecture x86-64.
Detected first boot.

Red Hat Enterprise Linux 9.2 (Plow)
...
[ OK ] Created slice Slice /system/getty.
[ OK ] Created slice Slice /system/modprobe.
[ OK ] Created slice User and Session Slice.
...
[ OK ] Started User Login Management.
[ OK ] Reached target Multi-User System.

Red Hat Enterprise Linux 9.2 (Plow)
Kernel 6.5.6-300.fc39.x86_64 on an x86_64

image login: root (automatic login)

[root@image ~]# rpm -q rpm systemd
rpm-4.16.1.3-22.el9.x86_64
systemd-252-14.el9_2.3.x86_64

正如前面提到的,此镜像可以用于启动虚拟机。但在此设置下,这是不可能的 —— 我们的镜像没有内核。事实上,RHEL UBI 根本不提供内核,因此我们无法使用它进行引导(无论是在虚拟机上还是在裸机上)。

创建镜像

我一开始说是要创建镜像,但到目前为止我们只有一个目录。让我们开始实际创建一个镜像:

$ mkosi \
    -d rhel-ubi \
    -t disk \
    -p bash,coreutils,util-linux,systemd,rpm \
    --autologin

这将生成 image.raw,一个带有 GPT 分区表和单个根分区(用于本机架构)的磁盘镜像。

$ sudo systemd-dissect image.raw
Name: image.raw
Size: 301.0M
Sec. Size: 512
Arch.: x86-64

Image UUID: dcbd6499-409e-4b62-b251-e0dd15e446d5
OS Release: NAME=Red Hat Enterprise Linux
VERSION=9.2 (Plow)
ID=rhel
ID_LIKE=fedora
VERSION_ID=9.2
PLATFORM_ID=platform:el9
PRETTY_NAME=Red Hat Enterprise Linux 9.2 (Plow)
ANSI_COLOR=0;31
LOGO=fedora-logo-icon
CPE_NAME=cpe:/o:redhat:enterprise_linux:9::baseos
HOME_URL=https://www.redhat.com/
DOCUMENTATION_URL=https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9
BUG_REPORT_URL=https://bugzilla.redhat.com/
REDHAT_BUGZILLA_PRODUCT=Red Hat Enterprise Linux 9
REDHAT_BUGZILLA_PRODUCT_VERSION=9.2
REDHAT_SUPPORT_PRODUCT=Red Hat Enterprise Linux
REDHAT_SUPPORT_PRODUCT_VERSION=9.2

Use As: ✗ bootable system for UEFI
        ✓ bootable system for container
        ✗ portable service
        ✗ initrd
        ✗ sysext extension for system
        ✗ sysext extension for initrd
        ✗ sysext extension for portable service

RW DESIGNATOR PARTITION UUID PARTITION LABEL FSTYPE ARCHITECTURE VERITY GROWFS NODE PARTNO
rw root 1236e211-4729-4561-a6fc-9ef8f18b828f root-x86-64 xfs x86-64 no yes /dev/loop0p1 1

好的,我们现在有一个镜像,镜像中包含了一些来自 RHEL UBI 软件包的内容。我们如何在其上加点我们自己的东西呢?

使用自己的文件扩展镜像

有几种方法可以扩展镜像,包括从头开始编译某些东西。但在那之前,让我们做一些更简单的事情,将一个现成的文件系统注入到镜像中:

$ mkdir -p mkosi.extra/srv/www/content
$ cat >mkosi.extra/srv/www/content/index.html <<'EOF'
<h1>Hello, World!</h1>
EOF

现在,该镜像将包含 /srv/www/content/index.html

这种方法用于注入额外的配置或简单的程序。

从源代码构建

现在让我们过一遍完整流程,从源代码构建一些东西。例如,一个简单的 Meson 项目,有一个单独的 C 文件:

$ cat >hello.c <<'EOF'
#include <stdio.h>

int main(int argc, char **argv) {
    char buf[1024];

    FILE *f = fopen("/srv/www/content/index.html", "re");
    size_t n = fread(buf, 1, sizeof buf, f);

    fwrite(buf, 1, n, stdout);
    fclose(f);
    return 0;
}
EOF

$ cat >meson.build <<'EOF'
project('hello', 'c')
executable('hello', 'hello.c',
            install: true)
EOF
$ cat >mkosi.build <<'EOF'
set -ex

mkosi-as-caller rm -rf "$BUILDDIR/build"
mkosi-as-caller meson setup "$BUILDDIR/build" "$SRCDIR"
mkosi-as-caller meson compile -C "$BUILDDIR/build"
meson install -C "$BUILDDIR/build" --no-rebuild
EOF
$ chmod +x mkosi.build

总结一下:我们有一些源代码(hello.c),一个构建系统配置文件(meson.build),以及一个由 mkosi 调用的胶水脚本(mkosi.build)。对于实际的项目,也会有相同的元素,只是更加复杂。

这个脚本需要一些解释。mkosi 在创建镜像时使用用户命名空间。这允许包管理器(例如 dnf)安装由不同用户拥有的文件,即使它是由一个普通非特权用户调用的。我们使用 mkosi-as-caller 切换回调用者以进行编译。这样,在 $BUILDDIR 下编译期间创建的文件将由调用者拥有。

现在让我们使用我们的程序构建镜像。与之前的调用相比,我们需要额外的软件包:mesongcc。由于我们现在有了构建脚本,mkosi 将执行两个构建阶段:首先创建一个构建镜像,并在其中调用构建脚本,将安装产物存储在一个临时目录中,然后构建最终镜像,并将安装产物注入其中。(mkosi 设置 $DESTDIRmeson install 自动使用 $DESTDIR,因此并不需要我们明确指定。)

$ mkosi \
    -d rhel-ubi \
    -t disk \
    -p bash,coreutils,util-linux,systemd,rpm \
    --autologin \
    --build-package=meson,gcc \
    --build-dir=mkosi.builddir \
    --build-script=mkosi.build \
    -f

此时,我们有了带有自定义载荷的镜像 image.raw。我们可以启动我们新创建的可执行文件作为 shell 命令:

$ sudo mkosi -d rhel-ubi -t directory shell hello
<h1>Hello, World!</h1>

获取 RHEL 的开发者订阅

RHEL UBI 主要用作容器构建的基础层。它提供了有限的软件包(约 1500 个)。现在让我们切换到完整的 RHEL 安装。

获取 RHEL 的最简单方法是使用 开发者许可证。它提供了权限注册 16 个运行 RHEL 的物理或虚拟节点,并提供自助式支持。

首先,创建一个账户。然后,转到 管理页面 并确保启用了“用于 Red Hat 订阅管理的简化内容访问”。接下来,创建一个新的激活密钥,选择 “Red Hat 个人开发者订阅”。记下显示的组织 ID。在下面,我们将使用密钥名称和组织 ID 分别表示为 $KEY_NAME$ORGANIZATION_ID

现在,我们准备使用 RHEL 内容:

$ sudo dnf install subscription-manager
$ sudo subscription-manager register \
    --org $ORGANIZATION_ID --activationkey $KEY_NAME

使用 RHEL 构建镜像

在之前的示例中,我们通过参数开关指定了所有配置。这对于快速开发很友好,但可能在情况复杂时变得难以处理。RHEL 是一个严肃的发行版,所以让我们改为使用配置文件:

$ cat >mkosi.conf <<'EOF'
[Output]
Format=directory
Output=rhel-directory

[Distribution]
Distribution=rhel

[Content]
Packages=
bash
coreutils
util-linux
systemd
systemd-boot
systemd-udev
kernel-core

Bootable=yes
Bootloader=uki
Autologin=yes
WithDocs=no
EOF

首先,让我们检查一下一切是否正常:

$ mkosi summary

现在让我们构建镜像(呃,或者说,目录):

$ mkosi build
$ mkosi qemu
Welcome to Red Hat Enterprise Linux 9.2 (Plow)!

[ OK ] Created slice Slice /system/modprobe.
[ OK ] Reached target Initrd Root Device.
[ OK ] Reached target Initrd /usr File System.
[ OK ] Reached target Local Integrity Protected Volumes.
[ OK ] Reached target Local File Systems.
[ OK ] Reached target Path Units.
[ OK ] Reached target Remote Encrypted Volumes.
[ OK ] Reached target Remote Verity Protected Volumes.
[ OK ] Reached target Slice Units.
[ OK ] Reached target Swaps.
...
[ OK ] Listening on Journal Socket.
[ OK ] Listening on udev Control Socket.
[ OK ] Listening on udev Kernel Socket.
...
Red Hat Enterprise Linux 9.2 (Plow)
Kernel 5.14.0-284.30.1.el9_2.x86_64 on an x86_64

localhost login: root (automatic login)
[root@localhost ~]#

很好,我们将“镜像”构建为一个带有文件系统树的目录,并在虚拟机中引导了它。

在引导的虚拟机中,findmnt / 显示根文件系统是 virtiofs。这是一个虚拟文件系统,将主机的目录暴露给客户机。我们其实也可以构建一个更传统的镜像,其中包含文件系统和文件内的分区表,但“目录 + virtiofs” 对于开发来说更快且更友好。

我们刚刚引导的镜像未注册。要允许从镜像“内部”下载更新,我们必须将 yumsubscription-managerNetworkManager 添加到软件包列表,并在下载任何更新之前以与上述相同的方式调用 subscription-manager。在这之后,我们在基本仓库中就有大约 4500 个软件包可用,并且还有一些包含更多专业软件包的额外仓库。

最后

今天就是这些了。如果您有问题,可以在 Matrix 上找到我们,地址为 #mkosi:matrix.org,或者在 systemd 邮件列表 上找到我们。

(题图:MJ/a6e60316-ed03-4e23-b8b4-22332a0f5bfa)


  1. Daan DeMeyer、Lukáš Nykrýn、Michal Sekletár、Zbigiew Jędrzejewski-Szmek ↩︎

via: https://fedoramagazine.org/create-images-directly-from-rhel-and-rhel-ubi-package-using-mkosi/

作者:Zbigniew Jędrzejewski-Szmek 选题:lujun9972 译者:GlassFoxowo 校对:wxy

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

如果在 Arch Linux 中安装软件包时遇到 “target not found” 错误,你可以采取以下措施。

有一天,我尝试在 Arch Linux 上安装 Hyprland。当我使用 Pacman 命令安装 它时,它抛出 “target not found”(目标未发现)错误。

$ sudo pacman -S hyprland
[sudo] password for abhishek:
error: target not found: hyprland

这是一个意外,因为我知道 Hyprland 是可用的。

我的修复方法是更新系统,在大多数情况下,它可以解决此问题。

sudo pacman -Syu

这里,本地包数据库不同步。我需要更新缓存。这里还建议更新系统。

在大多数情况下,这就是修复此错误的方法。但是,你看到此错误的原因可能还有其他一些。让我在这里详细讨论它们。

修复:更新系统

Arch Linux 是一个 滚动发布发行版,并且它提供的更新非常频繁。如果你不每隔几天更新一次系统,你的本地包数据库将与远程镜像不同步,并且你将在安装软件包时遇到问题。

本地包数据库仅保留包的元数据,例如版本号、用于获取包的仓库 URL 等。

当你搜索软件包时,pacman 会提供搜索结果,表明该软件包可用。但是,该包在你的本地数据库中具有较旧的版本号。当 pacman 在远程仓库中搜索包(以获取实际的包)时,它不再找到旧版本的 URL。

这就是导致 “target not found” 错误的原因。

修复方法是更新本地数据库。这可以与 pacman -Sy 一起使用,但是,建议 更新整个 Arch Linux 系统 以避免依赖冲突等。

sudo pacman -Syu
? 如果你已有几周没有更新系统,请做好更新超过 1 GB 的准备。这可能需要一些时间,具体取决于你的互联网速度和你使用的镜像。

就我而言,Arch 安装在我的辅助系统上。由于我一周左右无法使用它,该系统已经过时了。更新后,我就可以安装 Hyprland

? 如果这不起作用,请通过添加额外的 y 强制刷新所有包数据库: sudo pacman -Syyu

修复 “target not found” 错误的其他建议

如果上述方法没有为你解决此错误,这里有一些修复此错误的提示。

仔细检查包名称

我亲爱的 Watson,这可能看起来很简单,但人们通常只是错误地输入了包名称。

Linux 区分大小写,包通常以小写命名。因此,如果你要使用一个名为 Flameshot 的流行工具,那么它的包名称很可能是 flameshot。

此外,某些软件的拼写与常见软件的拼写不同。例如,它是 hyprland,这使我错误地输入了 hyperland(使用通常的 “hyper” 拼写)。

在极少数情况下,可能会混淆是 lI 或者 1

基本上,确保你输入的包名称是正确的。

查看该软件包在仓库中是否可用

Arch Linux 的仓库中有大量软件包。但这并不意味着它拥有所有可能的 Linux 软件包。

访问 Arch Linux 官方软件包网站:

Arch Linux 软件包搜索

在这里输入包名,查看该包是否可用。如果是,它是哪个仓库以及它在哪个设备上可用。

x86_64 适用于英特尔架构,任何包含 ARM 架构的均适用于 树莓派类设备

? 如果在某些仓库中找到该软件包,但 pacman 即使在更新的系统上也找不到它,请检查 pacman.conf 文件并查看是否启用了所述仓库。

确保它不是 AUR 包

Arch 用户仓库(AUR) 是提供更新包的附加社区支持平台。

现在,有多种使用 AUR 包的方法,但 pacman 不是其中之一。

检查你尝试安装的软件包是否是 AUR 软件包。首先检查官方 Arch 仓库,如上所述。如果不存在,请检查 AUR 页面。

如果它是 AUR 包,则必须 使用 yay 或一些 其他 AUR 帮助程序。你不能使用 pacman 安装 AUR 软件包。

你能解决这个问题吗?

在大多数情况下,更新系统可以解决此问题。在极少数情况下,可能还有其他原因,我已经提到了一些建议。

现在轮到你了。如果你能够解决此问题,请在评论区告诉我。

(题图:MJ/b71c9760-4cb1-41de-a336-3e38026bcfeb)


via: https://itsfoss.com/target-not-found-arch-linux/

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

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

VSCodium 是微软 VS Code 真正开源的版本,它可以轻松安装在 Fedora 上。具体方法如下。

Visual Studio Code(VS Code)是微软开发的一款流行的跨平台文本编辑器。它基于 Electron 框架构建,被开发人员广泛用于编码和文本编辑任务。VS Code 的核心,称为 “Code - OSS”,是开源的,并在 MIT 许可证下分发。然而,微软添加了特定的自定义功能,并在专有许可下发布了其品牌版本的编辑器。

为了解决有关 遥测 和许可的问题,有一个名为 “VSCodium” 的替代方案,它是社区驱动、禁用遥测且获得 MIT 许可的 VS Code 版本。

VSCodium running on Fedora 39

在本教程中,我将指导你完成在 Fedora Linux 系统上安装和运行 VSCodium 的过程。

有三种方法可以做到这一点:

  1. 从发布页面下载 rpm 文件进行安装。但是,你需要重复该过程才能更新软件包(这可能会令人沮丧)。
  2. 添加 paulcarroty 仓库(如 VSCodium 网站所述)。因此,当你 更新你的 Fedora 系统 VScodium 也会得到更新(这是相当无缝的)。
  3. 使用 flatpak 版本,你可能已经尝试过从 GNOME “软件”中安装该版本(我有过同样的糟糕经历,因此可能会有所不同)。

第一个非常简单,即从 发布页面 下载并 安装 RPM 文件。那么,让我们切入主题并遵循其他两种方法。

方法 1:通过添加仓库来安装 VSCodium

打开终端:你可以通过在应用菜单中搜索 “Terminal” 来打开终端。

添加 GPG 密钥:以便包管理器信任仓库的打包者。

sudo rpmkeys --import https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/-/raw/master/pub.gpg

添加 VSCodium 仓库:以下命令会将仓库添加到你的 Fedora 系统。

printf "[gitlab.com_paulcarroty_vscodium_repo]\nname=download.vscodium.com\nbaseurl=https://download.vscodium.com/rpms/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://gitlab .com/paulcarroty/vscodium-deb-rpm-repo/-/raw/master/pub.gpg\nmetadata_expire=1h" | sudo tee -a /etc/yum.repos.d/vscodium.repo

安装VSCodium:现在你已经添加了 VSCodium 存储库,你可以使用以下命令安装它(喜欢前沿软件的人可以将软件包名称替换为 codium-insiders 来安装 insider 版本):

sudo dnf install codium

启动 VSCodium:你现在可以从应用菜单或在终端中运行以下命令来启动 VSCodium:

codium

删除 VSCodium

如果你不喜欢 VSCodium 以及它基于 Electron 的事实,或者改用 Neovim。你可以使用以下命令删除它:

sudo dnf remove codium

你可以将仓库和签名添加到你的系统中,也可以不保留(为什么不)。

因此,让我们摆脱该仓库:

sudo rm /etc/yum.repos.d/vscodium.repo

方法 2:使用 Flatpak 安装 VSCodium

你也可以安装 Flatpak。因此,以下是在 Fedora 上使用 Flatpak 安装 VSCodium 的步骤:

你可以通过启用 Flathub 直接在 Fedora 上安装它,如果你使用的是最新版本之一并且为 Fedora 启用了第三方仓库,那么可能会启用该功能。只需在 GNOME “软件” 应用中搜索 VSCodium 并单击安装即可。

Installing the flatpak from Gnome Software

不过,由于某些原因运行旧版本的用户,或者他们可能有一个未启用 Flatpak 的分叉,也可以效仿。

安装 Flatpak 并启用 Flathub:Fedora 通常预装了 Flatpak。如果尚未安装,你可以使用以下命令进行安装:

sudo dnf install flatpak

要启用 Flathub 仓库,请使用以下命令:

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

现在你已经设置了 Flatpak,你可以使用 Flathub 仓库安装 VSCodium。运行以下命令:

flatpak install flathub com.vscodium.codium

启动 VSCodium:你可以使用以下命令通过 Flatpak 启动 VSCodium:

flatpak run com.vscodium.codium

或者,你也可以在应用菜单中搜索 “VSCodium” 并从那里启动它。

就是这样! 你现在应该已经使用 Flatpak 在 Fedora 系统上安装并运行了 VSCodium。

要删除它,请使用以下命令:

sudo flatpak uninstall com.vscodium.codium

附言

如果你使用过 VS Code,那么你不会发现这两个软件之间有任何区别。这只是为了开放和免受微软版本的邪恶遥测的影响。

在 Fedora,我首先安装了 Flatpak 版本,但在 Wayland 会话中,VSCodium 没有显示任何窗口装饰(这显然是默认的)。这让我很难用鼠标导航。

VSCodium flatpak showing no window decorations.

我尝试了一些方法来解决这个问题,但由于 Fflatpak 配置文件的位置很奇怪,所以没有成功。如果有人有或能找到解决上述问题的办法,请在下面发表评论。不过,使用 rpm 版本倒是天衣无缝(也许怀疑论者对替代软件包管理系统的看法是对的)。

扩展和插件在大部分情况下都没有问题。你也可以按照本教程在企业 Linux 系列的任何发行版(如 Alma Linux、Rocky Linux 等)上安装。

(题图:MJ/5f39d386-d28c-4b3d-97a8-b498290d54f7)


via: https://itsfoss.com/install-vscodium-fedora/

作者:Anuj Sharma 选题:lujun9972 译者:geekpi 校对:wxy

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

在这篇基本命令行教程中,你将学习在 Linux 终端重命名文件和目录的各种方法。

如何在 Linux 终端中重命名文件和目录?你可以使用 mv 命令。

是的,与用于将文件和文件夹从一个位置“移动”到另一个位置的 mv 命令相同。

你可以在“移动文件和目录”时简单地指定文件和目录的新名称。

要重命名文件,请使用:

mv old_file new_file

同样,要重命名目录,请使用:

mv old_dir new_dir

听起来很容易,对吧? 但我将在这里详细讨论文件重命名:

  • 向你展示重命名的实际示例
  • 显示通过结合 findexec 命令批量重命名多个文件的示例
  • 讨论用于批量重命名文件的专用程序

我们来一一看看。

使用 mv 命令重命名文件和目录

使用 mv 命令重命名同一目录中的文件:

mv file1.txt file2.txt

同样,你可以重命名同一位置的目录:

mv dir1 dir2

这是我重命名文件和目录的示例:

如你所见,与 cp 命令 不同,你不必使用递归选项来通过 mv 命令 处理目录。

? 如果你尝试使用相同的名称重命名该文件,你会看到一个错误(显然)。

你还可以在将文件移动到另一个位置时重命名它:

mv old-file-name another_dir/new-file-name

在下面的示例中,我将名为 firefox-quiz.txt 的文件移动到示例目录。在这样做的同时,我将其重命名为 quiz.txt

我将其视为剪切粘贴操作。

? 虽然你可以将多个文件移动到另一个位置(mv file1 file2 file2 dir),但你不能使用 mv 重命名多个文件。为此,你必须采用我在以下部分中讨论的其他策略。

通过组合 mv、find 和 exec 命令重命名与某个模式匹配的多个文件

? 批量重命名此类文件时要格外小心。一步错误的举动就会导致无法挽回的不良结果。

find 命令用于根据文件名、类型、修改时间和其他参数在给定目录中查找文件。exec 命令与 find 结合使用,对 find 命令的结果执行命令。

使用 findexecmv 命令没有固定标准的结构。你可以根据需要组合它们。

假设你想通过在名称中添加 _old 来重命名当前目录中以 .txt 结尾的所有文件。所以 file_1.txt 变成 file_1.txt_old 等等。

find . -type f -name "*.txt" -exec mv {} {}_old ;

这只是一个示例,你的重命名要求可能会有所不同。另外,以上仅适用于不带空格的文件名

专业提示:在处理这样的批量操作时,你可以巧妙地使用 echo 命令来查看将执行什么操作,而不是实际执行它。如果看起来不错,那就采取实际行动吧。

例如,首先查看哪些文件将被重命名:

find . -type f -name "*.txt" -exec echo mv {} {}_old \;

如你所见,实际上没有重命名任何文件。但是,如果你在没有使用回显(echo)命令的情况下运行上述命令,你将看到将执行什么命令。

如果你觉得没问题,请删除 echo 命令并继续进行实际的重命名。

find . -type f -name "*.txt" -exec mv {} {}_old \;

我在 《Efficient Linux 命令行》一书中学到了这个技巧。一本充满了这样的小宝石的优秀书。难怪它已成为 我最喜欢的 Linux 书籍之一。

使用 rename 命令轻松重命名多个文件

有一个名为 rename 的便捷命令行程序,可用于根据给定的 Perl 正则表达式模式批量重命名文件。

该实用程序不是 GNU 工具链的一部分,也不是预安装的。因此,你必须首先使用发行版的包管理器来安装它。

对于 Debian/Ubuntu,命令为:

sudo apt install rename

你可以通过以下方式使用它:

rename [options] perl_regex [files]

选项有:

  • -v : 详细模式
  • -n :无操作,显示将被重命名的文件,但不重命名它们
  • -o : 不覆盖
  • -f : 强制覆盖现有文件
  • -s : 不重命名软链接,只重命名其目标

现在,让我们采用你在上一节中看到的相同示例。将 *.txt 重命名为 .txt_old

rename 's/\.txt$/.txt_old/' **

我不打算在这里解释正则表达式。** 表示查看所有子目录中的所有文件。

正如你所看到的,它按预期工作。

总结

我希望你喜欢这个技巧,它可以帮助你学习在 Linux 命令行中执行基本任务。当然是针对那些想学习和使用命令行的人。桌面用户始终拥有用于此类任务的 GUI 工具。

如果你对 Linux 命令完全陌生,本系列将对你有很大帮助。

终端基础:Linux 终端入门

如果你有疑问或建议,请告诉我。


via: https://itsfoss.com/linux-rename-files-directories/

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

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

Fedora 39 通过 SSSD 和 FreeIPA 为集中管理的用户开启了 FIDO2 认证功能。此篇文章将指导你如何进行配置和启用该功能。

FIDO2

FIDO2 是以 公钥加密 为基础的开放式认证标准,比起密码和一次性密码(OTP),它的安全性更高且易用性更强。它通常以类似小型 USB 和基于 NFC 的硬件安全令牌的方式提供。有几种符合 FIDO 认可的密钥品牌,例如:YubiKey、NitroKey、SoloKey v2 等等。

此协议的优势包括:

  • 通过使用公钥加密来消除密码,从而实现无密码认证。
  • 采用 多因素认证(MFA)以实现强力认证。
  • 减少了应用程序之间密码或公钥的重复使用,降低数据泄露的风险。
  • 私钥位于安全令牌中并且永不离开,这大大减少了被网络钓鱼的威胁。

前面的文章

在 Fedora 杂志中,有多篇文章阐述了如 FIDO2 的应用场景:《如何使用 FIDO2 验证本地用户》 和 《如何解锁硬盘》。而此篇文章介绍了如何使用 FIDO2 验证远程用户。请注意,上述所说的设备,主要是指那些来自 Yubico 采用了其他协议的设备,而此篇指南的目的并非讨论这些协议。

集中管理的用户

SSSDFreeIPA 最近新增了一个名为 通行密钥 passkey 的特性,以便对集中管理的用户执行 FIDO2 认证。此功能目前只在 SSSD 2.9.0FreeIPA 4.11.0 等版本中支持。

Fedora 39 已经包含了这些版本,因此,它是第一个为集中管理的用户启用 FIDO2 认证的发行版。此外,用户在认证成功后,也会一并获取一个 Kerberos 票据,实现对其他服务的身份证明。

请注意,从这里开始,我将交替使用 FIDO2 和通行密钥这两个术语。

FIDO2 认证

FIDO2 配置

作为额外的安全措施,应在设备中启用 MFA 以防你丢失了密钥,恶意行为者无法使用它进行认证。

列出连接的通行密钥设备:

$ fido2-token -L

为你的通行密钥设备设置 PIN(将大写字母替换为所需的):

$ fido2-token -C /dev/hidrawX

如果你有一个兼容的设备,你还可以启用其他认证因素,例如指纹。

集中用户配置

首先,我们来创建一个用户,并将通行密钥(passkey)设置为其认证方式(请根据需要将大写字母替换为相应的):

$ ipa user-add USERNAME --first NAME --last SURNAME --user-auth-type=passkey

或者,如果你已有一个用户,并只需要将 passkey 设置为其认证方式:

$ ipa user-mod USERNAME --user-auth-type=passkey

集中管理用户的 FIDO2 注册

接下来,我们为该用户注册这个通行密钥。这个步骤会提示你输入 PIN 码,随后触摸设备:

$ ipa user-add-passkey USERNAME --register
Enter PIN:
Please touch the device.
------------------------------------
Added passkey mappings to user "USERNAME"
------------------------------------
    User login: USERNAME
    Passkey mapping: passkey:XR/MXigmgiBz1z7/RlWoWZkXKIEf1x9Ux5uPNxtzzSTdTiF407u2nRYMPkK8pWjwUR8Aa2urCcC9cnpLbkKgFg==,MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZqgERsFFv4Yev1dyo2Ap4PvLirg3P3Uhig5mNA4qf061C9q5rg0nMDz9AOYxZmBrwvQEXHCasMNO9VAIVnBIVg==

此刻,用户的认证已准备就绪。

注意,如果你想在生产环境中使用此用户,我建议你至少注册两个不同的设备。这样,即使你丢失了其中一个设备,你也可以用另一个进行认证。

集中管理的用户的 FIDO2 认证

在初次尝试中,只有在物理连接令牌的系统中才能进行认证。这意味着你可以使用 su 或图形界面,但不能远程使用 ssh。

我们来试试使用 su,记得将大写字母替换为所需的。当要求你输入 PIN,然后触摸设备时,当设备灯闪烁时触摸它:

$ su - USERNAME@DOMAIN
Insert your passkey device, then press ENTER.
Enter PIN:

如果一切进行顺利,Kerberos 票据也应已被授予,然后你就可以向其他服务进行远程认证:

$ klist
Ticket cache: KCM:879400005:34862
Default principal: USERNAME@DOMAIN
Valid starting Expires        Service principal
10/20/23 09:46:04  10/21/23 09:32:37  krbtgt/DOMAIN@DOMAIN

结论

此认证机制的目标是提升安全性。通过使用一种众所周知、开放式的标准实现无密码和多因素认证,从而降低数据泄露和网络钓鱼威胁的风险。用户只需要一个硬件令牌及另外一个如 PIN 或者指纹的认证方式,从而消除对密码的需求,同时提供了方便的多因素认证方法。更进一步,每个应用或服务都使用一个唯一的密钥,这样任何一个应用或服务的数据泄露都不会影响其他的。最后,用户并不需要知道他们的凭据的具体细节,只需了解他们使用了一个实体令牌,这极大地降低了社交工程攻击的可能性。

(题图:MJ/838d5392-79b4-4c22-ab0f-c2ada4bf2833)


via: https://fedoramagazine.org/fido2-for-centrally-managed-users/

作者:Iker Pedrosa 选题:lujun9972 译者:ChatGPT 校对:wxy

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

在本次 Linux 黑话解释系列的这一篇,我们会一起来探索 Linux 中的 Super 键(或称其为 Meta 键)。

当你在网上浏览 Linux 教程时,你可能会遇到 “Super 键” 这个术语,对于 Linux 的初学者来说,这可能会引起混淆。

概括地说,如果你的电脑预装了 Windows,那么带有 Windows 标志的 Windows 键就是 Super 键。

如果你使用的是苹果电脑,那么带有 符号的 command 键就是你的 Super 键。

下面这个就是你的 Super 键(或者 Meta 键)

很简单吧?

但是,为什么要将其命名为 Super 键呢?毫无疑问,背后一定有一些有趣的故事。

那么,让我们一起按下 Super 键,发掘更深层次的故事吧。

Super 键背后的想法

它首次出现在 “space-cadet” 键盘中,这款键盘是在 1978 年为 Lisp 机器 设计的,其主要目的是用来模拟 Meta 键。(LCTT 译注:这款键盘的独特之处在于它设有七个修饰键,包括 ShiftControlMetaSuperHyper,用户可以通过组合这些修饰键与其他键来输入更多的字符和命令,它对现代计算机键盘的发展产生了重要影响。)

Meta 键在 Emacs 编辑器中是非常重要的一个部分,但在当时的现代键盘中却未能配备实体的 Meta 键,因而人们常常通过不同的按键绑定来模仿其功能。

Super 键的引入,解决了这个问题,由此我们有了一个真实的 Super 键。

快进到 1994 年,当时 Windows 键首次在 微软自然键盘 上出现,它被用来迅速打开“开始”菜单。从 1996 年开始,将 Meta 键映射到 Windows 键成为了普遍的做法。

Super 键的一般使用情况

当你在 Ubuntu 桌面上按下 Super 键时,它会显示活动概览,让你全面了解每个窗口正在进行的活动:

在 Ubuntu 中按下 Super 键获得活动概览

但你要知道,除了预览正在进行的活动,你其实还可以做更多。

比如,你可以同时按下 Super 键和 Tab 键,调出应用切换器,从而在正在运行的应用之间切换。

下面列举了一些可以利用 Super 键的快捷键(在 Ubuntu 23.10 内部测试通过):

? 如果你在使用的是基于 Ubuntu 的发行版,其中的某些快捷键可能并不会按照预期那样工作,因为发行版维护者可能已经将该快捷键指定为另一个任务。
快捷键描述
Super打开活动概览
Super + Tab切换开放应用
Super + D显示桌面(最小化所有窗口)
Super + A打开应用菜单
Super + S显示快速设定
Super + 将活动窗口移至屏幕的左半部分
Super + 将活动窗口移至屏幕的右半部分
Super + 最大化活动窗口
Super + 最小化活动窗口
Super + L锁定屏幕

这些操作实在太方便了,对吧?

通过快捷键提高生产效率

对于新接触 Ubuntu 的你,下列的一些有帮助的快捷键值得一试:

Ubuntu 用户应该知道的 13 个快捷键

如果你刚开始使用终端,我会推荐你学习 Linux 终端的基本快捷键

专业用户喜欢使用的 21 个 Linux 终端快捷键

我希望这篇文章能给你带来宝贵的信息,使你对 Super 键有更深入的了解 ?

(题图:MJ/9b9a1146-0e76-459a-880d-b1a1a4fa5f1e)


via: https://itsfoss.com/super-key/

作者:Sagar Sharma 选题:lujun9972 译者:ChatGPT 校对:wxy

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