蚊章汇 - Gregory Bartholomew
type: channel
link: https://linuxcn.bwsl.wang/author/1156/
description: Gregory Bartholomew
items: 使用 cpulimit 来释放你的 CPU
items: Fedora 33 Workstation 的新功能
items: 网络启动一个 Fedora Live CD
items: 使用 Postfix 从 Fedora 系统中获取电子邮件
items: 使用 dd 检查存储性能
items: 使用 mdadm 管理 RAID 阵列
items: 使用 sgdisk 管理分区
items: 如何构建一台网络引导服务器（四）
items: 如何构建一台网络引导服务器（三）
items: 如何构建一台网络引导服务器（二）

使用 cpulimit 来释放你的 CPU
type: item
date: 2021-06-19T16:40:00+08:00
description: 在 Linux 系统上管理系统资源的推荐工具是 cgroups。虽然在可以调整的限制方面（CPU、内存、磁盘 I/O、网络等）非常强大，但配置 cgroups 并不简单。nice) 命令从 1973 年起就可以使用了。但它只是调整在一个处理器上竞争时间的进程之间的调度优先级。nice 命令不会限制一个进程在单位时间内所能消耗的 CPU 周期的百分比。cpulimit 命令提供了两个世界的最佳方案。它限制了一个进程在每单位时间内可以分配的 CPU 周期的百分比，而且相对容易调用。cpulimit 命令主要对长期运行的和 CPU 密集型的进程有用。编译软件和转换视频是长期运行的进程的常见例子，它们可以使计算机的 CPU 使用率达到最大。限制这类进程的 CPU 使用率将释放出处理器时间，供计算机上可能运行的其他任务使用。限制 CPU 密集型进程也将减少功耗及热输出，并可能减少系统的风扇噪音。限制一个进程的 CPU 使用率的代价是，它需要更多的时间来完成运行。安装 cpulimitcpulimit 命令在默认的 Fedora Linux 仓库中可用。运行下面的命令，在 Fedora Linux 系统上安装 cpulimit：$ sudo dnf install cpulimit 查看 cpulimit 的文档cpulimit 软件包并没有附带的手册页。使用下面的命令来查看 cpulimit 的内置文档。输出结果在下面提供。但你可能需要在你自己的系统上运行该命令，以防止自本文编写以来选项发生变化。$ cpulimit --help Usage: cpulimit [OPTIONS…] TARGET OPTIONS -l, --limit=N percentage of cpu allowed from 0 to 800 (required) -v, --verbose show control statistics -z, --lazy exit if there is no target process, or if it dies -i, --include-children limit also the children processes -h, --help display this help and exit TARGET must be exactly one of these: -p, --pid=N pid of the process (implies -z) -e, --exe=FILE name of the executable program file or path name COMMAND [ARGS] run this command and limit it (implies -z) 演示为了演示 cpulimit 命令的使用方式，下面提供了一个精心设计的、计算量很大的 Python 脚本。该脚本首先在没有限制的情况下运行，然后在限制为 50% 的情况下运行。它计算的是第 42 个 斐波那契数 的值。该脚本在这两种情况下都作为 time 命令的子进程运行，以显示计算答案所需的总时间。$ /bin/time -f '(computed in %e seconds)' /bin/python -c 'f = lambda n: n if n<2 else f(n-1)+f(n-2); print(f(42), end=" ")' 267914296 (computed in 51.80 seconds) $ /bin/cpulimit -i -l 50 /bin/time -f '(computed in %e seconds)' /bin/python -c 'f = lambda n: n if n<2 else f(n-1)+f(n-2); print(f(42), end=" ")' 267914296 (computed in 127.38 seconds) 当运行第一个版本的命令时，你可能会听到电脑上的 CPU 风扇转动起来。但在运行第二个版本时，你应该不会。第一个版本的命令不受 CPU 的限制，但它不应该导致你的电脑陷入瘫痪。它是以这样一种方式编写的：它最多只能使用一个 CPU 核心。大多数现代 PC 都有多个 CPU 核心，当其中一个 CPU 100% 繁忙时，可以毫无困难地同时运行其他任务。为了验证第一条命令是否使你的一个处理器达到最大，在一个单独的终端窗口中运行 top 命令并按下 1 键。要退出 top 命令可以按 Q 键。设置高于 100% 的限制只对能够进行 任务并行化 的程序有意义。对于这样的程序，高于 100% 的增量代表一个 CPU 的全部利用率（200%=2 个CPU，3…

