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

news2024/11/15 15:33:19

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 许可发布.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践

摘要&#xff1a;本文投稿自贝壳家装数仓团队&#xff0c;在结合家装业务场景下所探索出的一种基于 FlinkPaimon 的排序方案。这种方案可以在实时环境对全量数据进行准确的分组排序&#xff0c;同时减少对内存资源的消耗。在这一方案中&#xff0c;引入了“事件时间分段”的概念…

k8s设置pod资源请求和限制

设置资源请求和限制 实验目标&#xff1a; 学习如何为 Pod 设置资源请求和限制&#xff0c;以优化集群资源分配。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 和内存的资源请求和限制。使用 kubectl describe 命令查看资源分配情况。观察资源限制对 P…

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;将于2024年8月2-4日在中国厦门召开。ICVISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域&#xff0c; 为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提…

Linux常用基本命令

linux目录 1.查看linux本机ip ip addr 2.新建文件夹 mkdir 文件夹名 3.新建文件 touch 文件名.后缀 4.删除文件 rm 文件名.后缀 5.删除文件 rm -r 文件名 6.不询问直接删除 rm -rf 文件名/文件名/ 7.显示目录下文件&#xff0c;文件夹 作用&#xff1a;显示指定目…

鸿蒙应用开发 - 软件安装 - DevEco

第一步 前往下载点下载安装包下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态https://developer.huawei.com/consumer/cn/download/ 根据自身需求下载对应安装包 第二步 点击打开安装包,配置安装路径 我个人选择放E盘,避免占用c盘空间 第三步 …

00_Python核心编程

Python入门 一 Python初识 1 Python的历史 Python的历史python是蟒蛇的含义python是一种解释型的,面向对象的,带有动态语义的高级程序设计语言. python是一种使你在编程时能够保持自己的风格的程序设计语言,你不用费什么劲就可以实现你想要的功能,并且编写的程序清晰易懂. …

宠物空气净化器哪家强?希喂、小米、安德迈谁最具性价比?

猫咪掉毛是一种正常的生理现象&#xff0c;每只猫咪都会周期性地更换毛发。但是&#xff0c;当您发现家里的沙发、地毯、衣物、甚至空气中都漂浮着难以清理的猫浮毛时。还是会很烦恼&#xff0c;最重要的是空气中的浮毛如果不及时清理的话长时间停留在空气中会对身体造成一定威…

苏州大学气膜综合馆成为师生活动新中心—轻空间

苏州大学应用技术学院的气膜综合馆自建成以来&#xff0c;已成为校园内的热门活动场所。由轻空间&#xff08;江苏&#xff09;膜科技有限公司&#xff08;以下简称“轻空间”&#xff09;全力打造&#xff0c;这座现代化、环保的多功能运动场馆&#xff0c;不仅为师生提供了一…

小米汽车SU7全色系H5自适应展示源码

为了满足广大车迷和潜在消费者对小米汽车SU7全色系的视觉体验需求&#xff0c;我们特别推出了一款基于HTML的自适应H5源码&#xff0c;用于在线展示小米汽车SU7的全色系。这款源码不仅兼容各种设备和屏幕尺寸&#xff0c;而且能够完美地呈现出小米汽车SU7的优雅外观和精致细节。…

vue3-openlayers 轨迹回放(历史轨迹)(ol-animation-path实现)

本篇介绍一下使用vue3-openlayers轨迹回放&#xff08;历史轨迹&#xff09;&#xff08;ol-animation-path实现&#xff09; 1 需求 轨迹回放&#xff08;历史轨迹&#xff09;实时轨迹 2 分析 轨迹回放&#xff08;历史轨迹&#xff09;&#xff0c;一般是一次性拿到所有…

高效记录收支明细:揭秘如何通过曲线图精准分析每月开销

在理财的道路上&#xff0c;你是否曾感到迷茫和无力&#xff1f;每个月的开销如同流水般悄无声息地滑过指尖&#xff0c;但你却始终难以掌握自己的财务脉络。今天&#xff0c;我们为你揭秘一个全新的理财方法——通过曲线图精准分析每月开销&#xff0c;让你的财务生活焕发智慧…

