Filesystems

將 home 的子目錄掛載到自己的分區上會混淆磁碟使用情況報告

  • December 26, 2017

一、情況

1.1 設備

我的文件系統有以下安排

  • /dev/sda8323 GiB 安裝到**/home**
  • /dev/sda1390 GiB 安裝到**/home/user2/storage**

其初衷是將 /home/user2/storage 的命運與所有其他人的命運分開。兩者都是邏輯分區。lsblk下面引用。

1.2 安裝

/etc/fstab掛載指令用行編碼

UUID=[that of /dev/sda8]  /home/  ext4  defaults 0 2
UUID=[that of /dev/sda13] /home/user2/storage  ext4  defaults 0 2

坦率地說,我抄襲了其他安裝指令的最後一行。此外,/etc被掛載到另一個分區。mount下面引用了的輸出。

  1. 證據 =====

這種安排對系統工具報告磁碟使用情況的方式產生了一些副作用。

因此,我不太確定我應該信任哪些診斷程序,以及我實際上可以依靠多少磁碟空間。

請注意,在電腦中有一個user1和一個user2

2.1 從df看/dev/sda13(儲存)

使用df user1 或 user2 給出

  • df -h完全沒有輸出/dev/sda13
  • df -ha只顯示-磁碟使用情況/dev/sda13

如果 user2 已經登錄(並且儲存目錄已經掛載)

  • sudo df -h /dev/sda13(storage) 顯示與 (home)相同的磁碟使用情況(例如 300 GiB)df -h /dev/sda8,儘管它們是不同的實體,並且使用的大小對於儲存來說是不可能的

別的

  • sudo df -h /dev/sda13(儲存)顯示 0.5 GiB 的適度磁碟使用量,我可以將其視為 user1

2.2 從 gparted 看到的 /dev/sda13(儲存)

然後,當我啟動時gparted,使用的大小會根據我是以 user1 還是 user2 身份登錄而有所不同。

報告的值對於 user2(誰應該訪問儲存)看起來不錯,而不是對於 user1(誰不應該從儲存中探勘)。但是,我曾期望無論我是誰,使用者都可以獲得公平的資訊。為了更好地衡量,gparted 報告的值都與任何 df 不重合。

旁注:關於/dev/sda8(家)的報導在各個方面都是一致的。

  1. 問題 =====

我確信這種看似不一致的行為背後是有邏輯的。

  • 有人能解釋一下嗎?
  • 是否有任何跡象表明可以乾淨利落地實施這種文件系統安排,以便報告是公平的?

4.1 附加資訊

4.2 sudo df -h(user1,2)的輸出

這是使用者 1 的輸出

udev                          5,9G  8,0K  5,9G   1% /dev
tmpfs                         1,2G  1,3M  1,2G   1% /run
/dev/sda6                      48G  5,1G   41G  12% /
none                          4,0K     0  4,0K   0% /sys/fs/cgroup
none                          5,0M     0  5,0M   0% /run/lock
none                          5,9G  380K  5,9G   1% /run/shm
none                          100M   64K  100M   1% /run/user
/dev/sda9                      26G   23G  1,7G  94% /opt
/dev/sda11                     20G   11G  8,1G  57% /usr
/dev/sda12                    2,0G  1,2G  636M  66% /boot
/dev/sda8                     314G  298G  4,9G  99% /home
/dev/sda10                    4,8G  2,9G  1,7G  64% /var
/home/user1/.Private          314G  298G  4,9G  99% /home/user1

當 user2 登錄時,最後一行被替換或補充

/home/user2/.Private          314G  298G  4,9G  99% /home/user2

4.2 輸出sudo lsblk

NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda       8:0    0 698,7G  0 disk 
├─sda1    8:1    0   100M  0 part 
├─sda2    8:2    0  41,1G  0 part 
├─sda3    8:3    0     1K  0 part 
├─sda5    8:5    0   145G  0 part 
├─sda6    8:6    0  48,6G  0 part /
├─sda7    8:7    0   2,1G  0 part 
├─sda8    8:8    0 322,8G  0 part /home
├─sda9    8:9    0    22G  0 part /opt
├─sda10   8:10   0     5G  0 part /var
├─sda11   8:11   0    20G  0 part /usr
├─sda12   8:12   0     2G  0 part /boot
└─sda13   8:13   0    90G  0 part 
sr0      11:0    1  1024M  0 rom 

4.3 輸出sudo mount

/dev/sda6 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/cgroup type tmpfs (rw)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
none on /sys/fs/pstore type pstore (rw)
/dev/sda11 on /usr type ext4 (rw)
/dev/sda12 on /boot type ext4 (rw)
/dev/sda8 on /home type ext4 (rw)
/dev/sda9 on /opt type ext4 (rw)
/dev/sda10 on /var type ext4 (rw)
/dev/sda13 on /home/user2/storage type ext4 (rw)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
rpc_pipefs on /run/rpc_pipefs type rpc_pipefs (rw)
systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)
nfsd on /proc/fs/nfsd type nfsd (rw)
/home/user1/.Private on /home/user1 type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=...,ecryptfs_fnek_sig=...)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=user1)

4.4 輸出sudo findmnt

TARGET   SOURCE FSTYPE OPTIONS
/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000

4.5 groups(user1,2)的輸出

user1 adm cdrom sudo dip plugdev lpadmin sambashare common

user2 sudo common
  1. Retrospection ================

@sourcejedi 在下面提供了一個有用的答案

發生的情況是sda8目錄storage/的內容一直保存為/home/user2/storage,無論user1還是user2登錄,都在user2登錄時掛載到sda13。說storage/包含100G,那麼100G是總是在 /dev/sda8 中使用,有時在 /dev/sda13 中使用。

我通過從 /etc/fstab 文件中將 /dev/sda13 掛載到全新的 /home/storage 上發現了這一點:我以 user2 身份登錄,所有文件仍在 /dev/sda8 中的 /home/user2/storage 中。因此,我將文件移動到分區 sda13 中的一個目錄,並按照建議從 /home/user2 內部使用符號連結引用了這樣一個目錄。

通過這種方式,我在 sda8 中釋放了那些 100G,並且df -h /dev/sda13無論我是 user1 還是 user2,都有一個關於儲存大小的可靠報告。

我相信,無論使用者如何,文件 /etc/fstab 都會執行,因此我認為分區總是掛載的。

是的,但是與使用 ecryptfs 存在互動。fstab 在引導時處理。在您輸入解密密碼後,ecryptfs 掛載會在登錄時啟動。例如,問題中顯示的 ecryptfs 掛載將掩蓋 上的任何現有掛載/home/user1findmnt請注意,當您使用推薦的工具來顯示掛載的層次結構時,這會更加明顯。(mount不過,對於獲取完整的掛載選項列表,輸出更簡單)。

因此,您需要將儲存文件系統掛載到任何使用者的主目錄之外。請注意,您的主目錄之外的文件不會被加密,除非您手動確定如何加密。如果需要,您可以創建指向它的符號連結(例如ln -s /storage /home/user2/storage)。它現在的設置方式沒有任何意義,並且也可能破壞其他事情(我對關機時解除安裝的順序持懷疑態度)。

請注意,這個問題已經難以分析,因為它缺少df命令的完整輸出。還有另一個角落案例,df /dev/sda1它將顯示/devifsda1未安裝的用法。如果你看strace df /dev/sda8,你會看到它沒有訪問設備節點;它從掛載中查找目錄,然後呼叫statfs("/home", ...). 我寧願自己跑df -h /home

…儘管如此,當存在這樣的過度安裝的文件系統時,我不一定期望輸出會不會那麼混亂。sda13的遺漏或-結果(取決於-a選項)表明df有一些程式碼可以檢測超載情況,但並非在所有情況下都有效。編輯:報告上游

引用自:https://unix.stackexchange.com/questions/370043