一Linux 的文件系统概述Word文档下载推荐.docx
《一Linux 的文件系统概述Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《一Linux 的文件系统概述Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
一个很有用但常常被忽视的命令可以提供关于使用man本身的信息:
$manman
您可以用SPACEBAR来浏览任意的man页面;
UPARROW将向上翻滚文件。
.要退出,则输入q,!
,或CTRL-Z。
用户类别
记得那句名言“所有动物一例平等但有些动物比其他动物更加平等”吗?
在Linux世界中,根用户掌管一切。
根用户可以以另一个用户名su(源自"
superuser"
)登录。
要执行诸如添加一个新用户、打印机或文件系统之类的任务,必须作为根用户登录或者用su命令和根用户密码切换到超级用户。
系统文件(包括控制初始化过程的系统文件)归根用户所有。
虽然可能允许普通用户对它们进行读操作,但出于系统安全性的原因,编辑的权利将留给根用户。
BASHshell
虽然提供了其它的shell,但BASH(BourneAgainShell)是Linux的默认shell。
它结合了与它同名的Bourneshell的特性和Korn、C和TCSHshell的特性。
BASH内置的命令history默认记录最后输入的500条命令。
可以通过在命令提示符下输入history来查看它们。
要检索某个特定的命令,可以在命令提示符下按UPARROW或DOWNARROW,或在历史列表中输入它的编号,并在编号前面加上"
!
"
,例如:
$!
49
您还可以通过一条命令在历史列表中离位置最靠前的项目的距离来执行该命令:
如果在历史列表中有53个事件,$!
-3将执行事件号51。
像UNIX/Linux世界的其它shell一样,BASH使用了特殊的环境变量来方便系统管理。
∙HOME,用户主目录
∙PATH,Linux用来搜索您输入的命令的可执行镜像的搜索路径
∙HISTSIZE,系统保存的历史事件的数量
除了这些保留的关键字之外,您还可以定义您自己的环境变量。
例如,Oracle使用ORACLE_HOME(还有其它一些变量),要使Oracle安装成功完成,必须在您的环境中设置这些变量。
可以在提示符下临时设置变量:
$HISTSIZE=100
或者,在/etc/profile(需要根用户权限)中进行系统范围的永久设置,或在.profile中进行局部永久设置。
可以通过echo命令,并用一个$符号来访问一个环境变量的值,进而查看该值。
$echo$HOME
/home/bluher
可以用env命令来查看当前所有的环境变量。
正则表达式和通配符
许多Linux命令使用通配符*和?
来匹配任意数量的字符或分别匹配任意的单个字符;
正则模式匹配表达式利用一个句点(.)来匹配除“换行符”之外的任意单个字符。
这两种情况下都使用方括号([])来匹配除“*”号之外的字符组。
不过,*号在各种情况下有类似但不同的意义:
虽然它在shell中将匹配一个或更多的字符,但在正则表达式中,它匹配上述字符的零个或更多的实例。
一些命令(如egrep和awk)使用了一组更广泛的特殊字符来进行模式匹配。
文件处理命令
剖析一个文件列表
ls命令用来查看用户有执行权限的任意目录中的文件列表,该命令有许多有趣的选项。
$ls-liah*
22684-rw-r--r--1bluherusers952Dec2818:
43.profile
19942-rw-r--r--1scalishusers30Jan320:
00test2.out
925-rwxr-xr-x1scalishusers378Sep22002test.sh
上面的列表显示8列:
∙第1列指示文件的inode,因为我们使用了-i选项。
剩下的列通过-l选项来进行正常显示。
∙第2列显示文件类型和文件访问权限。
∙第3列显示链接数,包括目录。
∙第4和第5列显示文件的所有者和组所有者。
这里,所有者"
bluher"
属于组"
users"
。
∙第6列显示文件大小(单位为所显示的单位,而不是默认的字节数,因为我们使用了-h选项。
∙第7列显示日期(它看起来像是三列),包括月、日和年,以及当天的时间。
∙第8列显示文件名。
在选项列表中使用-a将使列表中包含隐藏文件(如.profile)的列表。
处理文件
可以移动(mv)、复制(cp)或删除(rm)文件和目录。
明智地使用-i选项,以获得确认通常是个不错的主意。
$cp-ils.outls2.out
cp:
overwrite`ls2.out'
?
mv命令允许使用-b选项,这将在移动文件之前作一个备份拷贝。
rm和cp接受功能强大但却危险的-r选项,它将在一个目录和它的文件上递归执行。
$rm-irTest
rm:
descendintodirectory`Test'
y
可以用mkdir来创建目录,用rmdir来删除目录。
不过,因为不能用rmdir来删除包含文件的目录,所以使用rm加-r选项通常要更方便些。
出于安全的原因,所有的文件都有所有权和保护。
文件访问权限(或文件模式)包含之前提到的相同的10个字符:
∙第一个字符指示文件类型。
最常见的是-代表文件,d代表目录,而l代表链接。
∙接下来的9个字符是三种用户类别的访问权限:
文件所有者(字符2-4),用户组(5-7)和其它(8-10),其中r表示读权限,w表示写权限,x指示一个文件上的执行权限。
破折号-如果出现在这九个位置的任意一个,则指示这个操作对该类别的用户禁止。
可以使用chmod命令通过字符符号或二进制掩码来设置访问权限。
要使用二进制掩码,必须将三个权限组的字符表示转换成二进制格式,然后转换成八进制格式:
用户类别:
所有者
用户组
其它
字符表示:
rwx
r-x
r--
二进制表示:
111
101
100
八进制表示:
7
5
4
将写权限赋予用户组,您可以使用:
chmodg+wtest.shorchmod774test.sh
用umask命令,在/etc/init.dev文件中进行系统范围内的、或在.profile文件中进行的本地的文件权限默认设置。
这个命令指示用777减去这个数字来获取默认的权限:
$umask022
这将为用户创建的所有新文件生成一个默认的文件权限755。
可以用chown来修改文件的所有权:
$chownbluherls.out
这里,bluher是新的文件所有者。
类似地,组成员资格将按以下方式修改:
$chgrpdevgrpls.out
这里,devgrp是新的用户组。
ls不提供哪些文件是文本的,哪些文件是二进制的的信息。
要了解这个信息,您可以使用file*命令。
重命名文件
赋予一个文件多个名字的两种流行的方法是利用链接和alias命令。
Alias可以用来为一个更长的命令重新起一个更方便的名字:
$aliasll='
ls-l'
$ll
注意单引号的使用,这使得BASH将该项目传递给别名,而不是自己估计它。
别名还可用作较长的路径名的缩写:
$aliasjdev9i=/jdev9i/jdev/bin/jdev
关于alias和它的反命令unalias的更多信息,请查看BASH的man页面的"
SHELLBUILTINCOMMANDS"
子部分。
在最后一个例子中,定义了一个环境变量来实现相同的结果。
$exportJDEV_HOME=/jdev9i/jdev/bin/jdev
$echo$JDEV_HOME
/jdev9i/jdev/bin/jdev
$$JDEV_HOME
链接允许几个文件名引用单个源文件,格式如下:
ln[-s]fileyouwanttolinktonewname
单独的ln命令创建到文件的一个硬链接,而使用-s选项来创建一个符号链接。
简而言之,一个硬链接几乎不能和原始的文件区分开(除了这两个文件的inode将相同之外)。
符号链接较容易区分,因为它们出现在一个长的文件列表中,并用->
来指示源文件,l指示文件类型。
查看和查找文件
文件过滤器
用来读取文件内容和在文件内容上执行操作的命令有时被称为¹
ý
滤器。
sed和awk命令是两个滤波器的例子,因为在以前的OTN文章中有它们详细的讨论,在这里将略过。
诸如cat、more和less之类的命令让您能够从命令行查看一个文本文件的内容,而无需调用编辑器。
Cat是"
concatenate"
的缩写,它将默认地在标准输出(显示屏)上显示文件内容。
和cat一起提供的最有趣的选项之一是-n选项,它用编号的输出行来显示文件内容。
$cat-ntest.out
1Thisisatest.
因为cat一次性输出文件中的所有行,所以您可能更喜欢用more和less,因为它们都一次输出一屏的文件内容。
Less是more的一个增强的版本,它允许用来自vi文本编辑器的关键命令来增强文件查看。
例如,d向前翻滚、b向后翻滚N行(如果N是在d或b之前指定的)。
为N输入的值成为随后的d命令的默认值。
man页面实用工具使用less来显示使用说明的内容。
重定向和管道
重定向允许将命令输出重定向到文件中,而不是标准输出,或者类似地,也可重定向输入。
重定向的标准符号>
创建一个新的文件。
>
符号将输出添加到一个现有的文件中:
$moretest2.out
Anothertest.
$cattest.out>
test2.out
$cattest2.out
Anothertest.
Thisisatest.
到文件的标准输入可以用<
符号来重定向:
$cat<
错误消息用2>
和2>
来重定向和添加,格式如下:
$command2>
name_of_error_file
要避免无意地覆盖一个现有的文件,使用BASH内置的命令集:
$set-onoclobber
可以在命令和输出文件之间用>
符号来重载这个特性。
要关闭这个特性,用+o代替-o。
重定向在一个命令和文件之间、或文件和文件之间工作。
重定向语句的一项必须是一个文件。
管道使用|符号,并且在命令之间工作。
例如,您可以用以下方式将一个命令的输出直接发送到打印机上:
$ls-l*|lpr
可以用以下方式快速地找到历史列表中的一个命令:
$history|grepcat
更多的滤波器
Grep、fgrep和egrep都显示匹配一种模式的行。
所有这三个命令都在文件中搜索指定的模式,如果您想不起来一个所需文件的名称,这将非常有用。
基本格式是:
grep[options]PATTERN[FILE...]
$grep-r'
Subject'
nsmail
CTRL-Z将终止上述或其它任何命令。
grep的最有用的选项可能是-s。
如果您以除根用户之外的任何身份搜索系统文件,那么对于每一个您没有访问权限的文件,都将产生错误消息。
这个命令禁止那些消息。
Fgrep(也以grep-F调用)只查找固定的字符串,而不是grep接收的正则表达式。
而egrep接收包含更大范围的特殊字符(如“|”,它指示条件OR运算符)的模式。
$egrep'
Subject|mailto'
*
查找文件
find命令的GNU版本非常强大、灵活并且比UNIX系统上存在的经典版本更具包容性。
它对于涉及到目录结构的任务非常有用,包括在文件上查找和执行命令。
find命令的基本格式是:
$findstartdirectoryoptionsmatchcriteria[actionoptions]
如果您知道文件的名称、或者甚至名称的一部分,但不知道它所处的目录,您可以这么做:
$find.-name'
test*'
./test
./jdevhome/mywork/EmpWS/EmpBC4J/test
与经典的UNIX系统不同,在Linux中不需要在末尾添加-print操作,因为如果没有指定其它的操作选项,就将假定执行这个操作。
在目录起始位置上的一个点(.)将使find在您的工作目录中开始搜索。
两个点,..,在父目录中开始搜索。
您可以在任意目录下开始搜索。
注意,您可以使用通配符作为搜索准则的一部分(只要用单引号将整个项目括起来)。
-print
./test.out
./test2.out
显示拥有.out扩展名的一系列文件:
$find/home-name'
*.out'
不过记住,除非您是作为超级用户运行这个命令,否则您将可能得到许多的"
Permissiondenied"
错误消息。
最强大的搜索工具之一是和grep一起使用的-exec操作:
*.html'
-execgrep'
mailto:
foo@'
{}\;
这里,我们让find命令在当前目录中开始执行,
接下来的步骤
下载OracleDatabase10gforLinux
访问并将Linux技术中心添加到收藏夹
.,查找一个html文件,*.html,并在当前文件上执行(-exec)grep命令,{}。
当使用-exec操作时,需要一个分号;
,这是用来在使用find命令时执行其它一些操作。
需要反斜线\和引号来确保这些项目通过BASH,以使它们由命令而不是shell来进行解释。
立即掌握Linux文件命令
在Linux中提供了许多有用的命令和利用它们的强大的方法,在此无法一一说明。
此外,完成许多任务通常都存在多种方法。
我们已经看到了一些最常用和最有启发意义的Linux文件命令。
掌握这些基础但却关键的工具将使您的Linux学习走上快车道。
利用您手头上的man页面,和试验的积极性,您现在拥有了足够的信息来开始探索Linux文件操作的力量。
在我的下一篇文章中,我将提供Linux系统命令的一个类似的说明。
一、
二、Linux的文件系统概述
三、
四、
Linux的一个最重要特点就是它支持许多不同的文件系统。
这使Linux非常灵活,能够与许多其他的操作系统共存。
到目前为止,Linux共支持15种文件系统:
ext、ext2xia、minix、umsdos、msdos、vfat、proc、smb、ncp、iso9660、sysv、hpfs、affs和ufs。
无疑随着时间的推移,Linux支持的文件系统数还会增加。
正如其它的UNIX操作系统一样,Linux系统可用的独立文件系统不是通过设备标识来访问的,而是把它们链接到一个单独的树形层次结构中。
该树形层次结构把文件系统表示成一个整个的独立实体。
Linux以装配的形式把每个新的文件系统加入到这个单独的文件系统树中。
无论什么类型的文件系统,都被装配到某个目录上,由被装配的文件系统的文件覆盖该目录原有的内容。
该个目录被称为装配目录或装配点。
在文件系统卸载时,装配目录中原有的文件才会显露出来。
在硬盘初始化时,硬盘上的分区结构把物理硬盘化分成若干个逻辑分区。
每个分区可以包含一个像EXT2那样的一个独立的文件系统。
文件系统用目录将文件按照逻辑层次结构组织起来。
目录是记录在物理设备块中的软链接信息。
包含文件系统的设备被称为块设备。
例如IDE硬盘分区/dev/hda1-系统中第一个IDE硬盘驱动器的第一个分区,就是一个块设备。
Linux文件系统把这些块设备当作简单的线性块的集合,它不知道也不在意下层物理硬盘的实际结构。
每个块设备驱动程序的任务就是把系统读该设备上某一块的请求映射成对本设备有意义的术语,如该块所在的磁道、扇区或柱面号。
无论文件系统存在在何种设备上,它都可以按相同的方式进行操作。
而且在使用文件系统时,由不同的硬件控制器控制的不同物理介质上的不同文件系统对系统用户是透明的。
文件系统既可能在本地系统上的,也可能是通过网络链接装配的远程文件系统。
文件是数据的集合,一个文件系统不仅包括该文件系统中所有文件的数据,还包括文件系统的结构信息。
它记录下所有Linux用户和进程当作文件看待的信息、目录软链接信息以及文件保护信息等等。
而且文件系统必需保证这些信息的安全性,因为操作系统的基本完整性就取决于它的文件系统。
没有人会使用一个随时会丢失数据和文件的操作系统。
由于现代的数据库系统需要更大的文件长度,在1993年几乎是为LINUX度身定做的扩展文件系统-EXT2诞生了。
在EXT文件系统加入到Linux中时,Linux系统发生了一个重大的发展。
真实文件系统从操作系统中分离出来,而由一个接口层提供的真实文件系统的系统服务被称为虚拟文件系统(VFS)。
VFS使得Linux可以支持许多种不同的文件系统,而这些文件系统都向VFS提供相同的软件接口。
由于所有的Linux文件系统的细节都是由软件进行转换的,所有对Linux系统的其余部分和在系统中运行的程序来说,这些文件系统是完全相同的。
Linux的虚拟文件系统层使得你可以同时透明地装配很多不同的文件系统。
实现Linux虚拟文件系统要使得它对文件的访问要尽可能地快、尽可能地高效,而且一定要确保文件和数据的正确性。
这两个要求彼此是不对称的。
在每个文件系统被装配使用后,Linux的VFS会在内存中缓存来自于这些文件系统的信息。
因此由于对文件或目录的创建、写、删除操作而改变了Linux缓存中的数据时,对文件系统的更新操作要格外小心。
如果你能在运行的内核中看到文件系统的数据结构,就会看到那些文件系统读/写的数据块。
代表被访问的文件和目录的数据结构可能被创建或删除,而设备驱动程序不停地工作,读取数据、保存数据。
这些缓存中最重要的一个是缓冲区缓存,它把独立文件系统访问下层块设备的方法集成起来。
每个被访问的块都被放到缓冲区缓存中,并根据它们的状态放在相应的队列中。
缓冲区缓存不仅缓存数据缓冲区,它还有助于管理块设备驱动程序的异步接口。
二、LINUX文件系统代码的位置
EXT2文件系统的代码都在fs/ext2/目录下,其数据结构定义在include/linux/ex2_fs.h、ext2_fs_i.h和ext2_fs_sb.h中;
虚文件系统(VirtualFileSystem)数据结构在include/linux/fs.h中,代码在fs/*中;
缓冲区缓存代码在fs/buffer.c中。
三、与文件的输入/输出有关的函数
3.1引言
本节开始讨论LINUX系统,先说明常用的文件I/O函数:
例如打开文件、读文件、写文件等等。
大多数LINUX文件I/O只需用到5个函数:
open、read、write、lseek以及close。
然后说明不同缓存器长度对read和write函数的影响。
本节所说明的函数经常被称之为不带缓存的I/O(unbufferedI/O)。
不带缓存指的是每个read和write都调用内核中的一个系统调用。
这些不带缓存的I/O函数不是ANSIC的组成部分,但是是POSIX.1和XPG3的组成部分。
只要涉及在多个进程间共享资源,原子操作的概念就变成非常重要。
我们将通过文件I/O和传送给open函数的参数来讨论此概念。
并进一步讨论在多个进程间如何共享文件,并涉及内核的有关数据结构。
在讨论了这些特征后,将说明dup、fcntl和ioctl函数。
3.2文件描述符
对于内核而言,所有打开文件都由文件描述符引用。
文件描述符是一个非负整数。
当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。
当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
按照惯例,UNIXshell使文件描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符2与标准出错输出相结合。
这是UNIXshell以及很多应用程序使用的惯例,而与内核无关。
尽管如此,如果不遵照这种惯例,那么很多LINUX应用程序就不能工作。
在POSIX.1应用程序中,幻数0、1、2应被代换成符号常