配置存储

Fedora CoreOS附带了一个简单的默认存储布局:根分区是最后一个分区,它会扩展到磁盘的完整大小。除引导分区外,所有数据都存储在根分区上。请参阅 磁盘布局部分 了解更多详细信息。

下面,我们提供了您可以定制的各种方式的示例。

*Fedora CoreOS要求根文件系统至少为8 GiB。*出于实际原因,某些平台的磁盘映像附带较小的根文件系统,该文件系统默认情况下会自动扩展以填满所有可用磁盘空间。如果在根文件系统之后添加其他分区,则必须确保显式调整根分区的大小,如下所示,使其至少为8 GiB。

目前,如果根文件系统小于8 GiB,则在登录时会发出警告。从2021年6月开始,如果根文件系统小于8GiB并且后面跟着另一个分区,则Fedora CoreOS将拒绝引导。有关更多详细信息,请参阅 这个错误

从Ignition引用块设备

下面的许多示例将引用块设备,例如 /dev/vda 。可用的数据块设备的名称取决于底层基础架构(裸机与云),通常还取决于特定的实例类型。例如,在AWS中,某些实例类型具有NVMe驱动器( /dev/nvme* ),其他人使用 /dev/xvda*

如果您的磁盘配置很简单,并且使用引导操作系统时所用的同一磁盘,则 /dev/disk/by-id/coreos-boot-disk 链接可用于方便地引用该设备。此链接仅在资源调配期间可用,目的是方便地引用启动操作系统时所用的同一磁盘。

在需要访问其他磁盘的情况下,最简单的做法是使用仅允许您访问SSH的Ignition配置启动一台计算机,并通过例如 lsblk 指挥部。

对于物理硬件,最佳做法是通过 /dev/disk/by-id//dev/disk/by-path 链接。

设置单独的/var装载

以下是要设置的Butane配置示例 /var 在同一主磁盘上的单独分区上:

将/var分区添加到主磁盘
variant: fcos
version: 1.4.0
storage:
  disks:
  - # The link to the block device the OS was booted from.
    device: /dev/disk/by-id/coreos-boot-disk
    # We do not want to wipe the partition table since this is the primary
    # device.
    wipe_table: false
    partitions:
    - number: 4
      label: root
      # Allocate at least 8 GiB to the rootfs. See NOTE above about this.
      size_mib: 8192
      resize: true
    - size_mib: 0
      # We assign a descriptive label to the partition. This is important
      # for referring to it in a device-agnostic way in other parts of the
      # configuration.
      label: var
  filesystems:
    - path: /var
      device: /dev/disk/by-partlabel/var
      # We can select the filesystem we'd like.
      format: ext4
      # Ask Butane to generate a mount unit for us so that this filesystem
      # gets mounted in the real root.
      with_mount_unit: true

当然,您只能装载 /var 放到一个单独的分区中。例如,要装载 /var/lib/containers

将/var/lib/tainers分区添加到主磁盘
variant: fcos
version: 1.4.0
storage:
  disks:
  - device: /dev/disk/by-id/coreos-boot-disk
    wipe_table: false
    partitions:
    - number: 4
      label: root
      # Allocate at least 8 GiB to the rootfs. See NOTE above about this.
      size_mib: 8192
      resize: true
    - size_mib: 0
      label: containers
  filesystems:
    - path: /var/lib/containers
      device: /dev/disk/by-partlabel/containers
      format: xfs
      with_mount_unit: true

或者,您也可以从单独的磁盘装载存储。例如,我们在这里挂载 /var/log 从上的分区 /dev/vdb

从辅助磁盘添加/var/log
variant: fcos
version: 1.4.0
storage:
  disks:
  - device: /dev/vdb
    wipe_table: false
    partitions:
    - size_mib: 0
      start_mib: 0
      label: log
  filesystems:
    - path: /var/log
      device: /dev/disk/by-partlabel/log
      format: xfs
      with_mount_unit: true
定义具有多个分区的磁盘

在本例中,我们擦除磁盘并创建两个新分区。

