使用多用户增强服务器的安全性

Fedora CoreOS 操作系统 (简称 fcos) 的主要设计目标, 是大规模服务器集群 (几十台甚至数百台). 对于窝等穷人这种只有一台主机 (或者两三台) 的情况, 还是需要稍稍改造 (配置) 一下, 才能比较舒服的使用.

比如, 默认 SSH 登录使用 core 用户, 这个用户可以无需密码使用 sudo (获取 root 权限), 适合用来进行系统管理 (比如添加新的硬盘). 但是如果日常使用的话, 就不太合适了, 风险较大 (无密码 sudo).

所以, 窝决定创建一些普通用户 (无权 sudo), 用于日常使用 (比如运行应用). 如果需要多人共享同一台服务器的情况, 也能使用各自的用户登录, 互不影响. (注意: Linux 的多用户机制能够提供的安全能力有限, 所以请不要把用户信息告诉不认识的陌生人, 不要轻易让别人使用服务器. 如果对方乱搞, 确保能够线下找到对方, 进行输出. )


相关文章:

  • 《安装 Fedora CoreOS 操作系统》 https://blog.csdn.net/secext2022/article/details/139805083
  • 《逻辑卷管理器 (LVM) 简介》 https://blog.csdn.net/secext2022/article/details/139805775

目录

  • 1 安装系统的配置文件
  • 2 额外配置 (可选)
    • 2.1 根分区换成 btrfs 文件系统
    • 2.2 开机自动挂载数据盘 (systemd automount)
    • 2.3 配置固定 IP 地址 (systemd-networkd)
  • 3 测试普通用户
    • 3.1 开机自动运行容器
    • 3.2 修复 systemd --user network-online.target
    • 3.3 配置数据盘用户目录
  • 4 总结与展望

1 安装系统的配置文件

按照文章 《安装 Fedora CoreOS 操作系统》 里的方法重新安装系统. fcos 安装系统非常方便快速, 一条命令, 几分钟, 即可.

这是使用的 fc-server.bu 文件的内容:

variant: fcos
version: 1.5.0
passwd:
  users:
    - name: core
      ssh_authorized_keys:
        - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICHaotVMdOfQrHe4bEYtjAuzQr3LdIqYlDu0sgcKLXHD fc-server-202406
    - name: pmlz
    - name: fc-test
      ssh_authorized_keys:
        - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHCyRg9UBu1C3OH37Lke5xwSpiTPWKlUIg+wj3S6h1MR fc-server-test-202406
storage:
  filesystems:
    - device: /dev/disk/by-partlabel/root
      wipe_filesystem: true
      label: root
      format: btrfs
      mount_options:
        - compress=zstd
  files:
    - path: /etc/zincati/config.d/55-updates-strategy.toml
      contents:
        inline: |
          [updates]
          strategy = "periodic"
          [[updates.periodic.window]]
          days = [ "Tue", "Thu", "Sun" ]
          start_time = "03:00"
          length_minutes = 120

    # mount: /mnt/data/d1
    - path: /etc/systemd/system/var-mnt-data-d1.mount
      contents:
        inline: |
          [Mount]
          What=/dev/d202406a/d202406a1
          Where=/var/mnt/data/d1
          Type=btrfs
          Options=compress=zstd,nosuid,nodev
    - path: /etc/systemd/system/var-mnt-data-d1.automount
      contents:
        inline: |
          [Automount]
          Where=/var/mnt/data/d1
          TimeoutIdleSec=2h

          [Install]
          WantedBy=local-fs.target
    # mount: /mnt/data/d2
    - path: /etc/systemd/system/var-mnt-data-d2.mount
      contents:
        inline: |
          [Mount]
          What=/dev/d202406b/d202406b1
          Where=/var/mnt/data/d2
          Type=btrfs
          Options=compress=zstd,nosuid,nodev
    - path: /etc/systemd/system/var-mnt-data-d2.automount
      contents:
        inline: |
          [Automount]
          Where=/var/mnt/data/d2
          TimeoutIdleSec=2h

          [Install]
          WantedBy=local-fs.target

    # ip: eno1
    - path: /etc/systemd/network/10-eno1.network
      contents:
        inline: |
          [Match]
          Name=eno1

          [Network]
          DHCP=yes

          [Address]
          Address=192.168.31.2/24

    # network-online.target for systemd --user
    - path: /etc/systemd/user/network-online.target
      contents:
        inline: |
          [Unit]
          Description=Network online for systemd --user
          Documentation=man:systemd.special(7)
          Documentation=https://systemd.io/NETWORK_ONLINE
          #After=network.target
    - path: /etc/systemd/user/systemd-networkd-wait-online.service
      contents:
        inline: |
          [Unit]
          Description=Wait network online for systemd --user
          Documentation=man:systemd-networkd-wait-online.service(8)
          Before=network-online.target

          [Service]
          Type=oneshot
          ExecStart=/usr/lib/systemd/systemd-networkd-wait-online
          RemainAfterExit=yes

          [Install]
          WantedBy=network-online.target

下面简单解释一下这个配置文件:

  • (1) 添加用户.

    passwd:
      users:
        - name: fc-test
          ssh_authorized_keys:
    

    此处添加了一个普通用户 fc-test, 并使用了新生成的 SSH 公钥. 为了系统安全, 不同的用户应该使用不同的密钥进行登录.

    参考资料: https://docs.fedoraproject.org/en-US/fedora-coreos/authentication/

  • (2) 配置根分区的文件系统.

    storage:
      filesystems:
        - device: /dev/disk/by-partlabel/root
          wipe_filesystem: true
          label: root
          format: btrfs
          mount_options:
            - compress=zstd
    

    此处指定根分区使用 btrfs 文件系统进行格式化, 并启用 zstd 数据压缩.

    参考资料: https://docs.fedoraproject.org/en-US/fedora-coreos/storage/ https://coreos.github.io/butane/config-fcos-v1_5/

  • (3) 写入配置文件.

    storage:
      files:
    

    此处添加一些配置文件, path 指定文件路径, contents 指定文件内容. 后面再详细解释这些配置文件.

    参考资料: https://docs.fedoraproject.org/en-US/fedora-coreos/managing-files/


安装系统之后, 修改本机的 SSH 配置如下 (用来连接服务器):

> cat ~/.ssh/config
Host fc-server-core
    HostName fc-server.test
    User core
    IdentityFile ~/.ssh/id_ed25519-fc-server-202406

Host fc-server
    HostName fc-server.test
    User fc-test
    IdentityFile ~/.ssh/id_ed25519-fc-server-test-202406

其中 fc-server.test 是服务器的 IP 地址, IdentityFile 指定用户对应的私钥文件.

2 额外配置 (可选)

此处的配置是可选的, 与本文的主题关系不大. 只是窝顺便想使用一些功能. 读者可以跳过这一部分.

2.1 根分区换成 btrfs 文件系统

fcos 在默认情况下, 根分区 (root) 的文件系统是 xfs.

窝对使用 xfs 没有什么经验, 平时窝都是使用 btrfs. 并且数据盘已经使用了 btrfs, 如果系统盘使用 xfs, 那么就会同时使用两种文件系统, 这可能会增加维护过程中的麻烦, 所以直接都使用 btrfs 好了.

使用 SSH 连接服务器, 并查看一些基本的系统信息:

> ssh fc-server-core
Fedora CoreOS 40.20240602.3.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

core@MiWiFi-RA74-srv:~$ id
uid=1000(core) gid=1000(core) groups=1000(core),4(adm),10(wheel),16(sudo),190(systemd-journal) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
core@MiWiFi-RA74-srv:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       721Mi        30Gi       9.3Mi       286Mi        30Gi
Swap:             0B          0B          0B
core@MiWiFi-RA74-srv:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p4  477G  1.4G  475G   1% /sysroot
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs            16G     0   16G   0% /dev/shm
efivarfs        120K   83K   33K  72% /sys/firmware/efi/efivars
tmpfs           6.3G  9.3M  6.3G   1% /run
tmpfs            16G     0   16G   0% /tmp
/dev/nvme0n1p3  350M  112M  216M  35% /boot
tmpfs           3.2G  4.0K  3.2G   1% /run/user/1000

刚刚安装好系统, 根分区只使用了 1.4GB 存储空间. 所以 btrfs 相比 xfs 能够节省一些存储空间, 还是有明显好处的 !

使用 mount 命令查看挂载的详细信息 (省略部分结果):

core@MiWiFi-RA74-srv:~$ mount
/dev/nvme0n1p4 on /sysroot type btrfs (ro,relatime,seclabel,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)
/dev/nvme0n1p4 on / type btrfs (rw,relatime,seclabel,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)
/dev/nvme0n1p4 on /etc type btrfs (rw,relatime,seclabel,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)
/dev/nvme0n1p4 on /usr type btrfs (ro,relatime,seclabel,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)
/dev/nvme0n1p4 on /sysroot/ostree/deploy/fedora-coreos/var type btrfs (rw,relatime,seclabel,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)

/dev/nvme0n1p4 on /var type btrfs (rw,relatime,seclabel,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)

此处确认已经开启了文件数据压缩 (compress=zstd:3), 并开启了针对 SSD (闪存) 的优化 (ssd).

开启文件系统压缩还有一个明显的好处: 可以通过减少写入数据量, 延长 SSD 的使用寿命. 毕竟现在的高多层闪存都挺娇贵的, 写个几百遍就完了. (除了超贵的企业级存储器, 但是吧, 请看咱的网名 ~~) 所以窝觉得使用 btrfs 还是有明显好处的.

2.2 开机自动挂载数据盘 (systemd automount)

详见文章 《逻辑卷管理器 (LVM) 简介》.

配置文件:

fc-test@MiWiFi-RA74-srv:~$ cat /etc/systemd/system/var-mnt-data-d1.mount
[Mount]
What=/dev/d202406a/d202406a1
Where=/var/mnt/data/d1
Type=btrfs
Options=compress=zstd,nosuid,nodev
fc-test@MiWiFi-RA74-srv:~$ cat /etc/systemd/system/var-mnt-data-d1.automount
[Automount]
Where=/var/mnt/data/d1
TimeoutIdleSec=2h

[Install]
WantedBy=local-fs.target
fc-test@MiWiFi-RA74-srv:~$ 

其中 .mount 配置实际挂载: What 指定块设备, Where 指定挂载点, Type 指定文件系统, Options 指定挂载选项.

.automount 配置自动挂载, 需要与相应的 .mount 对应. TimeoutIdleSec 指定空闲多久后自动卸载.