java设计模式(二)工厂方法模式(pattern of factory method)

1、模式介绍&#xff1a; 工厂方法模式&#xff08;pattern of factory method&#xff09;是一种创建型设计模式&#xff0c;它定义了一个用于创建对象的接口&#xff0c;但将实际创建对象的工作延迟到子类中&#xff0c;这样可以在不改变整体结构的情况下&#xff0c;通过子…

java编写的界面可以调用python吗

如何使用Java调用Python程序 本文为大家介绍如何java调用python方法&#xff0c;供大家参考。 实际工程项目中可能会用到Java和python两种语言结合进行&#xff0c;这样就会涉及到一个问题&#xff0c;就是怎么用Java程序来调用已经写好的python脚本呢&#xff0c;一共有三种…

Verilog HDL语法入门系列(四):Verilog的语言操作符规则(下)

目录 7.移位操作符8.关系操作符9.相等操作符9.1逻辑等与case等9.2逻辑等与逻辑不等9.3 case等与case不等 10.条件操作符11.级联操作符12.复制 微信公众号获取更多FPGA相关源码&#xff1a; 7.移位操作符 符号含义>>逻辑右移<<逻辑左移 移位操作符对其左边的操作…

JVM虚拟机的组成

一、为什么要学习 JVM &#xff1f; 1. “ ⾯试造⽕箭&#xff0c;⼯作拧螺丝” &#xff0c; JVM 属于⾯试官特别喜欢提问的知识点&#xff1b; 2. 未来在⼯作场景中&#xff0c;也许你会遇到以下场景&#xff1a; 线上系统突然宕机&#xff0c;系统⽆法访问&#xff0c;甚⾄直…

IDS Gaia-X Catena-X Manufacturing-X的关系

来源&#xff1a;小盟科普丨Catena-X数据空间在汽车领域落地https://mp.weixin.qq.com/s/Ftp0UGAohsh4ltLn3DylAw

苹果电脑清理垃圾怎么清理 macbook怎么清理电脑垃圾文件 macos优化软件 cleanmymac怎么使用

在选择电脑时&#xff0c;不少人都会选择拥有高性能和轻薄机身的mac。一开始&#xff0c;它确实如我们所期待的那样健步如飞&#xff0c;然而&#xff0c;随着时间的流逝&#xff0c;有没有觉得您的Mac有时候像是需要一个好的春季大扫除一样&#xff1f;随着我们不断使用电脑&a…

IMU应用于颈部健康监测

随着电脑成为日常工作的必备工具&#xff0c;长时间使用电脑导致的颈部疼痛问题日益受到关注。近日&#xff0c;一项创新研究利用IMU开发了一种新型监测系统&#xff0c;用来监测电脑使用者的颈部姿势和疼痛情况。 在为期两天的实验中&#xff0c;8名办公室工作者分别在静态和…

2024年世界移动大会(MWC Shanghai)——飞睿智能诚邀您,超宽带技术定位测距传输全家桶

超宽带UWB芯片SIP系列&#xff1a; FS100 FS200 超宽带UWB标签系列&#xff1a; FU3620-2 FUP410-1 超宽带UWB应用系列&#xff1a; FMFB200A&#xff08;门锁方案&#xff09; FU2625-2&#xff08;TAG方案&#xff09; FPDB200A&#xff08;音频&#xff09; FSTB200…

中学政史地杂志中学政史地杂志社中学政史地编辑部2024年第4期目录

每月时政 时政要闻&#xff08;2024年3月&#xff09; 李伟; 3-4 热点聚焦 全面加强基础设施建设,积极扩大有效投资 刘华; 5-7《中学生政史地》投稿&#xff1a;cn7kantougao163.com 蒙古国努力应对冰雪灾害 张仁杰; 8-10 复习指导 高中政治经济全球化内容复习…