variant: fcos
version: 1.4.0
storage:
  disks:
    -
      # Mandatory. We use the World-Wide Number ID of the drive to ensure
      # uniqueness.
      device: /dev/disk/by-id/wwn-0x50014e2eb507fcdf
      # This ensures that the partition table is re-created, along with all
      # the partitions.
      wipe_table: true
      partitions:
        # The first partition (slot number 1) is 32 GiB and starts at the
        # beginning of the device. Its type_guid identifies it as a Linux
        # swap partition.
        - label: part1
          number: 1
          size_mib: 32768
          start_mib: 0
          type_guid: 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
        # The second partition (implicit slot number 2) will be placed after
        # partition 1 and will occupy the rest of the available space.
        # Since type_guid is not specified, it will be a Linux native
        # partition.
        - label: part2

重新配置根文件系统

可以重新配置根文件系统本身。您可以使用路径 /dev/disk/by-label/root 来引用原始的根分区。您必须确保新文件系统的标签也是 root

您必须拥有至少4G的RAM,才能进行根目录重新配置。

下面是从XFS迁移到ext4,但重用主磁盘上的相同分区的示例:

将根文件系统更改为ext4
variant: fcos
version: 1.4.0
storage:
  filesystems:
    - device: /dev/disk/by-partlabel/root
      wipe_filesystem: true
      format: ext4
      label: root

与上一节类似,您还可以完全移动根文件系统。在这里,我们将根目录移到RAID0设备:

将根文件系统移动到RAID0
variant: fcos
version: 1.4.0
storage:
  raid:
    - name: myroot
      level: raid0
      devices:
        - /dev/disk/by-id/virtio-disk1
        - /dev/disk/by-id/virtio-disk2
  filesystems:
    - device: /dev/md/myroot
      format: xfs
      wipe_filesystem: true
      label: root
你不需要 pathwith_mount_unit 密钥;FCOS知道根分区是特殊的,会找出如何找到它并挂载它。

如果要跨多个驱动器复制引导盘以恢复驱动器故障,则需要镜像所有默认分区(根分区、引导分区、EFI系统分区和引导加载程序代码)。对于以下内容,有特殊的Butane配置语法:

将引导盘镜像到两个驱动器上
variant: fcos
version: 1.4.0
boot_device:
  mirror:
    devices:
      - /dev/sda
      - /dev/sdb

定义文件系统

这个例子演示了创建文件系统的过程,方法是定义和标记分区,将它们组合到一个RAID阵列中,并将该阵列格式化为ext4。

在RAID存储设备上定义文件系统
variant: fcos
version: 1.4.0
storage:
  disks:
  # This defines two partitions, each on its own disk. The disks are
  # identified by their WWN.
  - device: /dev/disk/by-id/wwn-0x50014ee261e524e4
    wipe_table: true
    partitions:
    -
      # Each partition gets a human-readable label.
      label: "raid.1.1"
      # Each partition is placed at the beginning of the disk and is 64 GiB
      # long.
      number: 1
      size_mib: 65536
      start_mib: 0
  - device: /dev/disk/by-id/wwn-0x50014ee0b8442cd3
    wipe_table: true
    partitions:
    - label: "raid.1.2"
      number: 1
      size_mib: 65536
      start_mib: 0
  # We use the previously defined partitions as devices in a RAID1 md array.
  raid:
    - name: publicdata
      level: raid1
      devices:
      - /dev/disk/by-partlabel/raid.1.1
      - /dev/disk/by-partlabel/raid.1.2
  # The resulting md array is used to create an EXT4 filesystem.
  filesystems:
    - path: /var/publicdata
      device: /dev/md/publicdata
      format: ext4
      label: PUB
      with_mount_unit: true

加密存储(Luk)

以下是在以下位置配置Luks设备的示例 /var/lib/data

variant: fcos
version: 1.4.0
storage:
  luks:
    - name: data
      device: /dev/vdb
  filesystems:
    - path: /var/lib/data
      device: /dev/mapper/data
      format: xfs
      label: DATA
      with_mount_unit: true

根文件系统也可以移到Luks。在根文件系统的情况下,Luks设备必须由 带孔板 。有用于加密根文件系统的简化的Butane配置语法;例如:

将根文件系统移到Luks
variant: fcos
version: 1.4.0
boot_device:
  luks:
    tpm2: true

这相当于以下扩展配置:

在不使用BOOT_DEVICE的情况下将根文件系统移动到Luk
variant: fcos
version: 1.4.0
storage:
  luks:
    - name: root
      label: luks-root
      device: /dev/disk/by-partlabel/root
      clevis:
        tpm2: true
      wipe_volume: true
  filesystems:
    - device: /dev/mapper/root
      format: xfs
      wipe_filesystem: true
      label: root

