前言
在上文我们说过:在Linux中一切接文件。 既然所有东西都是文件,那么如何区分不同的东西?
本文我们就来学习说明一下 Linux 文件系统 以及对文件的权限管理 。
在文章中我们会使用一些 shell 命令进行操作,虽然系列文章还没有讲到 Shell 命令,但是作为嵌入式工程师,多多少少也得知道是什么一个东西,就像 Windows 有 CMD 命令一样,玩 RT-Thread 的时候也会使用到 Shell 命令,即便这些你都不知道,在下一篇 Linux 入门会记录说明一些常用的 Linux Shell 命令,本文的命令也可以作为学习了解。
<3
嵌入式 Linux 入门系列博文:
嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)
一、Linux 文件属性
我们进入到 ubuntu 系统,打开终端,默认是进入到我们自己的用户目录下面,我们使用 ls -l (查看该目录下所有文件的详细信息)命令,查看文件详情,如下图:
在上面图片中的目录详情,我们先整体来说明一下各部分的含义:
我们主要需要了解文件权限的含义:
文件类型后面的9个字符以3个为一组,第一组表示“文件所有者的权限”,第二组表示“用户组的权限”,第三组表示“其他非本用户组的权限”。(用户和用户组的知识,本文后面会有对应的说明。)
每组都是 rwx 的组合,其中 r 代表可读,w 代表可写,x 代表可执行,- 代表没有这个权限。
1.1 Linux 文件类型
在Linux 中,一共有7种文件类型,如下表格:
字母 | 类型 | 说明 |
---|---|---|
- | 普通文件 | 普通文件包括 文档图片音乐等;纯文本文件(ASCII)、二进制文件(binary)、数据格式的文件(data)、各种压缩文件 |
d | 目录文件 | 目录,可用 cd 命令进入 |
c | 字符设备文件 | linux 驱动里面的字符设备驱动,比如 串行设备,音频设备,键盘、鼠标等等 |
b | 块设备文件 | 存储设备驱动,比如硬盘,U盘等 |
p | 管道文件 | FIFO也是一种特殊的文件类型,它主要目的是解决多个程序同时存取一个文件所造成的错误 |
l | 链接文件 | 类似Windows下面的快捷方式 |
s | 套接字文件 | 这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信 |
我们在上面文章的一些图片中已经看到过 普通文件,和目录文件。
那么我们通过上一篇文章嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)应该可以知道,在目录 /dev 中应该有很多与设备有关的文件,如下图:
字符设备,块设备,还有连接文件都看到了。
还有一点可以说明一下, 我们后面学习 Linux 驱动开发基本都是与 字符设备文件 和块设备文件 打交道。
文件类型这个基本的知识,也好理解,没有什么复杂的,我们知道了就可以。
1.2 Linux 文件权限及修改
在上面我们讲过文件的 3 种读写权限:读(r)、写(w)和执行(x)。
除了用 r、w 和 x 表示以外,我们也可以使用二进制数表示,三种权限就可以使用 3 位二进制数来表示,一种权限对应一个二进制位,如果该位为1就表示具备此权限,如果该位为 0就表示没不具备此权限:
那么组合一下,所有的文件共有 8 种不同的权限组合:
在Linux 系统中,使用命令“chmod”修改一个文件的权限。
我们经常看到前辈们使用的一条指令为 : chmod 777 xxxx(文件名字),意思就是把这个文件的权限全面开放,对于初学者来说,首先记住这条指令就可以了。
但是要记住,系统本身的文件,千万不要瞎修改,可以在自己的账户下随便新建一个文件作为测试,自己修改看看。
比如,我们做个简单的测试,如下图:
在我们以后使用 Linux 的时候,经常会遇到权限不够的问题,我们一般都会在命令前加上一个 sudo ,比如下图测试:
上图中,我用自己的 qzh 账户尝试在根目录 “/” 创建文件 test,给出权限不够的提示。只有 root用户才能在根目录“/”下创建文件 , 所以使用了 sudo 命令暂时获取管理员用户权限。
当然接下来的删除,也是需要 sudo 命令的:
上面sudo 这个命令以后需要经常使用,需要记住。
二、Linux 用户系统
在上文说明 Linux 文件的设备类型的时候,有提到用户权限,用户组权限,和其他用户权限。
那么我们需要明白什么是用户? 什么是用户组?
2.1 Linux 的用户
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,
都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;
另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
每个用户账号都拥有一个唯一的用户名和各自的口令。
用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
其实在我们使用 Windows 系统的时候,也有用户的概念,只是日常应用很少创建多个用户,切换来切换去,可能相对多的时候,也只是右键 “以管理员身份运行” 某个程序。
在安装 Ubuntu系统的时候被要求创建一个账户,当我们创建好账号以后,系统会在目录/home 下以该用户名创建一个文件夹,所有与该用户有关的文件都会被存储在这个文件文件夹中。同样的,创建其它用户账号的时候也会在目录/home 下生成一个文件夹来存储该用户的文件,如下图:
Linux 的用户分类:
Linux 用户类型分为以下 3类:
- 管理员:root 用户,系统管理员,具有所有权限。
- 系统用户:管理系统运行服务,系统中系统服务由不同用户运行,更加安全,默认被限制登录系统。
- 普通用户:用于日常工作而不能管理系统的普通用户,只有一部分权限。
在我们使用的 Ubuntu 中,上面的 qzh 用户属于普通用户,但是他是按照系统时候创建的用户,其权限比后面创建的用户大一点,但是没有 root 用户权限大。
这个地方初次创建的用户,比后面创建的普通用户的区别暂时没有必要研究,因为后期我们在使用过程中基本都是在初次创建的用户下面,遇到权限问题可以临时获取管理员,这里做个了解即可。
UID
每个用户都有一个 ID 号,称为 UID,操作系统通过 UID 来识别是哪个用户,用户相关信息可以在文件 /etc/passwd 查看到 :
每行用户信息都以 “:” 作为分隔符,划分为7个字段,每个字段所表示的含义如下:
用户名:密码:UID:GID:描述性信息:主目录:默认Shell
每一行都是一个用户的信息,意思如下图解释:
上面第二个密码“x” ,在以前版本的 linux 系统中存放着加密后的用户口令,虽然这个字段存放的只是用户口令的加密串,但是由于 /etc/passwd 文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 版本都使用了shadow技术,把 真正加密后的用户口令存放到 /etc/shadow 文件中 ,而在 /etc/passwd 文件的口令字段中只存放一个特殊的字符,例如用“x”或者“*”来表示。
那么结合这个文件,我们可以再次说明一下 Linux 系统中的几个用户 UID:
超级用户 UID 0 :
系统用户 UID 1-999 :
普通用户 UID 1000以上:
特殊的来宾账号:
nobody这个的帐号UID为65534,这个用户的权限会进一步的受到限制,一般用于实现来宾帐号。
系统是根据 UID 来认定用户的权限而不是名字。如果把自己创建的用户 UID 改成 0 ,那么系统登录会把用户视为管理员用户。
2.2 Linux 的用户组
什么是用户组?
用户组是具有相同特征用户的逻辑集合, 有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有10个用户的话,就需要授权10次,显然这种方法不太合理;另一种方法是 建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中,那么所有用户就具有了和组一样的权限,这就是用户组。
将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了管理工作。
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。每个用户在被创建时均会创建一个默认组(其GID与UID相同,叫作基本组或初始组),而后加入的组叫作扩展组或附加组。
GID
GID 是用户组的编号,可以将多个用户加入到某个组中,方便指派任务或工作。 和 UID 一样也是有一个对应的文件保存信息,用户组名和GID相关信息可以在文件 /etc/group 查看到:
每行的用户组的信息都以 “:” 作为分割符,划分为4个字段,每个字段所表示的含义如下:
组名:密码:GID:该用户组中的用户列表
每一行都是一个用户组的信息,组中的用户列表只包括附加用户,如果该组是某个用户的初始组,则这个用户不会出现在这个用户列表中,如下图:
2.3 文件归属者修改命令
相对于修改权限来说,修改归属者没那么常用,简单了解一下。
使用命令“chown”修改一个文件的所属者和所属:
chown [参数] [用户名.<组名>] [文件名/目录]
chown [-cfhvR] [--help] [--version] user[:group] file...
简单测试如图:
更多有关用户和用户组的管理可以查看如下链接: Linux 用户和用户组管理
一些常用的指令我们下一篇讲 Shell 命令的时候都会有说明。
三、Linux 文件系统简介
实际上,还需要说明一个文件系统的概念可以说明,文件系统用来组织计算机的文件和资料的系统。
此部分对于初学者,了解一下就好,后面如果真的遇到文件类型的问题再看一篇才好理解。
操作系统就是处理各种数据的,这些数据在硬盘上就是二进制,我们想要看懂这些数据,要有一个翻译器,将这些二进制的数据还原为人类能看懂的文件形式,这个工作就是由文件系统来完成的,文件系统的目的就是实现数据的查询和存储。
由于使用场合、使用环境的不同,Linux有多种文件系统,不同的文件系统支持不同的体系。文件系统是管理数据的,而可以存储数据的物理设备有硬盘、U 盘、SD卡、NAND FLASH、NOR FLASH、网络存储设备等。不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理,比如管理 NAND FLASH 的话使用 YAFFS 文件系统,管理硬盘、SD 卡的话就是 ext 文件系统等等。
比如在我们使用 windows 的时候,格式化一个 U 盘,就需要选择文件系统,如下图:
3.1 Linux文件系统类型
和 Windows 类似,在 Windows 下有 FAT32、NTFS 和exFAT 这样的文件系统,在Linux下又有哪些文件系统呢,Linux 下的文件系统主要有 ext2、ext3、ext4 等文件系统。
Linux 还支持其他的 UNIX文件系统,比如XFS、JFS、UFS 等,也支持Windows的 FAT文件系统和网络文件系统 NFS等。
- ext2
具有极快的速度和极小的CPU占用率,可用于硬盘和移动存储设备,ext2是Linux早期的文件系统,但是随着技术的发展 ext2文件系统已经不推荐使用了。
- ext3
增加日志功能,可回溯追踪,完全兼容 ext2文件系统,ext3支持大文件;
- ext4
ext4 相比与ext3提供了更佳的性能和可靠性,并且功能更丰富,ext4 向下兼容 ext3 和 ext2,因此可以将 ext2 和 ext3 挂载为 ext4。
日志式文件系统,支持1EB(1024*1024TB),最大单文件16TB,支持连续写入可减少文件碎片。
在终端中输入如下命令可查询当前磁盘挂载的文件系统:
df -T –h
比如查询我安装的 Ubuntu 使用的哪个版本的文件系统如下图:
上图中最后一个项目是“挂载点”,在 Linux 下创建一个分区并且格式化好以后我们要将其“挂载”到一个目录下才能访问这个分区,这个我们后期会有对应介绍。
结语
本文我们认识了 Linux 的 7 种文件类型,知道如何查看文件类型,以及对文件的权限管理方式。
然后还任何了一下 Linux 的用户系统,知道了 用户 与 用户组的概念,记住两个概念 UID 和 GID: 用户ID 和 用户组 ID。
然后知道了通过两个文件 /etc/passwd 和 /etc/group 可以查看当前系统下所有用户 和用户组的信息。
最后还简单的介绍了一下 Linux 的文件系统。
这些都是 Linux 的基础知识,内容简单不难理解,但是是学习嵌入式 Linux 入门的必须要知道了解的内容,在下一篇文章,我们开始学习常用的 Shell 命令。
本文就到这里,谢谢大家!