Fedora 33 Workstation 的新功能
type: item
date: 2020-11-08T16:07:17+08:00
description: Fedora 33 Workstation 是我们这个免费的、领先的操作系统的最新版本。你现在就可以从官方网站下载它。Fedora 33 Workstation 中有一些新的和值得注意的变化。请阅读如下更多细节。GNOME 3.38Fedora 33 Workstation 为各类用户提供了最新版本的 GNOME 桌面环境。在 Fedora 33 Workstation 中的 GNOME 3.38 包含了许多更新和改进，包括：一个新的 GNOME Tour 应用现在，新用户会看到一个“新的 Tour 应用，重点展示了桌面的主要功能，并为第一次使用 GNOME 的用户提供一个很好的欢迎页”。拖动重排序应用GNOME 3.38 用一个单一的可定制的、一致的视图取代了之前分开的“常用”和“所有”应用视图，这允许你重新排列应用并将它们组织到自定义文件夹中。只需点击并拖动即可移动应用。改进屏幕录制GNOME Shell 中的屏幕录制基础架构已被改进，以利用 PipeWire 和内核 API。这将有助于减少资源消耗并提高响应速度。GNOME 3.38 还提供了许多额外的功能和改进。查看 GNOME 3.38 发行说明以获得更多信息。B-tree 文件系统正如之前宣布的，新安装的 Fedora 33 将默认使用 Btrfs。每一个新的内核版本都会为 Btrfs 增加一些特性和增强功能。变更日志有一个完整的总结，它介绍了每个新内核版本给 Btrfs 带来的功能。Swap on ZRAMAnaconda 和 Fedora IoT 多年来一直默认使用 swap-on-zram。在 Fedora 33 中，将默认启用 swap-on-zram，而不是交换分区。查看 Fedora wiki 页面了解更多关于 swap-on-zram 的细节。默认使用 Nano新的 Fedora 33 将把 EDITOR 环境变量默认设置为 nano。这个变化影响了一些命令行工具，当它们需要用户输入时，会打开一个文本编辑器。在早期的版本中，这个环境变量的默认值并没有被指定，而是由各个应用程序来选择一个默认的编辑器。通常情况下，应用程序会使用 vi 作为它们的默认编辑器，因为它是一个小应用，通常在大多数 Unix/Linux 操作系统的基础安装中都可以使用。由于 Fedora 33 的基本安装中包含了 nano，而且 nano 对于初学者来说更加直观，所以 Fedora 33 将默认使用 nano。当然，想要使用 vi 的用户可以在自己的环境中覆盖 EDITOR 变量的值。详见Fedora 修改请求获取更多信息。via: https://fedoramagazine.org/whats-new-fedora-33-workstation/作者：Gregory Bartholomew 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

