[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ A ] [ B ] [ C ] [ D ] [ 下一页 ]


Debian 教程(已过时文档)
第 16 章 - 高级主题


(高级主题应该放在这里吗?我认为加入一些高级主题会很好,这样可以向人们展示一些可能性,并给出一些概念性的解释,这些内容在参考手册中是找不到的。而且,能看到一个名为“高级主题”的章节总是让人感觉很好。提升新手们的自信心。:)


16.1 Shell 脚本入门


16.1.1 为什么及是什么

自动化简单的任务。


16.1.2 一个简单的例子

有什么想法吗?


16.2 高级文件


16.2.1 文件的真实本质:硬链接和 inode

系统上的每个文件都由一个 inode(信息节点,Information Node 的缩写,发音为 "eye-node")表示:inode 包含有关该文件的所有信息。但是,inode 不是直接可见的。相反,每个 inode 通过一个或多个硬链接链接到文件系统。硬链接包含文件名和 inode 编号。inode 包含文件本身,即存储在磁盘上的信息的位置、其访问权限、文件类型等等。系统一旦拥有 inode 编号,就可以找到任何 inode。

单个文件可以有多个硬链接。这意味着多个文件名指向同一个文件(也就是说,它们与相同的 inode 编号相关联)。但是,您不能跨文件系统创建硬链接:对特定文件(inode)的所有硬链接必须位于同一文件系统上。这是因为每个文件系统都有自己的 inode 集合,并且文件系统之间可能存在重复的 inode 编号。

由于指向给定 inode 的所有硬链接都指向同一个文件,因此您可以通过一个名称引用该文件来对其进行更改,然后在通过另一个名称引用它时查看这些更改。尝试以下操作

  1. cd; echo "hello" > firstlink

    cd 到您的主目录并创建一个名为 firstlink 的文件,其中包含单词“hello”。您实际上所做的是重定向 echo 的输出(echo 只是将您提供给它的内容回显出来),并将输出放入 firstlink 中。有关完整说明,请参阅有关 shell 的章节。

  1. cat firstlink

    确认 firstlink 的内容。

  1. ln firstlink secondlink

    创建一个硬链接:secondlink 现在指向与 firstlink 相同的 inode。

  1. cat secondlink

    确认 secondlinkfirstlink 相同

  1. ls -l

    请注意,为 firstlinksecondlink 列出的硬链接数为 2。

  1. echo "change" >> secondlink

    这是另一个 shell 重定向技巧 - 不用担心细节。我们已将单词“change”追加到 secondlink。使用 cat secondlink 确认这一点。

  1. cat firstlink

    firstlink 也追加了单词“change”!这是因为 firstlinksecondlink 指向同一个文件。当您更改它时,您称它为什么并不重要。

  1. chmod a+rwx firstlink

    更改 firstlink 上的权限。执行 ls -l 以确认 secondlink 上的权限也已更改。这意味着权限信息存储在 inode 中,而不是链接中。

  1. rm firstlink

    删除此链接。这是 rm 的一个微妙之处 --- 它实际上删除的是链接,而不是文件。现在键入 ls -l 并注意 secondlink 仍然存在。另请注意,secondlink 的硬链接数已减少到 1。

  1. rm secondlink

    删除另一个链接。当没有指向某个文件的链接时,Linux 会删除该文件本身,即其 inode。

所有文件的工作方式都如此 --- 即使是特殊类型的文件,例如设备(例如 /dev/hda)。

目录只是文件名和 inode 编号的列表,即硬链接的列表。当您创建硬链接时,您只是向目录添加一个名称-数字对。当您删除文件时,您只是从目录中删除一个硬链接。


16.2.2 文件类型

到目前为止,我们一直隐藏的一个细节是,Linux 内核几乎将所有内容都视为文件。这包括目录和设备:它们只是特殊类型的文件。

您可能还记得,ls -l 显示的第一行字符表示文件类型。对于普通文件,这将只是 -。其他可能性是


16.2.2.1 符号链接

符号链接(也称为 symlink 或软链接)是除硬链接之外的另一种链接。符号链接是一个特殊文件,它“指向”任何已挂载文件系统上的硬链接。当您尝试读取符号链接的内容时,它会给出它指向的文件的内容,而不是符号链接本身的内容。由于目录、设备和其他符号链接都是文件类型,因此您可以将符号链接指向任何这些内容。