扩展配置不包括 pathwith_mount_unit 密钥;FCOS知道根分区是特殊的,会找出如何找到它并挂载它。

调整根分区的大小

如果使用Ignition重新配置或移动根分区,则该分区不会在第一次引导时自动增长(请参阅中的相关讨论 这一期 )。在将根分区移动到新磁盘(或多个磁盘)的情况下,您应该使用 size_mib 菲尔德。如果适当地重新配置根文件系统(如上面的Luks示例所示),则可以使用 resize 字段:

将根分区大小调整为其最大大小
variant: fcos
version: 1.4.0
storage:
  disks:
    - device: /dev/vda
      partitions:
        - label: root
          number: 4
          # 0 means to use all available space
          size_mib: 0
          resize: true
  luks:
    - name: root
      device: /dev/disk/by-partlabel/root
      clevis:
        tpm2: true
      wipe_volume: true
  filesystems:
    - device: /dev/mapper/root
      format: xfs
      wipe_filesystem: true
      label: root

添加交换

此示例创建了一个跨越所有 sdb 设备,在其上创建一个交换区域,并创建一个系统交换单元,以便在引导时启用该交换区域。

在第二个磁盘上配置交换分区
variant: fcos
version: 1.4.0
storage:
  disks:
    - device: /dev/sdb
      wipe_table: true
      partitions:
        - number: 1
          label: swap
  filesystems:
    - device: /dev/disk/by-partlabel/swap
      format: swap
      wipe_filesystem: true
      with_mount_unit: true

添加网络存储

可以将Fedora CoreOS系统配置为装载网络文件系统,如nFS和通用Internet文件系统。这是通过使用Ignition创建系统D单位来实现的最佳方法。通过创建标准挂载单元,可以在引导时挂载文件系统。或者,也可以在用户访问挂载点时通过创建额外的自动挂载单元来挂载文件系统。下面是每种类型的示例,分别适用于一个NFS文件系统。

配置NFS装载

创建一个系统d单元,以便在引导时挂载一个NFS文件系统。
这个 .mount 文件必须基于路径命名(例如 /var/mnt/data = var-mnt-data.mount )
variant: fcos
version: 1.3.0
systemd:
  units:
    - name: var-mnt-data.mount
      enabled: true
      contents: |
        [Unit]
        Description=Mount data directory

        [Mount]
        What=example.org:/data
        Where=/var/mnt/data
        Type=nfs4

        [Install]
        WantedBy=multi-user.target
创建一个系统单元,以便在用户访问挂载点时挂载一个NFS文件系统(自动挂载)
variant: fcos
version: 1.3.0
systemd:
  units:
    - name: var-mnt-data.mount
      contents: |
        [Unit]
        Description=Mount data directory

        [Mount]
        What=example.org:/data
        Where=/var/mnt/data
        Type=nfs4

        [Install]
        WantedBy=multi-user.target

    - name: var-mnt-data.automount
      enabled: true
      contents: |
        [Unit]
        Description=Automount data directory

        [Automount]
        TimeoutIdleSec=20min
        Where=/var/mnt/data

        [Install]
        WantedBy=multi-user.target

高级范例

此示例使用TPM2加密的根文件系统配置镜像引导盘,覆盖自动生成的根分区副本的大小,并添加加密的镜像 /var 占用剩余磁盘的分区。

带单独/var的加密镜像引导盘
variant: fcos
version: 1.4.0
boot_device:
  luks:
    tpm2: true
  mirror:
    devices:
      - /dev/sda
      - /dev/sdb
storage:
  disks:
    - device: /dev/sda
      partitions:
        # Override size of root partition on first disk, via the label
        # generated for boot_device.mirror
        - label: root-1
          size_mib: 8192
        # Add a new partition filling the remainder of the disk
        - label: var-1
    - device: /dev/sdb
      partitions:
        # Similarly for second disk
        - label: root-2
          size_mib: 8192
        - label: var-2
  raid:
    - name: md-var
      level: raid1
      devices:
        - /dev/disk/by-partlabel/var-1
        - /dev/disk/by-partlabel/var-2
  luks:
    - name: var
      device: /dev/md/md-var
      # No key material is specified, so a random key will be generated
      # and stored in the root filesystem
  filesystems:
    - device: /dev/mapper/var
      path: /var
      label: var
      format: xfs
      wipe_filesystem: true
      with_mount_unit: true

