挂载到当前目录时为什么不列出CD映像文件?

dan*_*jjl 3 ls filesystems mount

使用以下命令在当前目录中安装磁盘映像时:

sudo mount -o loop -t iso9660 wall.iso ./
Run Code Online (Sandbox Code Playgroud)

列出当前目录中的文件只会返回 wall.iso 。
要查看磁盘映像上的实际文件,我必须先cd退出目录,然后再返回。

注意:如果我已经知道 wall.iso 包含一个名为subdir的目录,那么即使强硬ls也没有列出我已经可以列出的目录cd subdir

为什么ls我第一次调用它时不返回文件?是否ls从仅在更改目录时更新的缓存中读取?

slm*_*slm 7

这是因为您位于要挂载的目录中。所以你仍然通过原始目录引用原始目录的内容。

当您cd进入然后被删除的目录时,您可以看到完全相同的效果。

$ pwd
/home/saml/dirtodel

$ rmdir ../dirtodel

$ pwd
/home/saml/dirtodel
Run Code Online (Sandbox Code Playgroud)

怎么可能?我仍然在刚刚删除的目录中。这是怎么回事?

在这仍然外壳cd/home/saml/dirtodel,运行此命令找出PID(进程ID)为它的会议庆典的:

$ echo $$
32619
Run Code Online (Sandbox Code Playgroud)

现在,如果您进入该 PID 的 /proc 目录,我们可以看到发生了什么:

$ ls -l /proc/32619/ | head -10
total 0
dr-xr-xr-x 2 saml saml 0 May 18 07:40 attr
-r-------- 1 saml saml 0 May 18 07:40 auxv
-r--r--r-- 1 saml saml 0 May 18 07:40 cgroup
--w------- 1 saml saml 0 May 18 07:40 clear_refs
-r--r--r-- 1 saml saml 0 May 18 02:06 cmdline
-rw-r--r-- 1 saml saml 0 May 18 07:40 comm
-rw-r--r-- 1 saml saml 0 May 18 07:40 coredump_filter
-r--r--r-- 1 saml saml 0 May 18 07:40 cpuset
lrwxrwxrwx 1 saml saml 0 May 18 07:31 cwd -> /home/saml/dirtodel (deleted)
Run Code Online (Sandbox Code Playgroud)

列出前几个文件,我们看到一个名为 的文件cwd,代表当前工作目录。请注意,它指向我们的旧名称并且它已被“删除”。

这让我们对正在发生的事情有了一些了解,但是我们在哪里?

有趣的是,如果我们cd /proc/32619/cwd可以将目录更改为这个神奇的位置。如果我们运行df .命令,我们可以看到我们仍然在/home分区上:

$ pwd
/proc/32619/cwd
[saml@grinchy cwd]$ df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_grinchy-lv_home
                      245G  125G  108G  54% /home
Run Code Online (Sandbox Code Playgroud)

发生什么了?

即使我们的目录已被删除,构成它的 inode 还没有被删除。你可以用stat命令看到这一点。在仍然在我们删除的目录中的 shell 中:

$ stat .
  File: `.'
  Size: 0           Blocks: 8          IO Block: 4096   directory
Device: fd02h/64770d    Inode: 10486487    Links: 0
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-05-18 07:48:52.674081972 -0400
Modify: 2013-05-18 07:48:44.378900038 -0400
Change: 2013-05-18 07:50:54.189747426 -0400
Run Code Online (Sandbox Code Playgroud)

我们可以看到仍然有一个 inode 10486487 正在被我们使用,但请注意它有 0 个链接。这就是删除某些内容时会发生的情况。到它的所有链接都被删除,因此操作系统可以删除这个特定的 inode。