因此,硬链接是文件名和 inode 编号。文件实际上是一个 inode:磁盘上的位置、文件类型、权限模式等。符号链接是一个包含硬链接名称的 inode。符号链接将一个文件名与第二个文件名配对,而硬链接将文件名与 inode 编号配对。

指向同一文件的所有硬链接都具有相同的状态。也就是说,一个与另一个一样好;如果您对一个执行任何操作,就像对其他任何一个执行该操作一样。这是因为硬链接都指向同一个 inode。另一方面,对符号链接的操作有时会影响符号链接自己的 inode(包含硬链接名称的 inode),有时会影响指向的硬链接。

符号链接和硬链接之间存在许多重要区别

尝试以下操作

  1. cd; ln -s /tmp/me MyTmp

    cd 到您的主目录。ln-s 选项创建一个符号链接;在本例中,一个名为 MyTmp 的链接,它指向文件名 /tmp/me

  1. ls -l MyTmp

    输出应如下所示

         lrwxrwxrwx   1 havoc    havoc           7 Dec  6 12:50 MyTmp -> /tmp/me
    

    当然,日期和用户/组名称对您来说会有所不同。请注意,文件类型为 l,表示这是一个符号链接。另请注意权限 - 符号链接始终具有这些权限。如果您尝试 chmod 符号链接,您实际上会更改指向的文件的权限。

  1. chmod 700 MyTmp

    您将收到“没有这样的文件或目录”错误,因为文件 /tmp/me 不存在。请注意,您仍然可以创建一个指向它的符号链接。

  1. mkdir /tmp/me

    创建目录 /tmp/me

  1. chmod 700 MyTmp

    现在应该可以工作了。

  1. touch MyTmp/myfile

    MyTmp 中创建一个文件。

  1. ls /tmp/me

    该文件实际上是在 /tmp/me 中创建的。

  1. rm MyTmp

    删除符号链接。请注意,这会删除链接,而不是它指向的内容。因此,您使用 rm 而不是 rmdir

  1. rm /tmp/me/myfile; rmdir /tmp/me

    清理工作。


16.2.2.2 设备文件

设备文件指向系统上的物理或虚拟设备,例如您的硬盘、显卡、屏幕或键盘。虚拟设备的一个示例是由 /dev/console 表示的控制台。

有两种设备:字符设备可以一次访问一个字符,也就是说,可以写入或读取设备的最小数据单位是一个字符(字节)。

块设备必须以称为块的较大单位进行访问,块包含多个字符。您的硬盘是一个块设备。

您可以像从其他类型的文件一样读取和写入设备文件,尽管该文件很可能包含一些奇怪的、人类无法理解的胡言乱语。将随机数据写入这些文件可能是一个坏主意。但有时它很有用:例如,您可以将 postscript 文件转储到打印机设备 /dev/lp0 中,或者将调制解调器命令发送到相应串行端口的设备文件。


16.2.2.2.1 /dev/null

/dev/null 是一个特殊的设备文件,它会丢弃您写入它的任何内容。如果您不想要某些东西,请将其放入 /dev/null 中。它本质上是一个无底洞。如果您读取 /dev/null,您会立即获得文件结束 (EOF) 字符。/dev/zero 类似,只是如果您从中读取,您会获得 \0 字符(与数字零不同)。


16.2.2.3 命名管道 (FIFO)

命名管道是一个像管道一样工作的文件。您将某些东西放入该文件中,它会从另一端出来。因此它被称为 FIFO,或先进先出:您放入管道中的第一件事是第一个从另一端出来的东西。

如果写入命名管道,写入管道的进程不会终止,直到写入的信息被从管道中读取。 如果从命名管道读取,读取进程会等待直到有内容可读才会终止。 管道的大小始终为零 --- 它不存储数据,只是像 shell 的 | 一样连接两个进程。 然而,由于这个管道有一个名称,这两个进程不必在同一命令行上,甚至不必由同一用户运行。

你可以通过执行以下操作来尝试它:

  1. cd; mkfifo mypipe

    创建管道。

  1. echo "hello" > mypipe &

    将一个进程放入后台,尝试将 "hello" 写入管道。 请注意,该进程不会从后台返回;它正在等待有人从管道读取。

  1. cat mypipe

    此时,echo 进程应该返回,因为 cat 从管道读取了数据,并且 cat 进程将打印 hello

  1. rm mypipe

    你可以像删除任何其他文件一样删除管道。


16.2.2.4 套接字