参考资料: https://www.man7.org/linux/man-pages/man5/systemd.mount.5.html https://www.man7.org/linux/man-pages/man5/systemd.automount.5.html

虽然配置文件在安装系统时已经写好了, 但是默认并未启用:

core@MiWiFi-RA74-srv:~$ systemctl status var-mnt-data-d1.automount
○ var-mnt-data-d1.automount
     Loaded: loaded (/etc/systemd/system/var-mnt-data-d1.automount; disabled; preset: disabled)
     Active: inactive (dead)
   Triggers: ● var-mnt-data-d1.mount
      Where: /var/mnt/data/d1
core@MiWiFi-RA74-srv:~$ systemctl status var-mnt-data-d1.mount
○ var-mnt-data-d1.mount - /var/mnt/data/d1
     Loaded: loaded (/etc/systemd/system/var-mnt-data-d1.mount; static)
     Active: inactive (dead)
      Where: /var/mnt/data/d1
       What: /dev/d202406a/d202406a1

使用 systemctl enable 命令启用:

core@MiWiFi-RA74-srv:~$ sudo systemctl enable var-mnt-data-d1.automount
Created symlink /etc/systemd/system/local-fs.target.wants/var-mnt-data-d1.automount → /etc/systemd/system/var-mnt-data-d1.automount.
core@MiWiFi-RA74-srv:~$ sudo systemctl enable var-mnt-data-d2.automount
Created symlink /etc/systemd/system/local-fs.target.wants/var-mnt-data-d2.automount → /etc/systemd/system/var-mnt-data-d2.automount.
core@MiWiFi-RA74-srv:~$ sync
core@MiWiFi-RA74-srv:~$ sudo reboot

Broadcast message from root@localhost on pts/1 (Thu 2024-06-20 02:27:06 UTC):

The system will reboot now!

core@MiWiFi-RA74-srv:~$ Connection to fc-server.test closed by remote host.
Connection to fc-server.test closed.

重启之后查看存储信息:

core@MiWiFi-RA74-srv:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p4  477G  1.5G  475G   1% /sysroot
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs            16G     0   16G   0% /dev/shm
efivarfs        120K   83K   33K  72% /sys/firmware/efi/efivars
tmpfs           6.3G  9.3M  6.3G   1% /run
tmpfs            16G     0   16G   0% /tmp
/dev/nvme0n1p3  350M  112M  216M  35% /boot
tmpfs           3.2G  4.0K  3.2G   1% /run/user/1000

嗯 ? 怎么没有挂载 ??

别急, 先访问一下对应的目录:

core@MiWiFi-RA74-srv:~$ ls -al /mnt/data/d1
total 16
drwxr-xr-x. 1 root root 36 Jun 16 09:48 .
drwxr-xr-x. 1 root root  8 Jun 20 02:26 ..
-rw-r--r--. 1 root root  0 Jun 16 09:48 20240616-d202406a1
core@MiWiFi-RA74-srv:~$ ls -al /mnt/data/d2
total 16
drwxr-xr-x. 1 root root 36 Jun 16 09:48 .
drwxr-xr-x. 1 root root  8 Jun 20 02:26 ..
-rw-r--r--. 1 root root  0 Jun 16 09:48 20240616-d202406b1
core@MiWiFi-RA74-srv:~$ df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/nvme0n1p4                  477G  1.5G  475G   1% /sysroot
devtmpfs                        4.0M     0  4.0M   0% /dev
tmpfs                            16G     0   16G   0% /dev/shm
efivarfs                        120K   83K   33K  72% /sys/firmware/efi/efivars
tmpfs                           6.3G  9.3M  6.3G   1% /run
tmpfs                            16G     0   16G   0% /tmp
/dev/nvme0n1p3                  350M  112M  216M  35% /boot
tmpfs                           3.2G  4.0K  3.2G   1% /run/user/1000
/dev/mapper/d202406a-d202406a1 1000G  5.8M  998G   1% /var/mnt/data/d1
/dev/mapper/d202406b-d202406b1 1000G  5.8M  998G   1% /var/mnt/data/d2

然后就挂载了 ! 使用 mount 命令查看详细挂载信息:

core@MiWiFi-RA74-srv:~$ mount

systemd-1 on /var/mnt/data/d1 type autofs (rw,relatime,fd=53,pgrp=1,timeout=7200,minproto=5,maxproto=5,direct,pipe_ino=10595)
systemd-1 on /sysroot/ostree/deploy/fedora-coreos/var/mnt/data/d1 type autofs (rw,relatime,fd=53,pgrp=1,timeout=7200,minproto=5,maxproto=5,direct,pipe_ino=10595)
systemd-1 on /var/mnt/data/d2 type autofs (rw,relatime,fd=67,pgrp=1,timeout=7200,minproto=5,maxproto=5,direct,pipe_ino=10597)
systemd-1 on /sysroot/ostree/deploy/fedora-coreos/var/mnt/data/d2 type autofs (rw,relatime,fd=67,pgrp=1,timeout=7200,minproto=5,maxproto=5,direct,pipe_ino=10597)

/dev/mapper/d202406a-d202406a1 on /var/mnt/data/d1 type btrfs (rw,nosuid,nodev,relatime,seclabel,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/)
/dev/mapper/d202406b-d202406b1 on /var/mnt/data/d2 type btrfs (rw,nosuid,nodev,relatime,seclabel,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/)

