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

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

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

sudo mount -o loop -t iso9660 wall.iso ./

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

注意:如果我已经知道 wall.iso 计数了一个名为子目录,甚至很难ls列出我已经可以列出的目录cd subdir

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

答案1

这是因为您位于要安装的目录中。因此,您仍然通过原始目录引用原始目录的内容。

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

$ pwd
/home/saml/dirtodel

$ rmdir ../dirtodel

$ pwd
/home/saml/dirtodel

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

cd在仍为的shell 中/home/saml/dirtodel,运行以下命令来查找 bash 会话的 PID(进程 ID):

$ echo $$
32619

现在,如果您进入该 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)

列出前几个文件,我们看到一个名为 的文件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

发生什么了?

尽管我们的目录已被删除,但组成它的索引节点却没有被删除。您可以使用命令看到这一点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

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

相关内容