套接字类似于管道,只是它们通过网络工作。 这是你的计算机进行联网的方式:你可能听说过 "WinSock",它是 Windows 的套接字。

我们不会深入讨论这些,因为除非你在编程,否则你可能没有机会使用它们。 但是,如果在你的计算机上看到一个标记为类型 s 的文件,你就知道它是什么了。


16.2.3 proc 文件系统

Linux 内核提供了一个特殊的的文件系统,它被挂载在 Debian 系统上的 /proc 下。 这是一个“伪文件系统” --- 它实际上并不存在于任何物理设备上。

proc 文件系统包含有关系统和运行进程的信息。 /proc 中的一些“文件”对人类来说相当容易理解(尝试输入 cat /proc/meminfocat /proc/cpuinfo),而另一些则是神秘的数字集合。 通常,系统实用程序使用这些来收集信息并以更易于理解的方式呈现给你。

当人们注意到一个特别的文件 --- /proc/kcore --- 时,他们经常会感到恐慌,因为它通常非常大。 这(或多或少)是你计算机内存内容的副本。 它用于调试内核。 它实际上并不存在于任何地方,所以不要担心它的大小。

如果你想了解 /proc 中的所有内容,请键入 man 5 proc


16.2.4 文件权限的高级方面


16.2.4.1 使用数字参数与 chmod

在本章前面,我们简要提到你可以使用数字设置文件权限。 数字表示法被称为绝对模式,与符号表示法(例如,u+rx)相反,后者通常被称为相对模式。 这是因为数字指定要设置的确切模式,而符号只是指定要进行的更改(例如,“添加用户读取和执行权限”)。

数字模式是一系列四个八进制数字或十二个二进制数字。 每个八进制(以 8 为基数)数字代表三个二进制数字:一个八进制数字和三个二进制数字是表示十进制数字 0 到 7 的两种方式。

推导特定模式非常简单。 你只需将要组合的模式相加,或者减去不想要的模式。 例如,只有读取权限打开的用户权限在二进制中为 100。 仅具有写入权限的用户权限在二进制中为 010。 读取和写入都打开的用户权限将是 100 + 010 = 110。 或者,你可以将其放入八进制中:4 + 2 = 6

对于完整模式,只需将此表中的数字相加

     0001        others, execute
     0002        others, write
     0004        others, read
     0010        group, execute
     0020        group, write
     0040        group, read
     0100        user, execute
     0200        user, write
     0400        user, read
     1000        sticky bit
     2000        set group id
     4000        set user id

要使用该表,首先确定要设置的权限。 然后将这些权限的数字相加。 总计是你的模式。 例如,要获得模式 0755

       0001   o=x
       0004   o=r
       0010   g=x 
       0040   g=r
       0100   u=x
       0200   u=w
     + 0400   u=r
     -------
       0755  u=rwx go=rw

实际上,你只需调用此模式 755,而无需前导 0,因为 chmod 会自动在模式的开头添加零 --- 7 表示模式 0007

要将文件设置为 755,你需要键入 chmod 755 myfile

755 是目录非常常见的模式,因为它允许任何人使用该目录,但只有所有者才能在该目录中创建和删除文件。 644 是文件的类似模式,它也很常见。 它允许任何人使用该文件,但只有所有者才能更改它。 对于可执行文件,755 是一种常见模式;这只是 644 加上执行权限(644 + 111 = 755)。


16.2.5 chattr

一个有用的提示?


16.2.6 大规模复制

cp -a 以及主题的变体。

如何将旧系统复制到新系统。

FIXME 哎呀,我也在备份工具下列出了这个主题。 需要决定。


16.2.7 其他尚未涵盖但应该涵盖的概念

fsck、dd、fdisk 等。

文件位于哪个包中?

MSDOS vs. Mac vs. Unix 文本文件

sync


16.3 编译内核

如何、什么以及为什么


16.4 关于安全性的一些话

从用户角度出发的安全基础知识。 维护个人隐私。 其他用户可以看到你的帐户的哪些内容。


16.5 在 Linux 上编程

关于 Linux 编程环境的一些内容。 针对例如参加 CS101 的人。 没有关于如何编程的内容,只有 Emacs、gcc、gdb、ddd 等作为编程工具。

可能基于 debug.tex


[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ A ] [ B ] [ C ] [ D ] [ 下一页 ]


Debian 教程(已过时文档)

2009 年 12 月 29 日

Havoc Pennington hp@debian.org