可以看到, systemd 在挂载点挂载了 autofs, 当出现实际访问时, 才进行挂载.

从上面可以了解, 使用 systemd 自动挂载有以下优点:

  • (1) 加快系统启动. 系统不必等待 automount 磁盘挂载完毕, 就可以继续启动.

  • (2) 挂载失败不会导致系统启动失败 (故障隔离). 比如, 硬盘掉线, 或者损坏了, 甚至直接没了. 如果是普通挂载, 系统会因为无法完成磁盘挂载, 无法继续启动. 而在 automount 情况下, 系统不会等待磁盘挂载, 会继续正常启动.

  • (3) 节省资源 (懒执行). 完全没有被访问的磁盘不会挂载. 磁盘在出现访问请求时才会挂载. 空闲一段时间后, 系统会自动卸载磁盘, 释放资源 (同时一定程度上减少数据丢失损坏).

综上, 数据盘还是很适合使用自动挂载的.

2.3 配置固定 IP 地址 (systemd-networkd)

窝希望, 服务器在配置固定 IP 地址的同时, 也从 DHCP 获取动态分配的 IP 地址. 也就是一个网络接口具有 2 个 IP 地址.

fcos 默认使用 NetworkManager 进行网络管理, 但是这个需求使用 NetworkManager 实现很麻烦, 而使用 systemd-networkd 就很简单方便. 另外, 如果需要配置 VLAN, 更是适合使用 systemd-networkd.

相关文章: 《香橙派配置 VLAN (802.1q)》 https://blog.csdn.net/secext2022/article/details/135828669


fcos 默认并没有安装 systemd-networkd, 所以首先需要安装相应软件包.

core@MiWiFi-RA74-srv:~$ systemctl status systemd-networkd
Unit systemd-networkd.service could not be found.

使用 rpm-ostree install 命令进行安装:

core@MiWiFi-RA74-srv:~$ sudo rpm-ostree install systemd-networkd
Checking out tree a65ed05... done
Enabled rpm-md repositories: fedora-cisco-openh264 updates fedora updates-archive
Updating metadata for 'fedora-cisco-openh264'... done
Updating metadata for 'updates'... done
Updating metadata for 'fedora'... done
Updating metadata for 'updates-archive'... done
Importing rpm-md... done
rpm-md repo 'fedora-cisco-openh264'; generated: 2024-03-12T11:45:42Z solvables: 3
rpm-md repo 'updates'; generated: 2024-06-19T02:00:08Z solvables: 18190
rpm-md repo 'fedora'; generated: 2024-04-14T18:51:11Z solvables: 74881
rpm-md repo 'updates-archive'; generated: 2024-05-22T01:41:39Z solvables: 13161
Resolving dependencies... done
Will download: 1 package (689.8 kB)
Downloading from 'updates'... done
Importing packages... done
Checking out packages... done
Running pre scripts... done
Running post scripts... done
Running posttrans scripts... done
Writing rpmdb... done
Writing OSTree commit... done
Staging deployment... done
Added:
  systemd-networkd-255.7-1.fc40.x86_64
Changes queued for next boot. Run "systemctl reboot" to start a reboot
core@MiWiFi-RA74-srv:~$ sudo systemctl reboot

Broadcast message from root@localhost on pts/1 (Thu 2024-06-20 02:38:07 UTC):

The system will reboot now!

core@MiWiFi-RA74-srv:~$ Connection to fc-server.test closed by remote host.
Connection to fc-server.test closed.

软件包本身很小, 但是安装可能会比较慢. 安装之后需要 重启 系统, 然后使用 rpm-ostree status 命令查看状态:

core@MiWiFi-RA74-srv:~$ rpm-ostree status
State: idle
AutomaticUpdatesDriver: Zincati
  DriverState: active; periodically polling for updates (last checked Thu 2024-06-20 02:38:49 UTC)
Deployments:
● fedora:fedora/x86_64/coreos/stable
                  Version: 40.20240602.3.0 (2024-06-17T10:36:48Z)
               BaseCommit: a65ed051ae3c7ae658f19bee19ff36be19723070282305382890a793904f6f5e
             GPGSignature: Valid signature by 115DF9AEF857853EE8445D0A0727707EA15B79CC
          LayeredPackages: systemd-networkd

  fedora:fedora/x86_64/coreos/stable
                  Version: 40.20240602.3.0 (2024-06-17T10:36:48Z)
                   Commit: a65ed051ae3c7ae658f19bee19ff36be19723070282305382890a793904f6f5e
             GPGSignature: Valid signature by 115DF9AEF857853EE8445D0A0727707EA15B79CC
core@MiWiFi-RA74-srv:~$ systemctl status NetworkManager
● NetworkManager.service - Network Manager
     Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Thu 2024-06-20 02:38:43 UTC; 56s ago
       Docs: man:NetworkManager(8)
   Main PID: 1235 (NetworkManager)
      Tasks: 4 (limit: 38288)
     Memory: 6.8M (peak: 7.2M)
        CPU: 131ms
     CGroup: /system.slice/NetworkManager.service
             └─1235 /usr/sbin/NetworkManager --no-daemon

参考资料: https://coreos.github.io/rpm-ostree/


systemd-networkd 服务默认是禁用的:

core@MiWiFi-RA74-srv:~$ systemctl status systemd-networkd
○ systemd-networkd.service - Network Configuration
     Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: inactive (dead)
TriggeredBy: ○ systemd-networkd.socket
       Docs: man:systemd-networkd.service(8)
             man:org.freedesktop.network1(5)
   FD Store: 0 (limit: 512)

配置文件已经写好了:

core@MiWiFi-RA74-srv:~$ cat /etc/systemd/network/10-eno1.network
[Match]
Name=eno1

[Network]
DHCP=yes

[Address]
Address=192.168.31.2/24
core@MiWiFi-RA74-srv:~$ 

使用 systemctl enable 命令启用服务:

core@MiWiFi-RA74-srv:~$ sudo systemctl enable systemd-networkd
Created symlink /etc/systemd/system/dbus-org.freedesktop.network1.service → /usr/lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-networkd.service → /usr/lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/sockets.target.wants/systemd-networkd.socket → /usr/lib/systemd/system/systemd-networkd.socket.
Created symlink /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service → /usr/lib/systemd/system/systemd-networkd-wait-online.service.

同时别忘了禁用 NetworkManager 服务:

core@MiWiFi-RA74-srv:~$ sudo systemctl mask NetworkManager
Created symlink /etc/systemd/system/NetworkManager.service → /dev/null.

重启, 然后可以看到 systemd-networkd 正常运行:

core@MiWiFi-RA74-srv:~$ systemctl status systemd-networkd
● systemd-networkd.service - Network Configuration
     Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Thu 2024-06-20 02:42:08 UTC; 2min 5s ago
TriggeredBy: ● systemd-networkd.socket
       Docs: man:systemd-networkd.service(8)
             man:org.freedesktop.network1(5)
   Main PID: 1072 (systemd-network)
     Status: "Processing requests..."
      Tasks: 1 (limit: 38288)
   FD Store: 0 (limit: 512)
     Memory: 3.3M (peak: 3.8M)
        CPU: 82ms
     CGroup: /system.slice/systemd-networkd.service
             └─1072 /usr/lib/systemd/systemd-networkd

查看 IP 地址:

core@MiWiFi-RA74-srv:~$ ip addr

2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether a0:8c:fd:d8:9c:19 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    inet 192.168.31.2/24 brd 192.168.31.255 scope global eno1
       valid_lft forever preferred_lft forever
    inet 192.168.31.12/24 metric 1024 brd 192.168.31.255 scope global secondary dynamic eno1
       valid_lft 172630sec preferred_lft 172630sec

可以看到, 其中 192.168.31.2/24 是配置的固定 IP 地址, 192.168.31.12/24 是通过 DHCP 动态获取的 IP 地址.

3 测试普通用户

使用 SSH 连接服务器, 并查看基本用户信息:

> ssh fc-server
Fedora CoreOS 40.20240602.3.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

Last login: Thu Jun 20 05:04:48 2024 from 192.168.31.3
fc-test@MiWiFi-RA74-srv:~$ id
uid=1002(fc-test) gid=1002(fc-test) groups=1002(fc-test) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
fc-test@MiWiFi-RA74-srv:~$ pwd
/var/home/fc-test
fc-test@MiWiFi-RA74-srv:~$ w
 08:02:28 up 18:46,  1 user,  load average: 0.03, 0.02, 0.00
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
fc-test            08:02   18:46m  0.00s  0.05s sshd: fc-test [priv]
fc-test@MiWiFi-RA74-srv:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       716Mi        30Gi       9.3Mi       574Mi        30Gi
Swap:             0B          0B          0B
fc-test@MiWiFi-RA74-srv:~$ loginctl list-users
 UID USER    LINGER STATE 
1002 fc-test no     active

1 users listed.
fc-test@MiWiFi-RA74-srv:~$ 

可以看到, 这是一个普通用户, 没有特权 (不能 sudo).

3.1 开机自动运行容器

接下来使用 podman 运行一个容器应用.

相关文章: 《构建 deno/fresh 的 docker 镜像》 https://blog.csdn.net/secext2022/article/details/139649084

fc-test@MiWiFi-RA74-srv:~$ ls -lh my-app.tar.zst
-rw-r--r--. 1 fc-test fc-test 77M Jun 23 08:16 my-app.tar.zst
fc-test@MiWiFi-RA74-srv:~$ podman load < my-app.tar.zst
Getting image source signatures
Copying blob 90ec6ab34ce0 done   | 
Copying blob a62d4638ad90 done   | 
Copying blob 31e29b5ab918 done   | 
Copying blob c83c49512daf done   | 
Copying blob ff9964444958 done   | 
Copying blob 6389ca351a5d done   | 
Copying blob 2ca6496c9f8b done   | 
Copying config 83173f90cc done   | 
Writing manifest to image destination
Loaded image: docker.io/library/my-app:latest
fc-test@MiWiFi-RA74-srv:~$ podman images
REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
docker.io/library/my-app  latest      83173f90cca5  10 days ago  238 MB
fc-test@MiWiFi-RA74-srv:~$ podman run -d -p 8000:8000 my-app
542ca61c3ae225292543449af5034e2078b53c02bd37a63957ee4514162feb75
fc-test@MiWiFi-RA74-srv:~$ podman ps
CONTAINER ID  IMAGE                            COMMAND               CREATED        STATUS        PORTS                   NAMES
542ca61c3ae2  docker.io/library/my-app:latest  /usr/bin/deno run...  3 seconds ago  Up 4 seconds  0.0.0.0:8000->8000/tcp  magical_engelbart
fc-test@MiWiFi-RA74-srv:~$ 

