BTRFS 問題 - 內容消失/重新出現?取決於掛載的子卷的兩個獨立版本的文件系統
最初的問題
因此,我將新 BTRFS 池的子卷安裝為
/home
. 我以為我在重新格式化舊驅動器以添加到池之前已將所有內容複製到其中,但在後來的檢查中,一些文件(我所有的多媒體)失去了。我辭職去重建收藏。後來,我執行了內置的“Baobob”磁碟使用實用程序。它顯示的內容
/mnt/wd
比預期的要多。我更仔細地看了看。/mnt/wd/home/$USER/multimedia
仍然有我所有的“失去”文件(而不是我~/multimedia
搬家後放入的文件)(BTRFS 系統的根目錄有 labelwd
)。回頭看
~/multimedia
,舊文件不在,新文件還在。失去文件之間的共性
最初失去的文件有一個共同點。在被複製到新驅動器之前,沒有失去的文件位於
ext4
以/home
. 那些都在ntfs
舊驅動器的一個分區上,掛載為/media/$USER/data
,符號連結從/home/$USER
. 那是為了適應我已經停止使用的雙引導。將所有內容複製到新卷時(使用rsync
,以防相關),我將所有文件放在一個子卷中,而不是將它們拆分並符號連結(mv
將一個目錄的內容連結到另一個目錄,在兩者之後rsync
s 已完成)。在確定該結果之前,我確實對子目錄進行了一些擺弄,但我最終只得到了一個子卷,盡我所能。在將新的子卷掛載為 之前/home
,這似乎可行。之後,view from/home
似乎與原始/home
分區匹配,view from/mnt/wd/home
似乎與合併版本匹配。初始配置/狀態
我
fstab
此時是:# <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/nvme0n1p5 during installation UUID=699ad207-3b40-4caa-9926-503830121327 / ext4 errors=remount-ro 0 1 # BTRFS pool UUID=24f6bbb6-cccb-4f12-808c-195f18b19e05 /home btrfs defaults,autodefrag,subvol=home 0 2 UUID=24f6bbb6-cccb-4f12-808c-195f18b19e05 /mnt/app_drive btrfs defaults,autodefrag,subvol=applications 0 2 UUID=24f6bbb6-cccb-4f12-808c-195f18b19e05 /mnt/snapshots btrfs defaults,autodefrag,subvol=snapshots 0 2 # Swap file /swapfile1 none swap sw 0 0
我還將 BTRFS 卷的根目錄掛載為
/mnt/wd
viasudo mount UUID=24f6bbb6-cccb-4f12-808c-195f18b19e05 /mnt/wd
。
sudo btrfs subvolume list .
從任何子卷(或根)的任何安裝位置執行:ID 638 gen 4492 top level 5 path home ID 639 gen 4433 top level 5 path applications ID 640 gen 4404 top level 5 path snapshots ID 800 gen 4402 top level 640 path snapshots/home_2017-07-06
但是
ls ./$USER/multimedia
(以及任何其他缺失的目錄)在 from/home
或 from執行時顯示完全不同的內容/mnt/wd/home
。qwertystop@dt /home $ ls $USER/multimedia pics unprepared qwertystop@dt /home $ cd /mnt/wd/home qwertystop@dt /mnt/wd/home $ ls $USER/multimedia 3d ml_resource music osu! phone-ready pics Unprepared vids
有沒有人知道這裡發生了什麼,或者我如何調和這兩者?我的想法是將所有內容從一個複製到另一個 - 但這仍然意味著我必須確保為每個新文件都這樣做,最好的情況。
進一步的實驗
快照
我嘗試製作快照。無論我使用哪個掛載點來創建快照,也無論我把它放在哪裡,它始終與 中找到的版本匹配
/mnt/wd/home
,而不是/home
. 我試過了:sudo btrfs subvolume snapshot /home /home/snapshot sudo btrfs subvolume snapshot /mnt/wd/home /mnt/snapshots/snapshot sudo btrfs subvolume snapshot /home /mnt/snapshots/snapshot
而且它們都是相同的。這是內部一致性的一個優點,但它沒有告訴我為什麼當我嘗試訪問任何文件時不一致仍然存在。
fstab
/安裝實驗:我嘗試
/mnt/wd
在我的 fstab 中安裝 BTRFS 根目錄(行是 ,放置/home
在行之前),而不是使用mount
. 我fstab
此時是:# <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/nvme0n1p5 during installation UUID=699ad207-3b40-4caa-9926-503830121327 / ext4 errors=remount-ro 0 1 # BTRFS pool UUID=24f6bbb6-cccb-4f12-808c-195f18b19e05 /mnt/wd btrfs defaults,autodefrag 0 2 UUID=24f6bbb6-cccb-4f12-808c-195f18b19e05 /home btrfs defaults,autodefrag,subvol=home 0 2 UUID=24f6bbb6-cccb-4f12-808c-195f18b19e05 /mnt/app_drive btrfs defaults,autodefrag,subvol=applications 0 2 UUID=24f6bbb6-cccb-4f12-808c-195f18b19e05 /mnt/snapshots btrfs defaults,autodefrag,subvol=snapshots 0 2 # Swap file /swapfile1 none swap sw 0 0
這沒有產生任何變化。
我嘗試過根本不安裝主子卷(註釋掉行)。然後,當我取消註釋該行並安裝時,生成的安裝驅動器與舊文件匹配,而不是新文件。所以我認為這可能會在啟動時出現問題?
/home``fstab``/home``/mnt/wd
“未更改”文件仍然存在分歧
兩個版本之間沒有失去的文件仍然由文件系統單獨跟踪。我看了
tail .bash_history
每一個,它們都不一樣。問題在於安裝點和子卷的組合?
我將子卷安裝
home
在/mnt/foo
(並在稍後重試/foo
)而不是/home
. 它與舊版本相匹配。我製作了子卷的快照,將home
其命名為newhome
,並將其安裝在/home
. 它匹配新版本(失去舊文件,呈現新文件)。我將一個新文件添加到僅在新版本中(仍在
newhome
)中的目錄之一。我改回安裝home
在/home
並重新啟動。文件不見了。改回 usingnewhome
,文件仍然存在。以其他順序執行相同操作(將其放入home
version 並檢查newhome
),並將文件放入沒有不同的目錄之一。結果是一樣的——文件只存在於它被放入的子卷中,並且只存在於新版本中(僅在掛載為時出現/home
,但每個版本都不一樣)。這排除了我的最新想法,即/home
無論出於何種原因,它將“安裝在安裝點的子卷”視為與我實際安裝的任何子卷不同的東西。我拿了一個不相關的子卷,為我的使用者名添加了一個子目錄,並將其安裝在
/home
. 結果是作業系統仍然辨識出我的使用者名/密碼,但重新生成了其中的所有配置文件和目錄,就好像我是一個新使用者一樣——它沒有/home
使用分區的“新版本” 。我想在這一點上我可以總結一下情況。這不能幫助我解決問題或確定原因。
tl;博士
名為“home”的子卷及其派生的快照實際上是兩個子卷,其中一個僅在掛載為 時出現
/home
,另一個在掛載到其他位置或作為 BTRFS 設備的根卷的子目錄可見時出現-水池。出於未知原因,兩者在不遲於我第一次將其掛載為 時發生了分歧,因此/home
掛載的版本/home
包含我已經 -ed 的舊/home
分區的內容rsync
,而掛載在其他任何地方的版本包含文件系統因為我在初始之後修改了它rsync
(用之前連結的文件替換了幾個符號連結到另一個分區)。我不知道為什麼會這樣。我可以確認,當不從“home”派生的子卷掛載為 時,不會發生這種情況
/home
,並且沒有複製“home”中的文件。我可以確認它確實發生在將一小部分文件複製到新子卷的情況下。我現在將測試複製所有文件,cp
而不是製作快照。這很奏效,但有一點可能會指出問題所在。當我嘗試
cp -a --reflink=always ./*
從新/home/qwertystop
的主子卷轉換時,每個文件都收到一條錯誤消息:“跨設備連結無效。” 相對於 執行相同的命令時,這沒有出現/mnt/wd/home/qwertystop
。**問題似乎是由電腦將一個安裝位置讀取為與另一個安裝位置位於不同的設備上引起的、由其引起或以其他方式相關的。**我想,這在技術上是可行的——它是由三個不同設備組成的 BTRFS 池。當我切換到從
/mnt/wd/home
版本中複製出來時,它最初似乎可以工作,但輕量級的使用很快發現重複出現在新的子卷中和舊的子卷中一樣。
我已經解決了這個問題,儘管沒有解決為什麼它是一個問題或最初的分歧來自哪裡的相關問題。
當我將我的主目錄複製到一個新的子卷,但沒有複製 /home/.ecryptfs 時,複製停止了。因此,重複似乎是由 .ecryptfs 以某種方式引起的。我不確定這是否是我不知道的某些系統的錯誤或預期行為。
請注意,您已禁用安裝系統的加密。
ecryptfs 是一個堆疊文件系統。它可以在登錄時安裝 - 即在使用者輸入他們想要加密數據的密碼時。
findmnt
(或mount
)將顯示ecryptfs
安裝在的類型的文件系統/home/$USER
。寫入的文件/home/$USER/
由 ecryptfs 加密,然後儲存在某個位置/home/.ecryptfs/$USER/
(即 btrfs)。這只是一種可能的 ecryptfs 設置;還有其他的安排方式。請不要挑剔以上描述,因為我從未使用過它。您可以在此處找到社區提供的文件:
https://help.ubuntu.com/community/EncryptedHome#Encrypted_Home
這應該可以解釋為什麼當您使用安裝在 的 btrfs 卷登錄
/home
並查看您的主目錄時看到一些不同的文件,與安裝在時在相同 btrfs 卷/home/$USER
的目錄中看到的文件相比。$USER/``/mnt
“無效的跨設備連結。” 執行與 /mnt/wd/home/qwertystop 相關的相同命令時,不會出現這種情況。問題似乎是由電腦將一個安裝位置讀取為與另一個安裝位置位於不同的設備上引起的、由其引起或以其他方式相關的。
恐怕“跨設備連結”是用詞不當。它實際上是一個跨文件系統連結。您不能將 btrfs 文件系統中的文件硬連結或引用連結到 ecryptfs 文件系統,反之亦然。
我嘗試製作快照。無論我使用哪個掛載點來創建快照,無論我把它放在哪裡,它總是與 /mnt/wd/home 中的版本匹配
您現在應該也可以看到這是如何發生的。
警告:在您仍然登錄並安裝 ecryptfs 時恢復快照或以其他方式弄亂備份儲存,聽起來非常令人擔憂。相反,您可以啟用 root 使用者或使用未加密的主目錄創建一個特殊的管理員使用者帳戶,並在需要恢復 /home 的快照時使用它。