web-dev-qa-db-ja.com

`chattr -i`の後でも、ディレクトリを` root`として削除することはできません

ディレクトリfooを削除しようとしていますが、試すことがまったくできません。

注:rmのLxDコンテナーを削除することは想定されていませんが、このディレクトリの内容を以前に台無しにしていたので、今はrmを使用しても問題ありません。)

以下に注意してください。fooの親(つまり、containersディレクトリ)には書き込み権限があります。

[root@box /var/lib/lxd]$ ls -l
drwx--x--x 1 root root    74 Dec 24 09:09 containers
    <snip>

[root@box /var/lib/lxd]$ cd containers/
[root@box /var/lib/lxd/containers]$ ls -l
    <snip>
drwxr-xr-x+ 1 231072 231072     0 Dec 24 09:13 foo

[root@box /var/lib/lxd/containers]$ ls -l foo
total 0

[root@box /var/lib/lxd/containers]$ lsattr 
    <snip>
---------------- ./foo

[root@box /var/lib/lxd/containers]$ lsattr -d foo
---------------- foo

[root@box /var/lib/lxd/containers]$ /bin/rm -rf foo
/bin/rm: cannot remove 'foo': Operation not permitted

[root@box /var/lib/lxd/containers]$ chattr -R -ia foo
[root@box /var/lib/lxd/containers]$ lsattr -d foo
---------------- foo

[root@box /var/lib/lxd/containers]$ /bin/rm -rf foo
/bin/rm: cannot remove 'foo': Operation not permitted

[root@box /var/lib/lxd/containers]$ ls -l
    <snip>
drwxr-xr-x+ 1 231072 231072     0 Dec 24 09:13 foo

chown -R root.root fooでさえ役に立ちません!

驚くべきことに、lsattrは、fooコマンドの開始時と後続の両方で、chattrに追加の属性が設定されていないことを示しています。では、なぜls -l foofooのリストの横に+を表示していて、表示し続けているのでしょうか。

私はext4fsでUbuntu16.04を使用しており、今日の時点で最新のアップデートがあります。

[〜#〜] edit [〜#〜]:ファイルシステムはbtrfsであり、ext4fsではありません。これは、ホストの/var/lib/lxdにマウントしている外付けUSBハードドライブです。

3
Harry

私の賭けは、あなたのディレクトリが実際にはbtrfsサブボリュームであるということです。私はテストをしました。テストサブボリュームをrmしようとすると、「操作が許可されていません」というメッセージが表示されます。

私が正しければ、あなたのケースでは次のことがうまくいくはずです。

Sudo btrfs subvolume delete foo

ディレクトリがすでに空になっていることは承知していますが、通常は事前に空にする必要があります。


要求に応じた詳細な説明:

サブボリュームは、独自の独立したファイル/ディレクトリ階層を持つファイルシステムの一部です。サブボリュームはファイルエクステントを共有できます。

詳細については、 btrfs wiki をご覧ください。通常のディレクトリの代わりにサブボリュームを作成する主な理由は次のとおりです。

  • サブボリュームは、独自のオプションを備えた別個のファイルシステムであるため、マウントできます(比較:バインドマウントを使用して通常のディレクトリをマウントできますが、すでにマウントされているファイルシステム内に存在する必要があります。btrfsサブボリュームはルートファイルシステムとして簡単にマウントできます/);
  • 最初にすべてのファイルエクステントをソースサブボリュームと共有する別個のサブボリュームであるサブボリュームスナップショットを作成することができます。

実例:

私のbtrfsファイルシステムには次の内部構造があります(この構造はシステムから見たディレクトリ構造とは異なることに注意してください。マウントポイントは後者に属します)。

/                        # btrfs root filesystem mounted as /mnt/ssd/
  @                      # a subvolume I use as the root filesystem (mounted as /)
  @backups
    @-20161215-1-working # a snapshot of @ just in case

私のシステムをいじりたいとしましょう。予防策として、最初にスナップショットを作成します。

cd /mnt/ssd/@backups
Sudo btrfs subvolume snapshot ../@ @-20161224-1-just_in_case

私は自分の作業システム内からそれを行い、時間はかかりません。最初はディスクスペースも必要ありません。追加のスペースは、対応するファイルとディレクトリツリーが異なり始めたときに割り当てられます。

次に、@サブボリューム内にあるシステムを壊すこともできます。 @backups/@-20161224-1-just_in_caseサブボリュームが無傷である限り、何も起こらなかったかのように@をこのバックアップに置き換えることができます。最悪の場合、それを行うにはライブディストリビューションから起動する必要があります。しかし、ブートローダー(GRUB2)がまだ機能する場合は、ブート時にそのエントリを編集し、ルートファイルシステムとして@backups/@-20161224-1-just_in_caseサブボリュームの代わりに@を一時的に使用できます。次に、再び機能するシステム内から、次のことを行います。

cd /mnt/ssd/
Sudo btrfs subvolume delete @  # I may have to empty it first
Sudo btrfs subvolume snapshot @backups/20161224-1-just_in_case @

その後、再起動します。システムが復元されます。

4