网络启动一个 Fedora Live CD
type: item
date: 2019-12-24T06:48:43+08:00
description: Live CD 对于很多任务是很有用的，例如:将操作系统安装到一个硬盘驱动器修复一个启动加载程序或执行其它救援模式操作为 Web 浏览提供一个相适应的最小环境…以及更多的东西。作为使用 DVD 和 USB 驱动器来存储你的 Live CD 镜像是一个替代方案，你可以上传它们到一个不太可能丢失或损坏的 iSCSI 服务器中。这个指南向你展示如何加载你的 Live CD 镜像到一个 ISCSI 服务器上，并使用 iPXE 启动加载程序来访问它们。下载一个 Live CD 镜像$ MY_RLSE=27 $ MY_LIVE=$(wget -q -O - https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$MY_RLSE/Workstation/x86_64/iso | perl -ne '/(Fedora[^ ]*?-Live-[^ ]*?\.iso)(?{print $^N})/;') $ MY_NAME=fc$MY_RLSE $ wget -O $MY_NAME.iso https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$MY_RLSE/Workstation/x86_64/iso/$MY_LIVE上面的命令下载 Fedora-Workstation-Live-x86_64-27-1.6.iso Fedora Live 镜像，并保存为 fc27.iso。更改 MY_RLSE 的值来下载其它档案版本。或者，你可以浏览 https://getfedora.org/ 来下载最新的 Fedora live 镜像。在 21 之前的版本使用不同的命名约定，必需在这里手动下载。如果你手动下载一个 Live CD 镜像，设置 MY_NAME 变量为不带有扩展名的文件的基本名称。用此方法，下面部分中命令将引用正确的文件。转换 Live CD 镜像使用 livecd-iso-to-disk 工具来转换 ISO 文件为一个磁盘镜像，并添加 netroot 参数到嵌入的内核命令行：$ sudo dnf install -y livecd-tools $ MY_SIZE=$(du -ms $MY_NAME.iso | cut -f 1) $ dd if=/dev/zero of=$MY_NAME.img bs=1MiB count=0 seek=$(($MY_SIZE+512)) $ MY_SRVR=server-01.example.edu $ MY_RVRS=$(echo $MY_SRVR | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_SRVR}) $ MY_LOOP=$(sudo losetup --show --nooverlap --find $MY_NAME.img) $ sudo livecd-iso-to-disk --format --extra-kernel-args netroot=iscsi:$MY_SRVR:::1:iqn.$MY_RVRS:$MY_NAME $MY_NAME.iso $MY_LOOP $ sudo losetup -d $MY_LOOP上传 Live 镜像到你的服务器在你的 ISCSI 服务器上创建一个目录来存储你的 live 镜像，随后上传你修改的镜像到其中。对于 21 及更高发布版本：$ MY_FLDR=/images $ scp $MY_NAME.img $MY_SRVR:$MY_FLDR/对于 21 以前发布版本：$ MY_FLDR=/images $ MY_LOOP=$(sudo losetup --show --nooverlap --find --partscan $MY_NAME.img) $ sudo tune2fs -O ^has_journal ${MY_LOOP}p1 $ sudo e2fsck ${MY_LOOP}p1 $ sudo dd status=none if=${MY_LOOP}p1 | ssh $MY_SRVR "dd of=$MY_FLDR/$MY_NAME.img" $ sudo losetup -d $MY_LOOP定义 iSCSI 目标在你的 iSCSI 服务器上运行下面的命令：$ sudo -i # MY_NAME=fc27 # MY_FLDR=/images # MY_SRVR=`hostname` # MY_RVRS=$(echo $MY_SRVR | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_SRVR})…

使用 Postfix 从 Fedora 系统中获取电子邮件
type: item
date: 2019-08-14T18:35:56+08:00
description: 交流是非常重要的。你的电脑可能正试图告诉你一些重要的事情。但是，如果你没有正确配置邮件传输代理（MTA），那么你可能不会收到通知。Postfix 是一个易于配置且以强大的安全记录而闻名)的 MTA。遵循以下步骤，以确保从本地服务发送的电子邮件通知将通过 Postfix MTA 路由到你的互联网电子邮件账户中。安装软件包使用 dnf 来安装一些必须软件包（你应该配置了 sudo，对吧？）：$ sudo -i # dnf install postfix mailx如果以前配置了不同的 MTA，那么你可能需要将 Postfix 设置为系统默认。使用 alternatives 命令设置系统默认 MTA：$ sudo alternatives --config mta There are 2 programs which provide 'mta'. Selection Command *+ 1 /usr/sbin/sendmail.sendmail 2 /usr/sbin/sendmail.postfix Enter to keep the current selection[+], or type selection number: 2创建一个 password\_maps 文件你需要创建一个 Postfix 查询表条目，其中包含你要用于发送电子邮件账户的地址和密码：# MY_EMAIL_ADDRESS=glb@gmail.com # MY_EMAIL_PASSWORD=abcdefghijklmnop # MY_SMTP_SERVER=smtp.gmail.com # MY_SMTP_SERVER_PORT=587 # echo "[$MY_SMTP_SERVER]:$MY_SMTP_SERVER_PORT $MY_EMAIL_ADDRESS:$MY_EMAIL_PASSWORD" >> /etc/postfix/password_maps # chmod 600 /etc/postfix/password_maps # unset MY_EMAIL_PASSWORD # history -c如果你使用的是 Gmail 账户，那么你需要为 Postfix 配置一个“应用程序密码”而不是使用你的 Gmail 密码。有关配置应用程序密码的说明，参阅“使用应用程序密码登录”。接下来，你必须对 Postfix 查询表运行 postmap 命令，以创建或更新 Postfix 实际使用的文件的散列版本：# postmap /etc/postfix/password_maps散列后的版本将具有相同的文件名，但后缀为 .db。更新 main.cf 文件更新 Postfix 的 main.cf 配置文件，以引用刚刚创建 Postfix 查询表。编辑该文件并添加以下行：relayhost = smtp.gmail.com:587 smtp_tls_security_level = verify smtp_tls_mandatory_ciphers = high smtp_tls_verify_cert_match = hostname smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous smtp_sasl_password_maps = hash:/etc/postfix/password_maps这里假设你使用 Gmail 作为 relayhost 设置，但是你可以用正确的主机名和端口替换系统应该将邮件发送到的邮件主机。有关上述配置选项的最新详细信息，参考 man 帮助：$ man postconf.5启用、启动和测试 Postfix更新 main.cf 文件后，启用并启动 Postfix 服务：# systemctl enable --now postfix.service然后，你可以使用 exit 命令或 Ctrl+D 以 root 身份退出 sudo 会话。你现在应该能够使用 mail 命令测试你的配置：$ echo 'It worked!' | mail -s "Test: $(date)" glb@gmail.com更新服务如果你安装了像 logwatch、mdadm、fail2ban、apcupsd 或 certwatch 这样的服务，你现在可以更新它们的配置，以便它们的电子邮件通知转到你的 Internet 电子邮件地址。另外，你可能希望将发送到本地系统 root 账户的所有电子邮件都转到互联网电子邮件地址中，将以下行添加到系统的 /etc/alises 文件中（你需要使用 sudo 编辑此文件，或首先切换到 root 账户）：root: glb+r…

