web-dev-qa-db-ja.com

「マウント」のエラー:「システムコールに失敗しました:ファイルが存在します。」

Lvmスナップショットデバイスをマウントしようとすると、エラーが発生します。

$ Sudo mount -o loop /dev/mapper/matrix-snap--of--core /home/me/mountpoint
mount: /home/me/mountpoint: mount(2) system call failed: File exists.
  • 「ファイルが存在する」とは何ですか。私に伝えようとしているエラー?
  • Lvmスナップショットデバイスをマウントするにはどうすればよいですか?

前回チェックしたのは2018年10月でしたが、mountコマンドは「以前は常に機能していました」。同様のエラーが 年前の質問 で発生しました。ただし、エラーメッセージは少し異なり、2019年になりました…


これはlsblkの私の出力です。

NAME                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                             8:0    0 465.8G  0 disk  
└─sda1                          8:1    0 465.8G  0 part  
  └─core                      254:0    0 465.8G  0 crypt 
    ├─matrix-swapvolume       254:1    0     4G  0 lvm   [SWAP]
    └─matrix-core-real        254:3    0 461.8G  0 lvm   
      ├─matrix-core           254:2    0 461.8G  0 lvm   /
      └─matrix-snap--of--core 254:5    0 461.8G  0 lvm   
sdb                             8:16   1  59.5G  0 disk  
└─matrix-snap--of--core-cow   254:4    0  59.5G  0 lvm   
  └─matrix-snap--of--core     254:5    0 461.8G  0 lvm   

Parabola Linuxを実行していますが、システムは最新です。論理ボリューム/dev/matrix/corebtrfsを使用していますが、これはエラーと関係があると思われます。これはuname -rvsの私の出力です。

Linux 5.2.5-gnu-1 #1 SMP PREEMPT Sun Aug 4 02:02:20 UTC 2019
2
k.stm

(LVMスナップショットデバイスは元のディスクデバイスと同じくらい良いので、なぜ_-o loop_マウントオプションを使用しているのかわかりません。)

「ファイルが存在します」は、errno値17、またはEEXISTの標準の英語テキストで、_#include <errno.h>_で名前が付けられています。

そのエラー結果はmount(2)システムコールでは文書化されていないため、ソースコードを少し読む必要があります。

elixir.bootlin.comのLinuxカーネル相互参照 は、カーネルコードでEEXISTが使用されているすべての場所を一覧表示できます。 btrfsファイルシステムをループマウントしようとしているため、関連する可能性がある場所は次のとおりです。

  • _drivers/block/loop.c_、ループデバイス管理に関連
  • _fs/btrfs/super.c_、btrfsファイルシステムをマウントするときに使用されます。

_drivers/block/loop.c_では、すでに使用されている特定のループデバイスを割り当てようとすると、EEXISTエラーが生成されます(例:_mount -o loop=/dev/loop3 ..._および_/dev/loop3_はすでに使用されています) 。しかし、mountコマンドで何かが競合状態を引き起こしていない限り、ここでは問題になりません。

_fs/btrfs/super.c_には、実際には、エラーコードをエラーメッセージに変換するためのbtrfs固有の関数があります。 EEXISTを_Object already exists_に変換します。

あなたはすでにマウントされているbtrfsファイルシステムのクローンのように見えるものをマウントしようとしているので、それは実際に理にかなっています:歴史的に、これはbtrfsを混乱させるために使用されました(賢明に)ある時点で追加されました。

btrfsの組み込みスナップショット機能で作成されたスナップショットとは対照的に、これはLVMレベルスナップショットのように見えるので、 Originファイルシステムがマウントされているときにマウントしたい場合は、スナップショットをクローンファイルシステムのように扱います。実際の1:1クローンではなく、LVMだけがスナップショットであることを「認識」します。したがって、元のシステムと同じシステムにマウントする必要がある場合は、スナップショット/クローンファイルシステムのメタデータUUIDを変更する必要があります。

警告:btrfsの経験があまりないので、以下の記述は間違っているか不完全かもしれません。

カーネルが5.0より新しいため、_btrfstune -m /dev/mapper/matrix-snap--of--core_を使用して変更を加えることができます。そうでない場合は、ファイルシステムスーパーブロックの_btrfstune -u /dev/mapper/matrix-snap--of--core_フィールドだけでなく、すべてのファイルシステムメタデータを更新する必要があるため、速度が遅くなる_metadata_uuid_を使用する必要があります。

4
telcoM

エラーは、デバイスがすでに別の場所にマウントされている場合に発生します。最初にアンマウントする必要があります。次に、新しいマウントを作成します。

0