ディレクトリ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 foo
がfoo
のリストの横に+
を表示していて、表示し続けているのでしょうか。
私はext4fsでUbuntu16.04を使用しており、今日の時点で最新のアップデートがあります。
[〜#〜] edit [〜#〜]:ファイルシステムはbtrfsであり、ext4fsではありません。これは、ホストの/var/lib/lxd
にマウントしている外付けUSBハードドライブです。
私の賭けは、あなたのディレクトリが実際にはbtrfsサブボリュームであるということです。私はテストをしました。テストサブボリュームをrm
しようとすると、「操作が許可されていません」というメッセージが表示されます。
私が正しければ、あなたのケースでは次のことがうまくいくはずです。
Sudo btrfs subvolume delete foo
ディレクトリがすでに空になっていることは承知していますが、通常は事前に空にする必要があります。
サブボリュームは、独自の独立したファイル/ディレクトリ階層を持つファイルシステムの一部です。サブボリュームはファイルエクステントを共有できます。
詳細については、 btrfs wiki をご覧ください。通常のディレクトリの代わりにサブボリュームを作成する主な理由は次のとおりです。
/
);私の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 @
その後、再起動します。システムが復元されます。