AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 450873
Accepted
Tiago Pimenta
Tiago Pimenta
Asked: 2018-06-21 05:27:55 +0800 CST2018-06-21 05:27:55 +0800 CST 2018-06-21 05:27:55 +0800 CST

如何在 systemd 上安全卸载 /var /usr 而无需重新启动

  • 772

我在 VM 上有一台 Linux 服务器,由于第三方提供商的配置错误,重启确实会像关机一样工作。我无权访问 VM 配置。

安装系统的人弄乱了存储,并且不负责任地为每个目录(/var, /home,/usr等)安装了一个点,导致他们很容易被一些人饿死,而另一些人则为空。

为了解决这个问题,我正在重新组织挂载点,我能够通过执行操作来管理其中的大部分,mount --bind / /mnt然后rsync重新启动使用它们的进程umount。

问题是systemd init 进程本身使用的/varand 。/usr会systemd-remount-fs行吗?我怎么能做到这一点?一个简单的fstab编辑然后rsync就足够了吗?它会重新启动所有服务吗?

我知道对于我的情况,哪些点确实需要单独的分区,而且根本不是这种/var情况/usr。

前提是我不能使用umount -l,因为我必须在重新安装分区后销毁分区,并且我想避免kexec因为不知道它是否会对这个配置错误的 VM 产生相同的错误影响,即无法再次启动它.

我计划有一个压缩btrfs分区 for /var/logand 另一个btrfsor xfsfor /var/lib/docker,一旦它们几乎是静态的,就将所有其他分区与所需的最小空间放在一起。将来我可能会将它们squashfs与 root one 放在一起并安装 aoverlayfs以便于检测错误配置。我希望能够在不重新启动的情况下完成所有这些操作,但我不知道我是否能够做到。

mount systemd
  • 1 1 个回答
  • 6803 Views

1 个回答

  • Voted
  1. Best Answer
    Tiago Pimenta
    2018-07-21T07:48:52+08:002018-07-21T07:48:52+08:00

    警告:这些操作非常危险,我对此不做任何保证,建议您了解每一步并自行承担风险,否则您可能会破坏您的系统,我不承担任何责任因使用而造成的任何损害。

    我已经在我的工作站上的本地虚拟机上克隆了所有服务器磁盘,以便在不影响我的原始服务器的情况下尝试这些命令,如果您不确定是否可以这样做。经过广泛的研究和几次实验,我终于找到了解决方案。

    一些系统在 initrd 上使用 systemd,在挂载目标 root 后,它会像使用 chroot 一样切换 systemd 环境,所有服务都关闭,然后在新环境中重新启动。

    我们可以利用此功能再次更改根目录,在其他磁盘上的克隆环境中这样做会释放系统在旧环境中持有的锁,因此您可以安全地卸载这些点 - 实际上它甚至不会安装。但是这个克隆的环境应该保证正确的配置重新启动网络并提供 ssh 访问。如果没有,请认为自己注定要失败。

    重要的是你有一个单独的分区,一旦你 chroot 到另一个分区内的目录而不是设备本身,系统仍然可以保存父分区的设备,对于这个用例,我们应该考虑它不会阻止任何.

    如果您有未分配的可用空间,或者您能够缩小一些分区以便为克隆环境留出空间,建议您这样做。但是,如果您没有可用的存储空间,如果您有足够的内存,您可以创建一个虚拟内存挂载点。一旦连接在此过程中丢失,不建议使用网络分区。

    虚拟内存挂载点可以通过 完成tmpfs,但它会导致您将此内存锁定在较旧的环境中,这样您就无法在没有rebootor的情况下释放它,除了创建内存设备外kexec,更好的方法是使用zram它压缩数据,所以如果你写入5G数据,它实际上会比内存使用少得多,但你仍然需要足够的内存。

    例如,如果7G足够,您可以按以下方式创建它:

    sudo modprobe zram num_devices=4
    echo 7G | sudo tee /sys/block/zram0/disksize
    sudo mkfs.ext4 -m0 /dev/zram0
    

    在此处为克隆环境配置所需的分区后,它将如何工作:

    mkdir /tmp/sys
    sudo mount /dev/zram0 /tmp/sys # or the target device in place of zram0
    # mount other separate partitions if required
    sudo tar -cpSf - \
        --acls --xattrs --selinux \
        --exclude '/dev/*' \
        --exclude '/run/*' \
        --exclude '/sys/*' \
        --exclude '/proc/*' \
        --exclude '/tmp/*' \
        --exclude '/var/tmp/*' \
        --exclude '/var/run/*' \
        / |
        sudo tar -xvf - \
            --acls --xattrs --selinux \
            -C /tmp/sys
    

    fstab建议在执行切换之前备份您的:

    sudo cp -a /tmp/sys/etc/fstab /tmp/sys/etc/fstab-
    sudo truncate -s0 /tmp/sys/etc/fstab
    

    如果您打算更改某些设备是swap内存的分区,建议先禁用它:

    sudo swapoff -a
    

    然后,执行 chroot:

    sudo mkdir /sysroot
    sudo mount --rbind /tmp/sys /sysroot
    sudo touch /etc/initrd-release
    sudo systemctl --no-block isolate initrd-switch-root
    # it will stop all other services (isolate) and call systemctl switch-root /sysroot
    

    请注意,它不需要绑定proc,dev正如您在执行 chroot 时通常所做的那样,systemd 会为您完成。您可能会失去连接,如果您等待一段时间仍然无法连接,请原谅,您已经浪费了。

    虽然如果你很幸运并且现在能够连接,你可以执行你想要的分区表更改。

    调整设备路径和 uuid ( blkid) 以匹配新设备非常重要:

    sudo mv /etc/fstab- /etc/fstab
    sudo vi /etc/fstab
    sudo vi /etc/default/grub
    

    完成更改后,您可以执行相同的策略来切换回真正的根设备,一旦完成,不要忘记为新环境安装引导加载程序,以便在关机的情况下再次弥补:

    sudo grub2-install /dev/sda # or the intended bootable disk
    sudo grub2-mkconfig -o /etc/grub2.cfg
    

    切换回物理设备后,如果您正在使用,则zram可以通过以下方式释放内存:

    echo 1 | sudo tee /sys/block/zram0/reset
    sudo modprobe -r zram
    

    请记住,这样做需要您自担风险。

    • 2

相关问题

  • 如何在 solaris 11.3 中挂载 zfs 驱动器分区

  • 使用 systemd 看门狗支持重新启动应用程序

  • 阻止挂载系统调用

  • 将局域网硬盘挂载到 linux fedora

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve