使用以下命令在当前目录中安装磁盘映像时:
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 个链接。这就是删除某些内容时会发生的情况。指向它的所有链接都将被删除,因此操作系统可以删除这个特定的索引节点。