使用 dd 检查存储性能
type: item
date: 2019-08-07T15:00:17+08:00
description: 本文包含一些示例命令，向你展示如何使用 dd 命令粗略估计硬盘驱动器和 RAID 阵列的性能。准确的测量必须考虑诸如写入放大和系统调用开销之类的事情，本指南不会考虑这些。对于可能提供更准确结果的工具，你可能需要考虑使用 hdparm。为了分解与文件系统相关的性能问题，这些示例显示了如何通过直接读取和写入块设备来在块级测试驱动器和阵列的性能。警告：写入测试将会销毁用来运行测试的块设备上的所有数据。不要对包含你想要保留的数据的任何设备运行这些测试！四个测试下面是四个示例 dd 命令，可用于测试块设备的性能：1、 从 $MY_DISK 读取的一个进程：# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache2、写入到 $MY_DISK 的一个进程：# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct3、从 $MY_DISK 并发读取的两个进程：# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)4、 并发写入到 $MY_DISK 的两个进程：# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)执行读写测试时，相应的 iflag=nocache 和 oflag=direct 参数非常重要，因为没有它们，dd 命令有时会显示从内存中传输数据的结果速度，而不是从硬盘。bs 和 count 参数的值有些随意，我选择的值应足够大，以便在大多数情况下为当前硬件提供合适的平均值。null 和 zero 设备在读写测试中分别用于目标和源，因为它们足够快，不会成为性能测试中的限制因素。并发读写测试中第二个 dd 命令的 skip=200 参数是为了确保 dd 的两个副本在硬盘驱动器的不同区域上运行。16 个示例下面是演示，显示针对以下四个块设备中之一运行上述四个测试中的各个结果：MY_DISK=/dev/sda2（用在示例 1-X 中）MY_DISK=/dev/sdb2（用在示例 2-X 中）MY_DISK=/dev/md/stripped（用在示例 3-X 中）MY_DISK=/dev/md/mirrored（用在示例 4-X 中）首先将计算机置于救援模式，以减少后台服务的磁盘 I/O 随机影响测试结果的可能性。警告：这将关闭所有非必要的程序和服务。在运行这些命令之前，请务必保存你的工作。你需要知道 root 密码才能进入救援模式。passwd 命令以 root 用户身份运行时，将提示你（重新）设置 root 帐户密码。$ sudo -i # passwd # setenforce 0 # systemctl rescue你可能还想暂时禁止将日志记录到磁盘：# sed -r -i.bak 's/^#?Storage=.*/Storage=none/' /etc/systemd/journald.conf # systemctl restart systemd-journald.service如果你有交换设备，可以暂时禁用它并用于执行后面的测试：# swapoff -a # MY_DEVS=$(mdadm --detail /dev/md/swap | grep active | grep -o "/dev/sd.*") # mdadm --stop /dev/md/swap # mdadm --zero-superblock $MY_DEVS示例 1-1 （从 sda 读取）# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1) # dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache200+0 records in 200+0 records out 209715200 bytes (210 MB, 200 MiB) copied, 1.7003 s, 123 MB/s示例 1-2 （写入到 sda）# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1) # dd if=/dev/zero of=$MY_DISK bs=1MiB count=2…

使用 mdadm 管理 RAID 阵列
type: item
date: 2019-04-27T23:45:17+08:00
description: mdadm 是 多磁盘和设备管理 Multiple Disk and Device Administration 的缩写。它是一个命令行工具，可用于管理 Linux 上的软件 RAID 阵列。本文概述了使用它的基础知识。以下 5 个命令是你使用 mdadm 的基础功能：创建 RAID 阵列：mdadm --create /dev/md/test --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1组合（并启动）RAID 阵列：mdadm --assemble /dev/md/test /dev/sda1 /dev/sdb1停止 RAID 阵列：mdadm --stop /dev/md/test删除 RAID 阵列：mdadm --zero-superblock /dev/sda1 /dev/sdb1检查所有已组合的 RAID 阵列的状态：cat /proc/mdstat功能说明mdadm –create上面的创建命令除了 -create 参数自身和设备名之外，还包括了四个参数：1、–homehost：默认情况下，mdadm 将你的计算机名保存为 RAID 阵列的属性。如果你的计算机名与存储的名称不匹配，则阵列将不会自动组合。此功能在共享硬盘的服务器群集中很有用，因为如果多个服务器同时尝试访问同一驱动器，通常会发生文件系统损坏。名称 any 是保留字段，并禁用 -homehost 限制。2、 –metadata：-mdadm 保留每个 RAID 设备的一小部分空间，以存储有关 RAID 阵列本身的信息。 -metadata 参数指定信息的格式和位置。1.0 表示使用版本 1 格式，并将元数据存储在设备的末尾。3、–level：-level 参数指定数据应如何在底层设备之间分布。级别 1 表示每个设备应包含所有数据的完整副本。此级别也称为磁盘镜像。4、–raid-devices：-raid-devices 参数指定将用于创建 RAID 阵列的设备数。通过将 -level=1（镜像）与 -metadata=1.0 （将元数据存储在设备末尾）结合使用，可以创建一个 RAID1 阵列，如果不通过 mdadm 驱动访问，那么它的底层设备会正常显示。这在灾难恢复的情况下很有用，因为即使新系统不支持 mdadm 阵列，你也可以访问该设备。如果程序需要在 mdadm 可用之前以只读访问底层设备时也很有用。例如，计算机中的 UEFI 固件可能需要在启动 mdadm 之前从 ESP 读取引导加载程序。mdadm –assemble如果成员设备丢失或损坏，上面的组合命令将会失败。要强制 RAID 阵列在其中一个成员丢失时进行组合并启动，请使用以下命令：# mdadm --assemble --run /dev/md/test /dev/sda1其他重要说明避免直接写入底层是 RAID1 的设备。这导致设备不同步，并且 mdadm 不会知道它们不同步。如果你访问了在其他地方被修改了设备的某个 RAID1 阵列，则可能导致文件系统损坏。如果你在其他地方修改 RAID1 设备并需要强制阵列重新同步，请从要覆盖的设备中删除 mdadm 元数据，然后将其重新添加到阵列，如下所示：# mdadm --zero-superblock /dev/sdb1 # mdadm --assemble --run /dev/md/test /dev/sda1 # mdadm /dev/md/test --add /dev/sdb1以上用 sda1 的内容完全覆盖 sdb1 的内容。要指定在计算机启动时自动激活的 RAID 阵列，请创建 /etc/mdadm.conf 配置。有关最新和详细信息，请查看手册页：$ man mdadm $ man mdadm.conf本系列的下一篇文章将展示如何将现有的单磁盘 Linux 系统变为镜像磁盘安装，这意味着即使其中一个硬盘突然停止工作，系统仍将继续运行！via: https://fedoramagazine.org/managing-raid-arrays-with-mdadm/作者：Gregory Bartholomew 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