好, 运行成功 ! 接下来配置开机自动运行.


首先, 编写一个配置文件, 如下:

fc-test@MiWiFi-RA74-srv:~$ cat ~/.config/containers/systemd/my-app.container
[Unit]
Description=example deno/fresh app
Wants=network-online.target
After=network-online.target

StartLimitIntervalSec=5s
StartLimitBurst=1

[Container]
Image=my-app
PublishPort=8000:8000
Pull=never

[Service]
Restart=always

[Install]
WantedBy=default.target
fc-test@MiWiFi-RA74-srv:~$ 

参考资料: https://docs.fedoraproject.org/en-US/fedora-coreos/running-containers/ https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html

重新加载 systemd 配置文件:

fc-test@MiWiFi-RA74-srv:~$ systemctl --user daemon-reload
fc-test@MiWiFi-RA74-srv:~$ systemctl --user status my-app
○ my-app.service - example deno/fresh app
     Loaded: loaded (/var/home/fc-test/.config/containers/systemd/my-app.container; generated)
    Drop-In: /usr/lib/systemd/user/service.d
             └─10-timeout-abort.conf
     Active: inactive (dead)
fc-test@MiWiFi-RA74-srv:~$ 

距离开机启动还有重要的一步, 使用 loginctl enable-linger 命令:

fc-test@MiWiFi-RA74-srv:~$ loginctl enable-linger
fc-test@MiWiFi-RA74-srv:~$ loginctl list-users
 UID USER    LINGER STATE 
1002 fc-test yes    active

1 users listed.
fc-test@MiWiFi-RA74-srv:~$ 

参考资料: https://www.man7.org/linux/man-pages/man1/loginctl.1.html

重启, 测试容器正常运行:

在这里插入图片描述

3.2 修复 systemd --user network-online.target

通过上述方式使用 podman 运行容器, 需要依赖 network-online.target (系统 unit). 也就是说, 需要等待网络初始化完毕之后, 才能启动. 但是, 上面的服务以用户实例 (systemd --user) 运行, 而用户 unit 无法依赖系统 unit. 如果不解决这个问题, 将导致启动失败.

添加如下配置文件:

core@MiWiFi-RA74-srv:~$ cat /etc/systemd/user/network-online.target
[Unit]
Description=Network online for systemd --user
Documentation=man:systemd.special(7)
Documentation=https://systemd.io/NETWORK_ONLINE
#After=network.target
core@MiWiFi-RA74-srv:~$ cat /etc/systemd/user/systemd-networkd-wait-online.service
[Unit]
Description=Wait network online for systemd --user
Documentation=man:systemd-networkd-wait-online.service(8)
Before=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online
RemainAfterExit=yes

[Install]
WantedBy=network-online.target
core@MiWiFi-RA74-srv:~$ 

这些 unit 文件是从系统 unit 文件复制而来, 经过简单修改. 需要使用 network-online.target 的用户需要启用相应服务:

fc-test@MiWiFi-RA74-srv:~$ systemctl --user enable systemd-networkd-wait-online.service
Created symlink /var/home/fc-test/.config/systemd/user/network-online.target.wants/systemd-networkd-wait-online.service → /etc/systemd/user/systemd-networkd-wait-online.service.

否则会报错 (省略部分内容):

fc-test@MiWiFi-RA74-srv:~$ systemctl --user status my-app
× my-app.service - example deno/fresh app
     Loaded: loaded (/var/home/fc-test/.config/containers/systemd/my-app.container; generated)
    Drop-In: /usr/lib/systemd/user/service.d
             └─10-timeout-abort.conf
     Active: failed (Result: exit-code)
   Main PID: 1600 (code=exited, status=126)
        CPU: 272ms

Jun 23 08:53:46 localhost pasta[1655]: External interface not usable
Jun 23 08:53:46 localhost my-app[1614]: Error: pasta failed with exit code 1:
Jun 23 08:53:46 localhost systemd[1495]: my-app.service: Failed with result 'exit-code'.
Jun 23 08:53:46 localhost systemd[1495]: Failed to start my-app.service - example deno/fresh app.

参考资料: https://systemd.io/NETWORK_ONLINE/ https://unix.stackexchange.com/questions/216919/how-can-i-make-my-user-services-wait-till-the-network-is-online

3.3 配置数据盘用户目录

普通用户也想使用数据盘存储数据, 需要进行一些简单的权限设置:

core@MiWiFi-RA74-srv:~$ cd /mnt/data/d1
core@MiWiFi-RA74-srv:/mnt/data/d1$ pwd
/mnt/data/d1
core@MiWiFi-RA74-srv:/mnt/data/d1$ ls -al
total 16
drwxr-xr-x. 1 root root 36 Jun 16 09:48 .
drwxr-xr-x. 1 root root  8 Jun 20 02:26 ..
-rw-r--r--. 1 root root  0 Jun 16 09:48 20240616-d202406a1
core@MiWiFi-RA74-srv:/mnt/data/d1$ sudo mkdir fc-test
core@MiWiFi-RA74-srv:/mnt/data/d1$ sudo chmod 700 fc-test
core@MiWiFi-RA74-srv:/mnt/data/d1$ sudo chown fc-test:fc-test fc-test
core@MiWiFi-RA74-srv:/mnt/data/d1$ ls -al
total 16
drwxr-xr-x. 1 root    root    50 Jun 23 13:33 .
drwxr-xr-x. 1 root    root     8 Jun 20 02:26 ..
-rw-r--r--. 1 root    root     0 Jun 16 09:48 20240616-d202406a1
drwx------. 1 fc-test fc-test  0 Jun 23 13:33 fc-test
core@MiWiFi-RA74-srv:/mnt/data/d1$ sync
core@MiWiFi-RA74-srv:/mnt/data/d1$ 

其中 cd 命令用于切换当前目录, pwd 命令显示当前目录, ls 命令列出目录中的文件, mkdir 命令创建目录, chmod 命令设置权限 (700 表示只有文件所有者可以访问), chown 命令设置文件的所有者 (owner) 和群组 (group), sync 命令用于将内存缓冲区的数据写入磁盘.

类似的, 对另一块数据盘进行同样的操作:

core@MiWiFi-RA74-srv:/mnt/data/d2$ pwd
/mnt/data/d2
core@MiWiFi-RA74-srv:/mnt/data/d2$ ls -al
total 16
drwxr-xr-x. 1 root    root    50 Jun 23 13:39 .
drwxr-xr-x. 1 root    root     8 Jun 20 02:26 ..
-rw-r--r--. 1 root    root     0 Jun 16 09:48 20240616-d202406b1
drwx------. 1 fc-test fc-test  0 Jun 23 13:39 fc-test

然后普通用户 fc-test 就可以在 2 块数据盘存储数据了.

4 总结与展望

Fedora CoreOS 安装还是很简单快速的, 只需一条命令即可. 并且只需一个 .ign 安装配置文件, 即可完成大部分系统配置, 无需安装系统之后再配置, 方便了很多.

为了更安全, 创建了一个普通用户 fc-test (无权 sudo). 将根分区换成 btrfs 文件系统, 并启用 zstd 数据压缩. 开机自动挂载数据盘 (systemd automount), 并配置了固定 IP 地址 (systemd-networkd).

作为普通用户, 测试了开机自动运行容器 (systemd --user, loginctl enable-linger). 由于 podman (pasta) 和 systemd --user 目前的问题 (user unit 无法依赖 system unit), 需要对 network-online.target 进行小小的修复. 最后配置了普通用户在数据盘的存储目录.

本文算是对 fcos 服务器系统管理的小型综合应用, 建立了多用户使用的舒适环境. 以后就可以方便的部署基于服务器的应用啦 ~


本文使用 CC-BY-SA 4.0 许可发布.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/743101.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python根据excel的文件创建文件夹

这几天要整理一点文档&#xff0c;需要批量生成一些文件夹&#xff0c;&#xff08;其实也可以进一步自动生成各种文档&#xff09;&#xff0c;用到了py的功能&#xff0c;在此记录一下。 1.准备工作 需要两个库支持openpyxl和os 安装 pip install openpyxl2.代码思路 打算…

初识Java(二)

初识Java的main方法 1.1 main方法示例 public class world {public static void main(String[] args) {System.out.println("hello,world!");}}通过上述代码&#xff0c;我们可以看到一个完整的Java程序的结构&#xff0c;Java程序的结构由如下三个部分组成&#x…

攻击者开始使用 XLL 文件进行攻击

近期&#xff0c;研究人员发现使用恶意 Microsoft Excel 加载项&#xff08;XLL&#xff09;文件发起攻击的行动有所增加&#xff0c;这项技术的 MITRE ATT&CK 技术项编号为 T1137.006。 这些加载项都是为了使用户能够利用高性能函数&#xff0c;为 Excel 工作表提供 API …

VC++开发积累——vc++6.0中删除函数的方法,右键,Delete

目录 引出插曲&#xff1a;删除函数的方法多行注释的实现代码输入的自动提示搜索出来&#xff0c;标记和取消标记跳转到上一步的位置 ctrl TAB 总结其他规范和帮助文档创建第一个Qt程序对象树概念信号signal槽slot自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自…

数据处理技术影响皮质-皮质间诱发电位的量化

摘要 皮质-皮质间诱发电位(CCEPs)是探究颅内人体电生理学中有效连接性的常用工具。与所有人体电生理学数据一样&#xff0c;CCEP数据极易受到噪声的影响。为了解决噪声问题&#xff0c;通常会对CCEP数据进行滤波和重参考&#xff0c;但不同的研究会采用不同的处理策略。本研究…

Linux操作系统进程同步的几种方式及基本原理

1&#xff0c;进程同步的几种方式 1.1信号量 用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行&#xff1a;初始化&#xff0c;P操作和V操作&#xff0c;这三种操作都是原子操作。 P操作(递减操作)可以用于阻塞一个进程&#xff0c;V操作(增加操作)可以用于…

基于SpringBoot+Vue网上图书商城(带1w+文档)

基于SpringBootVue网上图书商城(带1w文档) 通过网上图书商城的研究可以更好地理解系统开发的意义&#xff0c;而且也有利于发展更多的智能系统&#xff0c;解决了人才的供给和需求的平衡问题&#xff0c;网上图书商城的开发建设&#xff0c;由于其开发周期短&#xff0c;维护方…

