在将 EBS 卷附加到正在运行的 Linux(在本例中为 NixOS)实例时,我们遇到了一个奇怪的问题(为了扩大该附加卷上的文件系统;它是我们关闭的另一台机器的 NixOS 根文件系统)。
在附加之前,一切正常:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 100G 0 disk
└─xvda1 202:1 0 100G 0 part
连接后,lsblk
奇怪的是声称附加卷的分区包含/
当前机器的已挂载分区:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 100G 0 disk
└─xvda1 202:1 0 100G 0 part /nix/store
xvdf 202:80 0 400G 0 disk
└─xvdf1 202:81 0 200G 0 part /
这根本没有意义:
只需“插入”该磁盘,Linux 就会认为根文件系统挂载刚刚“翻转”到新磁盘。/nix/store
(这是 NixOS 只读绑定挂载)以某种方式保留在正确的磁盘上。
dmesg
Linux 内部或外部均没有journalctl
显示已连接磁盘的消息:
Apr 28 11:57:21 mymachine kernel: blkfront: xvdf: barrier or flush: disabled; persistent grants: disabled; indirect descriptors: enabled;
Apr 28 11:57:21 mymachine kernel: xvdf: xvdf1
在 中fdisk -l
,两个磁盘看上去正常,但有不同的Disk identifier
s。
这是不可能的umount /dev/xvdf1
;它说安装正忙。
对于扩大分区的目标,growpart /dev/xvdf 1
无论如何都可以,但是resize2fs /dev/xvdf1
会失败:
Filesystem at /dev/xvdg1 is mounted on /; on-line resizing required
old_desc_blocks = 25, new_desc_blocks = 50
resize2fs: No space left on device While checking for on-line resizing support
这是怎么回事?为什么 Linux 会混淆这些磁盘?
答案1
原因就是by-label
坐骑。
出于声明式自动化的原因(我们有很多台机器),我们每台机器的根文件系统都有相同的 ext4 文件系统标签nixos
:
# cat /etc/fstab
/dev/disk/by-label/nixos / ext4 x-nixos.autoresize 0 1
# cat /etc/mtab
/dev/disk/by-label/nixos /nix/store ext4 rw,relatime 0 0
将两个这样的软件连接到同一台机器会使 Linux 感到困惑。
因此解决方案是:
by-label
通过将 EBS 卷附加到根文件系统未使用相同标签安装的 AWS 机器来增加文件系统的增长。- 首先更改文件系统标签,然后进行更改,然后将其改回所需的标签。