使用 sgdisk 管理分区
type: item
date: 2019-04-24T19:33:00+08:00
description: Roderick W. Smith 的 sgdisk 命令可在命令行中管理硬盘的分区。下面将介绍使用它所需的基础知识。使用 sgdisk 的大多数基本功能只需要了解以下六个参数：1、-p 打印 分区表：# sgdisk -p /dev/sda2、 -d x 删除 分区 x：# sgdisk -d 1 /dev/sda3、 -n x:y:z 创建一个编号 x 的新分区，从 y 开始，从 z 结束：# sgdisk -n 1:1MiB:2MiB /dev/sda4、-c x:y 更改分区 x 的名称为 y：# sgdisk -c 1:grub /dev/sda5、-t x:y 将分区 x 的类型更改为 y：# sgdisk -t 1:ef02 /dev/sda6、–list-types 列出分区类型代码：# sgdisk --list-types如你在上面的例子中所见，大多数命令都要求将要操作的硬盘的设备文件名指定为最后一个参数。可以组合上面的参数，这样你可以一次定义所有分区：# sgdisk -n 1:1MiB:2MiB -t 1:ef02 -c 1:grub /dev/sda在值的前面加上 + 或 – 符号，可以为某些字段指定相对值。如果你使用相对值，sgdisk 会为你做数学运算。例如，上面的例子可以写成：# sgdisk -n 1:1MiB:+1MiB -t 1:ef02 -c 1:grub /dev/sda0 值对于以下几个字段有特殊意义：对于分区号字段，0 表示应使用下一个可用编号（编号从 1 开始）。对于起始地址字段，0 表示使用最大可用空闲块的头。硬盘开头的一些空间始终保留给分区表本身。对于结束地址字段，0 表示使用最大可用空闲块的末尾。通过在适当的字段中使用 0 和相对值，你可以创建一系列分区，而无需预先计算任何绝对值。例如，如果在一块空白硬盘中，以下 sgdisk 命令序列将创建典型 Linux 安装所需的所有基本分区：# sgdisk -n 0:0:+1MiB -t 0:ef02 -c 0:grub /dev/sda # sgdisk -n 0:0:+1GiB -t 0:ea00 -c 0:boot /dev/sda # sgdisk -n 0:0:+4GiB -t 0:8200 -c 0:swap /dev/sda # sgdisk -n 0:0:0 -t 0:8300 -c 0:root /dev/sda上面的例子展示了如何为基于 BIOS 的计算机分区硬盘。基于 UEFI 的计算机上不需要 grub 分区。由于 sgdisk 在上面的示例中为你计算了所有绝对值，因此你可以在基于 UEFI 的计算机上跳过第一个命令，并且可以无需修改即可运行其余命令。同样，你可以跳过创建交换分区，并且不需要修改其余命令。还有使用一个命令删除硬盘上所有分区的快捷方式：# sgdisk --zap-all /dev/sda关于最新和详细信息，请查看手册页：$ man sgdiskvia: https://fedoramagazine.org/managing-partitions-with-sgdisk/作者：Gregory Bartholomew 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

如何构建一台网络引导服务器（四）
type: item
date: 2019-01-24T06:26:12+08:00
description: 在本系列教程中所构建的网络引导服务器有一个很重要的限制，那就是所提供的操作系统镜像是只读的。一些使用场景或许要求终端用户能够修改操作系统镜像。例如，一些教师或许希望学生能够安装和配置一些像 MariaDB 和 Node.js 这样的包来做为他们课程练习的一部分。可写镜像的另外的好处是，终端用户“私人定制”的操作系统，在下次不同的工作站上使用时能够“跟着”他们。修改 Bootmenu 应用程序以使用 HTTPS为 bootmenu 应用程序创建一个自签名的证书：$ sudo -i # MY_NAME=$(</etc/hostname) # MY_TLSD=/opt/bootmenu/tls # mkdir $MY_TLSD # openssl req -newkey rsa:2048 -nodes -keyout $MY_TLSD/$MY_NAME.key -x509 -days 3650 -out $MY_TLSD/$MY_NAME.pem验证你的证书的值。确保 Subject 行中 CN 的值与你的 iPXE 客户端连接你的网络引导服务器所使用的 DNS 名字是相匹配的：# openssl x509 -text -noout -in $MY_TLSD/$MY_NAME.pem接下来，更新 bootmenu 应用程序去监听 HTTPS 端口和新创建的证书及密钥：# sed -i "s#listen => .*#listen => ['https://$MY_NAME:443?cert=$MY_TLSD/$MY_NAME.pem\&key=$MY_TLSD/$MY_NAME.key\&ciphers=AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA'],#" /opt/bootmenu/bootmenu.conf注意 iPXE 当前支持的 加密算法是有限制的。GnuTLS 要求 “CAPDACREAD\_SEARCH” 能力，因此将它添加到 bootmenu 应用程序的 systemd 服务：# sed -i '/^AmbientCapabilities=/ s/$/ CAP_DAC_READ_SEARCH/' /etc/systemd/system/bootmenu.service # sed -i 's/Serves iPXE Menus over HTTP/Serves iPXE Menus over HTTPS/' /etc/systemd/system/bootmenu.service # systemctl daemon-reload现在，在防火墙中为 bootmenu 服务添加一个例外规则并重启动该服务：# MY_SUBNET=192.0.2.0 # MY_PREFIX=24 # firewall-cmd --add-rich-rule="rule family='ipv4' source address='$MY_SUBNET/$MY_PREFIX' service name='https' accept" # firewall-cmd --runtime-to-permanent # systemctl restart bootmenu.service使用 wget 去验证是否工作正常：$ MY_NAME=server-01.example.edu $ MY_TLSD=/opt/bootmenu/tls $ wget -q --ca-certificate=$MY_TLSD/$MY_NAME.pem -O - https://$MY_NAME/menu添加 HTTPS 到 iPXE更新 init.ipxe 去使用 HTTPS。接着使用选项重新编译 ipxe 引导加载器，以便它包含和信任你为 bootmenu 应用程序创建的自签名证书：$ echo '#define DOWNLOAD_PROTO_HTTPS' >> $HOME/ipxe/src/config/local/general.h $ sed -i 's/^chain http:/chain https:/' $HOME/ipxe/init.ipxe $ cp $MY_TLSD/$MY_NAME.pem $HOME/ipxe $ cd $HOME/ipxe/src $ make clean $ make bin-x86_64-efi/ipxe.efi EMBED=../init.ipxe CERT="../$MY_NAME.pem" TRUST="../$MY_NAME.pem"你现在可以将启用了 HTTPS 的 iPXE 引导加载器复制到你的客户端上，并测试它能否正常工作：$ cp $HOME/ipxe…

