1。关于文件系统
对存储设备分区还是不够的,我们还要对新增分区进行格式化;一个分区只有建立了某种文件系统后,这个分区才能使用;建立文件系统过程,就是用相应格式化工具格式化分区的过程,这个过程和我们在Windows中格式化某个分区为NTFS分区类似;没有什么高深的内容,只是所用的工具不一样罢了;
Linux操作系统中,几乎支持目前主流的文件系统,比如NTFS(只读)、FAT(可读可写)、ext2、ext3、reiserfs、hfs (MAC 操作系统的文件系统)、swap 交换分区… … 还有一些咱们不熟悉的操作系统的文件系统等;
最佳选择是 reiserfs 或ext3;
ext2:已被ext3取代;不推荐,使用风险比较大;
reiserfs:更安全,速度最快;
ext3:Redhat认为最好的文件系统。
相对来说reiserfs还是比ext3要优秀。
文件系统概念
-
Linix系统中:一切皆文件;
-
文件均混包含:
◆索引节点又称I节点,在文件系统结构中,包含有关相应文件的信息的一个记录,这些信息包括文件权限、文件主、文件大小、存放位置、建立日期等。
◆数据文件的实际内容,它可以是空的,也可以非常大,并且有自己的结构。
b.) Linux系统区分文件名的大小写
以圆点“.”开头的文件名是隐含文件(dot files),ls -a(显示隐藏文件)
在默认情况下,Shell通配符并不匹配这类文件名。
文件名通配符
星号(*): 与0个或多个任意的字符相匹配
问号(?): 问号只与一个任意的字符匹配,可以使用多个问号
方括号([ ]) : 与问号相似,只与一个字符匹配。它们的区别在于,问号与任意一个字符匹配,而方括号只与括号中列出的字符之一匹配。例如letter [123]只与文件letter1、letter2或letter3匹配,但不与文件 letter12匹配。可以用短横线代表一个范围内的字符,而不用将它们一一列出。例如,letter[1-3]是letter[123]的简写形式。但是,要注意范围内的字符都按升序排列,即[A-Z]是有效的,而[Z-A]是无效的。方括号中可以列出多个范围,如[A-Za-z]可以和任意大写或小写 的字符相匹配。方括号中如果以惊叹号“!”开始,表示不与惊叹号后的字符匹配
linux中各种文件类型
Linux操作系统支持普通文件、目录文件、特别文件及符号链接文件等文件类型。
使用file命令可以确定指定文件的类型。该命令可以将任意多个文件名当做参数,其一般使用格式是:file 文件名 [文件名…]
http://c.biancheng.net/linux/file.html
1.普通文件(- regular file)
普通文件也称作常规文件
①文本文件,由ASCII字符构成。常见的.c文件, .h文件 .txt文件等都是文本文件。文本文件的好处就是可以被人轻松读懂和编写。所以说文本文件天生就是为人类发明的。
②可执行的二进制程序,由机器指令和数据构成。例如,上面所说的系统提供的命令。常见的可执行程序文件(gcc编译生成的a.out,arm-linux-gcc编译连接生成的.bin)都是二进制文件。
③数据文件,由来自应用程序的数字型和文本型数据构成。例如,电子表格、数据库,以及字处理文档。
2.目录文件(d directory)
目录是一类特殊的文件,利用它可以构成文件系统的分层树型结构。如同普通文件那样,目录文件也包含数据;但目录文件与普通文件的差别是,核心对这些数据加以结构化,它是由成对的“I节点号/文件名”构成的列表。
◆I节点号是检索I节点表的下标,I节点中存放有文件的状态信息。
◆文件名是给一个文件分配的文本形式的字符串,用来标识该文件。在一个指定的目录中,任何两项都不能有同样的名字。
. 表示当前目录
…表示父目录
以,开始的都是隐藏目录,ls需要加-a才能查看
(1)目录就是文件夹,文件夹在linux中也是一种文件,不过是特殊文件。用vi打开一个文件夹就能看到,文件夹其实也是一种特殊文件,里面存的内容包括这个文件的路径,还有文件夹里面的文件列表。
文件夹这种文件比较特殊,本身并不适合用普通方式读写→→linux中使用特殊的一些API来专门读写文件夹。
Linux系统的目录结构
3.设备文件
在Linux系统中,所有设备都作为一类特别文件对待,用户像使用普通文件那样对设备进行操作,从而实现设备无关性。但是,设备文件除了存放在文件I节点中的信息外,它们不包含任何数据。系统利用它们来标识各个设备驱动器,核心使用它们与硬件设备通信。
有两类特别设备文件,它们对应不同类型的设备驱动器:
◆字符设备(c character) 最常用的设备类型,允许I/O传送任意大小的数据,取决于设备本身的容量。使用这种接口的设备包括终端、打印机及鼠标。
◆块设备(b block) 这类设备利用核心缓冲区的自动缓存机制,缓冲区进行I/O传送总是以1KB为单位。使用这种接口的设备包括硬盘、软盘和RAM盘。
4. 管道文件(p pipe)
5. 套接字文件(s socket)这种文件类型用于进程间的网络通信
6. 符号链接文件(l link)这种文件类型指向另一个文件
Linux系统的文件系统路径
路径:
①绝对路径 以/(根目录)开始
②相对路径 以 . 或 … 开始的~ 表示当前用户自己的家目录;
~USER 表示用户名为USER的家目录
如:cd ~ 回到当前用户的家目录;
cd ~USERNAME 回到USERNAME用户的家目录;
文件系统及其安装
一个硬盘上可以同时存在多个文件系统,每个文件系统占据硬盘的一个独立分区。Linux文件系统可以根据需要随时装卸,从而实现文件存储空间的动态扩充和信息安全。在系统初启时,往往只有一个文件系统被安装上,即根文件系统,其上的文件主要是保证系统正常运行的操作系统的代码文件,以及若干语言编译程序、命令解释程序和相应的命令处理程序等构成的文件,此外,还有大量的用户文件空间。根文件系统一旦安装上,则在整个系统运行过程中是不能卸下的,它是系统的基本部分。
其它的文件系统(例如,由软盘构成的文件系统)可以根据需要(如从硬盘向软盘复制文件),作为子系统动态地安装到主系统中,其中,mnt是为安装子文件系统而特设的安装节点。
经过安装之后,主文件系统与子文件系统就构成一个有完整目录层次结构的、容量更大的文件系统。这种安装可以高达几级。就是说,若干子文件系统可以并列安装到主文件系统上,也可以一个接一个地串连安装到主文件系统上。
已安装的子文件系统也可从整个文件系统上卸下来,恢复安装前的独立状态。
1.建立文件系统
当硬盘完成分区后,应该在该分区上建立文件系统。这一步工作是通过mkfs工具来完成的。例如,如果需要在分区/dev/hda1上建立ext2文件系统,并检查坏块,应该使用以下命令:
mkfs -c /dev/hda1
注意,只有root用户才能建立或安装/卸下文件系统。
2.安装文件系统
创建文件系统后,需要使用命令mount将该文件系统安装到主文件系统中。命令mount有三个主要参数:
◆需要安装的文件系统类型,用“-t fstype”选项来指定,这与mkfs中的-t选项是一样的。
◆所需访问的文件系统所在分区名,通常是位于目录/dev中的特别设备文件;如果需要安装网络文件系统时,就使用该服务器上输出的目录名。
◆ 安装新文件系统的路径名,也就是放置新文件系统的安装点(Mount Point)。通常这是一个空目录名,并且是专门为安装新文件系统而准备的。在Linux系统下,目录/mnt是常用的文件系统安装目录,缺省情况下, CDROM和软盘驱动器都分别安装在其子目录下。当然,文件系统也可以被安装到其它空目录中。例如,需要将MSDOS文件系统分区/dev/hda1安装 到系统的空目录/dos中,应该使用以下命令:
mount -t msdos /dev/hda1 /dos
3.卸载文件系统
在关闭系统之前,为了保证文件系统的完整性,所有安装的文件系统都必须被卸载。通常在/etc/fstab文件中定义的文件系统都能够自动卸载。但是,对于手工mount的文件系统,在关闭系统之前必须手工卸载。有时候也需要在系统工作过程中手工卸载某个文件系统。手工卸载文件系统必须使用umount命令,umount命令将分区名或分区的安装点作为参数,格式如下:
umount <分区名或分区的安装点>
例如,需要将已经安装到/mnt/floppy目录下的软盘卸载,可以使用以下命令:
umount /mnt/floppy
要注意,对于正在使用的文件系统,不能使用umount命令卸载。
本讲我们介绍了有关Linux系统中常用命令格式、文件和目录的概念、文件类型、目录结构、文件的存取权限、文件系统的概念及其安装命令等。有关文件操作的命令很多,读者可以通过上机学习各种命令的使用方法,掌握其基本功能。(T111)
文件权限
一般可认为是0 123 456 789,一共十位:
0:表示该文件的文件类型。Windows里面是使用了一种文件关联的技术(文件拓展名和文件类型无关,通过扩展名来关联相应的应用程序)
Linux中5种文件类型::
1.-,普通文件。 比如mp3 二进制文件 文本文件 硬链接
2.d,目录文件directory
3.l,软连接文件,亦称符号链接文件,s是soft或者symbolic的简写。
4.b,块文件block,是设备文件的一种(还有另一种)
5.c,字符文件character,也是设备文件的一种(这就是第二种)
chmod/fchmod函数和API命令chmod
man 2 chmod
#include <sys/stat.h>
修改文件属性:---------仅限root或者所有者
int chmod(const char *path, mode_t mode);//针对没有打开的文件 使用path
int fchmod(int fd, mode_t mode); //针对已经打开的文件 使用fd
mode_t mode可以是S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWOTH
ret = chmod(argv[1], S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWOTH);
chmod作为一个linux命令:
chmod [-cfvR] [–help] [–version] mode file…
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
mode: [ugoa…][[±=][rwxX]
u=user g=group o=other a=all
+表示增加权限、-表示取消权限、=表示唯一设定权限。
r表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。$ chmod =r file 为所有用户分配读权限
$ chmod 751 file
$ chmod u=rwx,g=rx,o=x file
$ chmod =r file 为所有用户分配读权限
$ chmod -R u+r directory 递归地给directory目录下所有文件和子目录的属主分配(给予)读的权限
3.2.5.3、chown/fchown/lchown与属主修改
chown命令来修改文件属主,通过chown API实现
【前者linux命令 man 1 后者API man 2】
chgrp是修改组的
umask与文件权限掩码
文件掩码umask【linux系统中维护的一个全局设置】
用来设定我们系统中新创建的文件的默认权限的。
umask命令就是用umask API实现的
创建文件的实际默认权限=777(文件夹)or666(文件)-umask
系统默认文件一开始不能有执行权限,可以手动添加chmod +x file1.txt
完整的文件权限=特殊权限+所有者权限+所属组权限+其他所有用户权限
在很多情况下,我们是不关注文件的特殊权限的,如果设定掩码值时候,我们输入的umask值如果不足四位数,那么它就会从后网往前更改原来的掩码值。
如初始umask值为 0002,如果我们输入命令umask 022,那么umask值就会被更改为0022。
如果我们输入命令umask 2,那么umask值就会被更改为0002。
目录文件的读取
目录文件就是一个特殊的文件—使用特殊的API打开DIR文件
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name); //文件指针
//DIR *fdopendir(int fd);
man 3 readdir
#include <dirent.h>
struct dirent *readdir(DIR *dirp); //结构体指针,DIR *dirp即之前open打开的目录
返回:
①struct dirent类型的结构体指针,指向的结构体变量里面记录了一个目录项(所谓目录项就是目录中的一个子文件)。
②若返回NULL则说明已经全部读出来了
struct dirent
{
ino_t d_ino; /* inode number /
off_t d_off; / not an offset; see NOTES /
unsigned short d_reclen; / length of this record /
unsigned char d_type; / type of file; not supported ※文件夹类型※
by all filesystem types /
char d_name[256]; / filename */ ※文件名字※
};
readdir调用一次只能读出一个目录项,要想读出目录中所有的目录项必须【多次调用readdir函数】。readdir函数内部会记住【哪个目录项已经被读过了哪个还没读】,所以多次调用后不会重复返回已经返回过的目录项。当readdir函数返回NULL时就表示目录中所有的目录项已经读完了。
可重入函数介绍
可重入函数:指一个可以被多个任务调用的函数,这种函数在不同的任务调用的时候不会改变或者影响其他任务调用该函数时的数据,这种是安全的设计架构。
(2)readdir函数和我们前面接触的一些函数是不同的,首先readdir函数直接返回了一个【结构体变量指针,这个指针指向一个结构体,这个结构体中包含了该目录下文件的类型及名称等内容】,因为readdir内部申请了内存并且给我们返回了地址。多次调用readdir其实readir内部并不会重复申请内存而是使用第一次调用readdir时分配的那个内存。【这个设计方法是readdir不可重入的关键。】
(3)readdir在多次调用时【是有关联】的,这个关联也标明readdir函数是不可重入的。
(4)库函数中有一些函数当年刚开始提供时都是不可重入的,后来意识到这种方式不安全,所以重新封装了C库,提供了对应的可重复版本(一般是不可重入版本函数名_r)