计算机网络课程实训:局域网方案设计与实现(基于ensp)

文章目录 前言基本要求操作分公司1分公司2总部核心交换机配置实现内部服务器的搭建acl_deny部分用户与服务器出口出口防火墙配置 前言 本篇文章是小编实训部分内容&#xff0c;内容可能会有错误&#xff0c;另外ensp对电脑兼容性及其挑剔&#xff0c;在使用之前一定要安装好。…

C++哈希表、哈希桶的实现以及模拟实现封装unordered_map 和 unordered_set 位图 布隆过滤器 哈希切割相关

文章目录 unordered系列关联式容器unordered_mapunordered_map的接口说明 unordered_setset 与 unordered_set的效率比较 底层结构哈希概念哈希冲突哈希函数常见哈希函数哈希冲突解决闭散列 —— 开放定址法哈希表的插入线性探测二次探测 哈希表的闭散列实现哈希表的结构插入代…

面试-synchronized(java5以前唯一)和ReentrantLock的区别

1.ReentrantLock&#xff08;再入锁&#xff09;&#xff1a; (1).在java.util.concurrent.locks包 (2).和CountDownLatch,FutureTask,Semaphore一样基于AQS实现。 AQS:AbstractQueuedSynchronizer 队列同步器。Java并发用来构建锁或其他同步主键的基础框架&#xff0c;是j.u.c…

运行时库链接方式实践指南(MT、MD、MTd、MDd)

前言 笔者曾经编译一个库提供给使用者&#xff0c;提供库后发现由于运行时库连接方式不一致&#xff0c;导致使用者无法连接笔者提供的库。另一方面&#xff0c;理解和选择正确的运行时链接方式对于构建高效、可靠的应用程序至关重要。 因此&#xff0c;本文将展开运行时库的基…

如何写好AI绘画提示词?保姆级教程来了!

前言 提示词编辑是一个结构化的过程&#xff0c;用能被人类解释和理解的词语来描述图像&#xff0c;也就是告诉人工智能模型应该怎么绘制图片。 生成优质图像的秘诀 1.提示词要想编辑好&#xff0c;包括修饰词和好的句子结构&#xff0c;首先你要了解所有的修饰词类型。 2.St…

大模型日报|8 篇必读的大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.M2Lingual&#xff1a;在大语言模型中加强多语言、多轮次的指令对齐 指令微调对于大语言模型&#xff08;LLM&#xff09;按照指令进行对齐至关重要。最近提出了许多有效的 IFT 数据集&#xff0c;但大多数数据集都…

HALCON-从入门到入门-提取小票上的斑点

测试效果 在一张超市小票上提取点阵数字 处理步骤解析 首先读取两张图&#xff0c;一张是小票的图片&#xff0c;一张是静脉的图片 为了让点阵数字提取更加困难&#xff0c;我们将两张图片合成到一起 read_image (ImageNoise, angio-part) crop_part (ImageNoise, ImagePart…

在 Postman 中使用 Body 进行 POST 请求

Postman 是开发者日常工具箱中不可缺少的一部分&#xff0c;特别是在 API 开发和调试环节中。 为什么使用 POST 请求 POST 请求用于向服务器发送数据&#xff0c;这些数据通常被处理后存储。与 GET 请求不同&#xff0c;POST 请求将数据嵌入请求体&#xff08;Body&#xff0…

Linux配置网卡详细教程

这个网卡配置然后头痛了两天&#xff0c;看了很多篇关于这方面的文章&#xff0c;但是都没让我成功&#xff0c;可惜工亏不负有心人&#xff0c;然后终于学会了下面此方法 实现完成的效果&#xff1a; 永久修改网卡IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEther…

【Linux】Docker安装kafka教程(超详细保姆篇)

文章目录 安装1.安装Zookeeper2.安装kafka3.创建zookeeper容器4.创建kafka容器5.测试kafka6.退出bash shell Zookeeper服务启动1.首先找到Zookeeper安装路径2.执行./zkServer.sh start3.查看运行状态3.集群配置(可不阅) kafka服务启动1.进入kafka的config目录2.修改server.prop…

后端返回base64文件流下载

后端返回base64文件流: 前端处理&#xff1a; downloadTemplate () {this.$API.downloadTemplate().then(({ data }) > {const binaryString atob(data) // 解码base64字符串const byteArray new Uint8Array(binaryString.length) // 创建一个Uint8Arrayfor (let i 0; i…

Java面试八股之Mybatis可以映射到枚举类吗

Mybatis可以映射到枚举类吗 Mybatis 可以映射到 Java 的枚举类型。默认情况下&#xff0c;Mybatis 会使用枚举类型的名称来进行映射。例如&#xff0c;如果你有一个如下的枚举类型&#xff1a; public enum UserStatus { ACTIVE, INACTIVE } Mybatis 会将数据库中的字符串值…

PointCloudLib (多线程)快速双边滤波 C++版本

0.实现效果 原始点云 和滤波后的点云对比 1.算法原理 PCL(Point Cloud Library)快速双边滤波是一种高效的点云数据滤波方法,它基于传统双边滤波算法进行了改进,通过引入近似方法加速计算过程。以下是关于PCL快速双边滤波的详细回答: 1. 基本原理 空间滤波:在点云中,相…