如何构建一台网络引导服务器（三）
type: item
date: 2019-01-02T01:18:00+08:00
description: 在 如何构建一台网络引导服务器（一） 中，我们提供了一个极简的 iPXE 引导脚本来引导你的网络引导镜像。许多用户除了使用网络引导镜像外，可能在机器本地也有一个操作系统。但是使用常见的工作站的 BIOS 去切换引导加载器是很笨拙的。在本系列文件的第三部分，我们将向你展示如何设置一个更复杂的 iPXE 配置。它将允许终端用户以更容易的方式去选择引导哪个操作系统。它也可以配置为让系统管理员从一台中央服务器来统一管理引导菜单。一个交互式 iPXE 引导菜单下面这些命令重定义了网络引导镜像的 boot.cfg 来作为一个交互式的 iPXE 引导菜单，并使用了一个 5 秒倒计时的定时器：$ MY_FVER=29 $ MY_KRNL=$(ls -c /fc$MY_FVER/lib/modules | head -n 1) $ MY_DNS1=192.0.2.91 $ MY_DNS2=192.0.2.92 $ MY_NAME=server-01.example.edu $ MY_EMAN=$(echo $MY_NAME | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_NAME}) $ MY_ADDR=$(host -t A $MY_NAME | awk '{print $4}') $ cat << END > $HOME/esp/linux/boot.cfg #!ipxe set timeout 5000 :menu menu iPXE Boot Menu item --key 1 lcl 1. Microsoft Windows 10 item --key 2 f$MY_FVER 2. RedHat Fedora $MY_FVER choose --timeout \${timeout} --default lcl selected || goto shell set timeout 0 goto \${selected} :failed echo boot failed, dropping to shell... goto shell :shell echo type 'exit' to get the back to the menu set timeout 0 shell goto menu :lcl exit :f$MY_FVER kernel --name kernel.efi \${prefix}/vmlinuz-$MY_KRNL initrd=initrd.img ro ip=dhcp rd.peerdns=0 nameserver=$MY_DNS1 nameserver=$MY_DNS2 root=/dev/disk/by-path/ip-$MY_ADDR:3260-iscsi-iqn.$MY_EMAN:fc$MY_FVER-lun-1 netroot=iscsi:$MY_ADDR::::iqn.$MY_EMAN:fc$MY_FVER console=tty0 console=ttyS0,115200n8 audit=0 selinux=0 quiet initrd --name initrd.img \${prefix}/initramfs-$MY_KRNL.img boot || goto failed END上述菜单有五个节：menu 定义了显示在屏幕上的实际菜单内容。failed 提示用户发生了错误，并将用户带到 shell 以错误错误。shell 提供了交互式命令提示符。你可以在引导菜单出现时按下 Esc 键进入，或者是 boot 命令失败时也会进入到命令提示符。lcl 包含一个提供给 iPXE 退出的简单命令，以及返还控制权给 BIOS。在 iPXE 之后，无论你希望缺省引导的设备（即：工作站的本地硬件）是什么，都必须在你的工作站的 BIOS 中正确地作为下一个引导设备列出来。f29 包含前面文章提到同一个网络引导代码，但使用最终的退出代码来替换掉 goto failed。从你的 $HOME/esp/linux 目录中复制更新后的 boot.cfg 到所有客户端系统的 ESP 中。如果一切顺利，你应该会看到类似下面图片的结果：一个服务器托管的引导菜单你可以添加到网络引导服务器的另一个特性是，能够从一台中央位置去管理所有客户端的引导菜单。这个特性尤其适用于批量安装（升级）一个新版本的操作系统。在你将新内核和新的 initramfs 复制到所有客户端的 ESP 之后，这个特性可以让你执行一种 原子事务) 去切换所有客户端到新操作系统。安装 Mojolicious：$ sudo -i # dnf install -y perl-Mojolicious定义 “boot…