磁盘布局

所有Fedora CoreOS系统都以相同的磁盘映像开始,根据引导加载所需的内容,不同的体系结构会略有不同。在第一次引导时,根文件系统被扩展以填充磁盘的其余部分。可以使用Butane配置来自定义磁盘映像,以重新分区磁盘并创建/重新格式化文件系统。裸机安装没有什么不同;安装程序只将原始映像复制到目标磁盘,并将指定的配置注入 /boot 用于第一次启动时使用。

看见 重新配置根文件系统 有关根分区的受支持更改的示例。

分区表

不鼓励使用分区号来引用特定分区,而应使用标签或UUID。Fedora CoreOS保留 bootboot-<number>rootroot-<number>BIOS-BOOTbios-<number>EFI-SYSTEM ,及 esp-<number> 标签,以及 md-bootmd-root RAID设备名称。不支持使用这些标签创建分区、文件系统或RAID设备。

X86_64分区表

X86_64磁盘映像是使用保护性MBR格式化的GPT。它支持通过BIOS和UEFI启动(包括安全启动)。

分区表布局随着时间的推移而改变。当前布局为:

Table 1. X86_64的分区表

Number

Label

描述

分区类型

1

BIOS-BOOT

包含BIOS GRUB镜像

原始数据

2

EFI-System

包含EFI GRUB镜像和安全引导填充

FAT32

3

BOOT

包含GRUB配置、内核/initramfs镜像

ext4

4

包含根文件系统

XFS

在启动BIOS时,可以删除或重新格式化EFI系统分区。同样,在EFI引导时,可以删除或重新格式化BIOS引导分区。

已装载的文件系统

Fedora CoreOS使用OSTree,这是一个用于管理共享存储的多个可引导操作系统树的系统。这不同于Container Linux,后者使用双分区系统。在Fedora CoreOS中,每个操作系统版本都是 / 文件系统。所有部署共享相同 /var 它们可以位于同一文件系统上,也可以单独安装。

这显示了安装在上的Fedora CoreOS系统的默认装载点 /dev/vda 磁盘:

X86_64上的默认装载点
$ findmnt --real # Some details are elided
TARGET        SOURCE                                                   FSTYPE  OPTIONS
/             /dev/vda4[/ostree/deploy/fedora-coreos/deploy/$hash]     xfs     rw
|-/sysroot    /dev/vda4                                                xfs     ro
|-/etc        /dev/vda4[/ostree/deploy/fedora-coreos/deploy/$hash/etc] xfs     rw
|-/usr        /dev/vda4[/ostree/deploy/fedora-coreos/deploy/$hash/usr] xfs     ro
|-/var        /dev/vda4[/ostree/deploy/fedora-coreos/deploy/var]       xfs     rw
`-/boot       /dev/vda3                                                ext4    ro

EFI系统分区以前装载在 /boot/efi ,但情况已经不再是这样了。在配置了引导设备镜像的系统上,每个组成磁盘上都有独立的EFI分区。

不可变的 / ,只读 /usr

由于OSTree用于管理属于操作系统的所有文件,因此 //usr 装载点不可写。对操作系统的任何更改都应通过 rpm-ostree

类似地, /boot 挂载点不可写,默认情况下不挂载EFI系统分区。这些文件系统由管理 rpm-ostreebootupd ,并且不能由管理员直接修改。

添加顶级目录(即 /foo )当前不受支持,并且不被不可变属性所允许。

真实 / (与文件系统的根目录中的 root 分区)以只读方式装载在 /sysroot 并且不能直接访问或修改。

中的配置 /etc 并在 /var

唯一受支持的可写位置是 /etc/var/etc 应仅包含配置文件,不应存储数据。所有数据必须保存在 /var 并且不会受到系统升级的影响。可能保持国家地位的传统地方(例如 /home ,或 /srv )是指向中目录的符号链接 /var (例如: /var/home/var/srv )。

版本选择和启动

为系统上当前可用的每个Fedora CoreOS版本创建一个GRUB菜单项。此菜单项引用 ostree 部署,包括一个Linux内核、一个initramf和一个链接到 ostree 提交(通过 ostree= 内核参数)。在启动期间, ostree 将读取此内核参数以确定将哪个部署用作根文件系统。对系统的每次更新或更改(安装程序包、添加内核参数)都会创建一个新部署。这样,如果更新导致问题,则可以回滚到以前的部署。