如果一个分区没有被挂载,为什么它会被系统使用?

ste*_*red 12 filesystems boot partition

在遇到 VM 的性能问题后,我一直在将系统从 btrfs 迁移到 ext4。我的笔记本电脑中有两个硬盘可以使用。我已经成功移动了我的主分区,但我使用的相同步骤不适用于 root。

迄今为止的进展:

我已经dd“从D我的根分区/dev/sda3/dev/sdb3。我修改/etc/fstab为以下内容:

$ cat /etc/fstab
# 
# /etc/fstab: static file system information
#
# <file system> <dir>   <type>  <options>       <dump>  <pass>
# UUID=95f13c34-96ca-49e3-bcb2-ff594df31506
/dev/sdb3               /               btrfs           rw,noatime,ssd,space_cache,discard      0 0

# UUID=0fe04f59-599f-41e2-ac30-2ad0f17a9727
/dev/sda2               /boot           ext2            rw,relatime     0 2

# UUID=44741e0f-924a-4841-80ef-2132bef84182
/dev/sda4               /home           ext4            rw,noatime,discard      0 0
Run Code Online (Sandbox Code Playgroud)

并运行sudo mkinitcpio -p linux。它似乎工作。我可以通过在第二个磁盘上安装分区来启动。df显示:

$ df
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb3        28G   18G  9.8G  65% /
Run Code Online (Sandbox Code Playgroud)

所以,很明显,sdb3是安装的,而不是sda3. 这是有问题的步骤:当我尝试格式化时sda3,据称未使用,我得到以下信息:

$ sudo mkfs.ext4 /dev/sda3
[sudo] password for stew: 
mke2fs 1.42.11 (09-Jul-2014)
/dev/sda3 contains a btrfs file system
Proceed anyway? (y,n) y
/dev/sda3 is apparently in use by the system; will not make a filesystem here!
Run Code Online (Sandbox Code Playgroud)

sda3正在使用中。它如何以及为什么可能会被使用?

根据凯西的评论,mount 的输出:

mount | grep sd
/dev/sdb3 on / type btrfs (rw,noatime,ssd,discard,space_cache)
/dev/sda4 on /home type ext4 (rw,noatime,discard,data=ordered)
/dev/sda2 on /boot type ext2 (rw,relatime)
Run Code Online (Sandbox Code Playgroud)

根据沃里克的评论,卸载:

$ sudo umount /dev/sda3
umount: /dev/sda3: not mounted
Run Code Online (Sandbox Code Playgroud)

在其他地方挂载和卸载 sda3 成功,但没有任何改变。

更新:更可疑的行为:

$ mount | grep sd
/dev/sdb3 on / type btrfs (rw,noatime,ssd,discard,space_cache)
/dev/sda4 on /home type ext4 (rw,noatime,discard,data=ordered)
/dev/sda2 on /boot type ext2 (rw,relatime)
$ sudo mount /dev/sda3 mnt
[sudo] password for stew: 
$ mount | grep sd
/dev/sda3 on / type btrfs (rw,noatime,ssd,discard,space_cache)
/dev/sda4 on /home type ext4 (rw,noatime,discard,data=ordered)
/dev/sda2 on /boot type ext2 (rw,relatime)
/dev/sda3 on /home/stew/mnt type btrfs (rw,relatime,ssd,discard,space_cache)
Run Code Online (Sandbox Code Playgroud)

挂载 sda3 后,sdb3 不再是挂载程序。很奇怪吧?

根据 mikeserv:

$ rmmod btrfs
rmmod: ERROR: Module btrfs is in use
Run Code Online (Sandbox Code Playgroud)

这是非常预期的,因为 sdb3 是 btrfs 并且应该安装到 root。从我的 mkinitcpio.conf 文件:

MODULES=""
HOOKS="base udev autodetect modconf block filesystems keyboard fsck"
Run Code Online (Sandbox Code Playgroud)

ste*_*red 6

我想到了。我的引导加载程序没有正确配置。听起来很明显,对吧?修改 fstab 并不完全符合配置引导加载程序的条件。我不得不更改一行/boot/syslinux/syslinux.cgf以引用正确的引导分区。

也就是说,首先不需要从第二个磁盘启动。我本可以通过在实时环境中完成整个过程并 chroot 运行来避免这个问题mkinitcpio

  • 因此,您启动了 sda3,然后将 sdb3 挂载到了它的上面,这覆盖了 mtab 条目,因此挂载命令输出没有显示 sda3 的迹象。 (3认同)