如何构建一台网络引导服务器（二）
type: item
date: 2018-12-30T06:46:32+08:00
description: 在 如何构建一台网络引导服务器（一） 的文章中，我们展示了如何创建一个网络引导镜像，在那个镜像中使用了一个名为 liveuser 帐户，它的家目录位于内存中，重启后家目录中的内容将全部消失。然而很多用户都希望机器重启后保存他们的文件和设置。因此，在本系列的第二部分，我们将向你展示如何在第一部分的基础上，重新配置网络引导镜像，以便 活动目录 中的用户帐户可以进行登录，然后从一个 NFS 服务器上自动挂载他们的家目录。本系列的第三部分，我们将向你展示网络引导客户端如何与中心化配置的 iPXE 引导菜单进行交互。设置使用 KRB5 认证的 NFS4 Home 目录按以前的文章 “使用 Kerberos 强化共享的 NFS Home 目录安全性” 的指导来做这个设置。删除 Liveuser 帐户删除本系列文章第一部分中创建的 liveuser 帐户：$ sudo -i # sed -i '/automaticlogin/Id' /fc28/etc/gdm/custom.conf # rm -f /fc28/etc/sudoers.d/liveuser # for i in passwd shadow group gshadow; do sed -i '/^liveuser:/d' /fc28/etc/$i; done配置 NTP、KRB5 和 SSSD接下来，我们需要将 NTP、KRB5 和 SSSD 的配置文件复制进客户端使用的镜像中，以便于它们能够使用同一个帐户：# MY_HOSTNAME=$(</etc/hostname) # MY_DOMAIN=${MY_HOSTNAME#*.} # dnf -y --installroot=/fc28 install ntp krb5-workstation sssd # cp /etc/ntp.conf /fc28/etc # chroot /fc28 systemctl enable ntpd.service # cp /etc/krb5.conf.d/${MY_DOMAIN%%.*} /fc28/etc/krb5.conf.d # cp /etc/sssd/sssd.conf /fc28/etc/sssd在已配置的识别服务的基础上，重新配置 sssd 提供认证服务：# sed -i '/services =/s/$/, pam/' /fc28/etc/sssd/sssd.conf另外，配置成确保客户端不能更改这个帐户密码：# sed -i '/id_provider/a \ \ ad_maximum_machine_account_password_age = 0' /fc28/etc/sssd/sssd.conf另外，复制 nfsnobody 的定义：# for i in passwd shadow group gshadow; do grep "^nfsnobody:" /etc/$i >> /fc28/etc/$i; done加入活动目录接下来，你将执行一个 chroot 将客户端镜像加入到活动目录。从删除预置在网络引导镜像中同名的计算机帐户开始：# MY_USERNAME=jsmith # MY_CLIENT_HOSTNAME=$(</fc28/etc/hostname) # adcli delete-computer "${MY_CLIENT_HOSTNAME%%.*}" -U "$MY_USERNAME"在网络引导镜像中如果有 krb5.keytab 文件，也删除它：# rm -f /fc28/etc/krb5.keytabchroot 到网络引导镜像中：# for i in dev dev/pts dev/shm proc sys run; do mount -o bind /$i /fc28/$i; done # chroot /fc28 /usr/bin/bash --login执行一个加入操作：# MY_USERNAME=jsmith # MY_HOSTNAME=$(</etc/hostname) # MY_DOMAIN=${MY_HOSTNAME#*.} # MY_REALM=${MY_DOMAIN^^} # MY_OU="cn=computers,dc=${MY_DOMAIN//./,dc=}" # adcli join $MY_DOMAIN --login-user="$MY_USERNAME" --computer-name="${MY_HOSTNAME%%.*}" --host-fqdn="$MY_HOSTNAME" --user-principal="host/$MY_HOSTNAME@$MY_REALM" --domain-ou="$MY_OU"现在登…