目录结构与文件系统


10

目录结构文件系统有什么区别?
Unix / Linux 目录文件系统如下所示:

以下两个目录显然我们知道目录。

  /home/abc/xyzdir1 --is a directory
  /home/abc/xyzdir2 -- is a directory

以下三个示例说明了文件系统。

/proc -- is a file system
/ -- is a file system
/bin -- is a file system

如何从上述代码片段中识别出文件系统目录是哪个?


文件系统包含一个或多个目录。每个目录都是文件系统的一部分(包括/proc//bin示例中的),因此我不清楚您如何识别“差异”。
roaima

@roaima请找到示例代码片段
Premraj 2015年

您的问题仍然模棱两可。/proc/并且/bin是目录。它们不是“文件系统”。您是否意味着要确定哪些目录也是其文件系统的安装点(根)?
roaima

Answers:


8

人们对文件系统的使用不太谨慎。在你的例子,我要说的是//bin/proc因为整个分区(如在文件系统/dev/sdb1)安装在这些目录。我的Arch Linux系统没有/bin文件系统,因此该示例并不完美,但是...

% ls -lid /proc /home /boot /
2 drwxr-xr-x  17 root root 4096 Feb 24 12:12 //
2 drwxr-xr-x   4 root root 4096 May 16 14:29 /boot/
2 drwxr-xr-x   5 root root 4096 Mar 14 18:11 /home/
1 dr-xr-xr-x 116 root root    0 May 16 17:18 /proc/

传统上,第2号索引节点是整个磁盘文件系统的“根”索引节点(这是该短语的其他用法)。//boot并且/home都具有索引号2,而/proc完全由内核提供并且不存在磁盘上,索引号为2。这些索引号指示整个磁盘文件系统或虚拟文件系统使用该名称挂载。

句子“ /home/abc/xyzdir1是目录”基本上意味着没有使用该名称挂载磁盘文件系统。如果ls -lid在目录上执行相同的命令,则会得到以下内容:

 % ls -lid /home/bediger/src
3670039 drwxr-xr-x 29 bediger bediger 4096 May 17 19:57 /home/bediger/src/

索引节点号3670039就是从安装在(在我的机器上)磁盘文件系统中分配的索引节点/home

您也可以通过调用mount命令来查找文件系统。它列出了所有已挂载的文件系统以及它们的挂载位置。


“ magic inode”数字特定于ext2系列文件系统。它不适用于大多数(全部?)其他文件,例如xfs或btrfs。
psusi

我会说//bin并且/proc是文件系统,因为整个分区...都安装在这些目录上。 对于/proc,这不是正确的,正如后面的答案所暗示的。
Max Nanasy 2015年

1
@MaxNanasy-普遍使用“文件系统”的两种含义(1.树形结构中目录的名称和排列; 2。文件和目录结构化数据的磁盘格式和布局,以及代码来维护和使用它),要想出一个既易于理解,又不能以循环方式定义且在技术上正确的术语,则很难。我选择易于理解,并使用“分区”代替了其他术语。我邀请您提出更正确的术语,我很茫然。
布鲁斯·埃迪格

4

冒着过于简化的风险,

  • 文件系统就像汽车的引擎和其他内部系统一样,
  • 目录结构就像您开车的地方的地图。

由于有人要求我再加一次

  • 文件系统就像音频/视频信号分发/传播的机制(实现细节):模拟RF广播,数字RF广播,电缆,Internet,录像带,视频磁盘等。
  • 目录结构类似于电视节目的内容,以及其分类,例如,分为喜剧,戏剧,新闻,纪录片,游戏节目,体育等。

如果您需要代码,请参阅“ 如何确定Linux文件系统是否属于正在运行的系统”(进行验证的部分)的答案的前半 部分root_dir。这就是布鲁斯所说的。确认它是目录,并检查其索引节点号是1还是2。


1
ELI5不错,但是您可以添加一个代码片段来回答如何识别文件系统和目录吗?
user1717828

4

从UNIX的角度看,我认为文件系统是一种实现目录树(目录结构)的方法,或更准确地说,是一种实现UNIX文件系统API的方法。根文件系统由一个特定的实现支持,并且每当您进入安装点目录时,您都会输入由不同内容支持的子树。

接口始终是相同的,但是在一种情况下,您在后端具有特定的磁盘分区,在另一种情况下,将有一个程序甚至从未写入存储设备。该proc文件系统将通过软件暴露出内核内部备份; 一个tmpfs将软件写入RAM,以及其他文件系统可能写入网络或其他地方进行备份。

用非UNIX的意义来说,文件系统是一种组织数据存储的方式。ext4btrfsfat,和ntfs在这个意义上的文件系统,而且在UNIXy意义上,它们实现的文件系统API。proc在这种范式更为有限的范式中,由于它不组织数据存储,因此不会被分类为文件系统。

TL; DR:

  • 目录结构/树=前端
  • 文件系统=后端

2

尽管在谈论文件系统时目录接受是明确的,但文件系统可能取决于您所谈论的内容而具有不同的含义。

在您的示例中,所有列出的路径都是目录,但是只有其中一些也是文件系统的安装点。

您可以使用该df命令了解给定文件或目录位于哪个文件系统上,以及mount在大多数Unix和Linux实现中使用该命令可以确定计算机上存在的文件系统,类型和安装点。例如:

$ df /proc
Filesystem     1K-blocks  Used Available Use% Mounted on
proc                   0     0         0    - /proc
$ mount | grep -w /proc
/proc is a file system of type proc

声明/bin是一个文件系统可疑,/bin几乎总是挂载在上/

$ df -k /bin
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda5      206292664 180687360  15103212  93% /
$ mount | grep -w /
/dev/sda5 on / type ext4 (rw,errors=remount-ro)

1

首先,对您对文件系统和目录的假设进行更正。文件系统包含一个或多个目录。使用你的例子,/proc//bin是目录。它们本身不是“文件系统”,但它们可能是其各自文件系统的根。

如果要确定哪些目录也是其文件系统的挂载点(根),则可以使用以下命令:

F="$PWD"    # The directory to be tested
if test -d "$F"
then
    echo "$F is a directory"
    test "X$(stat --format '%m' "$F")" = "X$PWD" && echo "$F is a mountpoint"
fi

1

文件系统是一种逻辑上组织和存储大量数据的方法,该系统易于管理。文件系统由文件,与其他文件的关系以及每个文件的属性(文件类型,文件名,文件大小,文件所有者,文件时间戳记)组成。

目录:例如,Unix文件系统实质上由文件和目录组成。目录是特殊文件,可能包含其他文件。最上面的目录是/(斜杠),其正下方的目录是系统目录。 在此处输入图片说明

/ Linux文件系统的根

/bin 二进制可执行文件保存在此处

/boot 引导相关文件保存在此处

/dev 设备文件保存在这里

/etc 系统范围的配置文件保存在此处

/home 普通用户主目录的位置

/lib64 二进制可执行文件的库保存在这里

/mnt DVD-Rom,USB闪存驱动器的临时安装点。

/opt此处安装了可选程序,例如Windows中的程序文件

/proc 内核伪文件系统

/root 超级用户root的主目录

/sbin 系统二进制可执行文件保存在此处

/tmp 临时文件保存在这里

/usr 用户文件系统

/var 变量文件保存在这里

/srv 是服务文件夹,包含此系统提供服务的特定于站点的数据。

src更多

以下两个目录是用户定义的目录:

 /home/abc/xyzdir1 --is a directory
 /home/abc/xyzdir2 -- is a directory

该图太过时了。FHS 3.0于2015年6月发布。还应注意,FHS仅适用于Linux发行版。
fpmurphy '17

1

如果您只需要一个命令来告诉您path是否是目录,请使用mountpoint(1)

对我来说,它打印

$ mountpoint /
/ is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint
$ mountpoint some-file
some-file is not a mountpoint

好消息是退出状态再次表示相同,因此您可以在脚本中使用它,如下所示:

if mountpoint "$foo" >/dev/null; then
  : do mountpoint stuff
elif [ -d "$foo" ]; then
  : do directory stuff
elif [ -e "$foo" ]; then
  : do file stuff 
else
  echo "$foo does not exist!" >/2
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.