把具有相同的账户放入到一个组里面,这个组就是这两个账户的 群组 。在访问资源(操作系统中计算机的资源)时,可以让这个组里面的所有用户都具有访问权限。
每个账号都可以有多个群组的支持。
在我们Liux 系统当中,默认的情况下,所有的系统上的账号与一般身份使用者,还有那个 root
的相关信息,都是记录在/etc/passwd
这个文件内的。
个人的密码则是记录在/etc/shadow
这个文件下。此外,Linux 所有的组名都纪录在/etc/group
内。
Linux 的每个文件中,可分别给予使用者、群组与其他人三种身份个别的 rwx
权限
Linux 文件权限
ls
是 [list]
的意思,重点在显示文件的文件名与相关属性。
[-al]
则表示列出所有的文件详细的权限与属性 (包含隐藏文件,就是文件名第一个字符为了[.]
的文件)。
第一栏代表这个文件的类型与权限(permission);
第一个字符代表这个文件是[目录、文件或链接文件等等]:
当为[d]
则是目录,例如上表档名为 [.config] 的那一行;
当为[-]
则是文件,例如上表档名为[initial-setup-ks.cfg] 那一行;
若是[1]
则表示为连结档(link file);0
若是[b]
则表示为装置文件里面的可供储存的接口设备(可随机存取装置);0
若是[c]
则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 [rwx]
的三个参数的组合。其中,[r]
代表可读(read)、[w]
代表可写(write)、[x]
代表可执行(execute)。
要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[-]
而已。
第一组为[文件拥有者可具备的权限],以 [initial-setup-ks.cfg] 那个文件为例,该文件的拥有者可以读写,但不可执行:
第二组为[加入此群组之账号的权限];
第三组为[非本人且没有加入本群组之其他账号的权限]。
第二栏表示有多少档名连结到此节点(i-node);
第三栏表示这个文件(或目录)的[拥有者账号];
第四栏表示这个文件的所属群组;
第五栏为这个文件的容量大小,默认单位为 bytes;
第六栏为这个文件的建档日期或者是最近的修改日期;
第七栏为这个文件的档名。
改变文件属性和权限
chgrp
: 改变文件所属群组;chgrp [-R] dirname/filename
选项与参数:
-R
:进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况
chown
:改变文件拥有者;chown [-R] 账号名称 文件或目录
选项与参数:
-R
:进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更
chmod
: 改变文件的权限,SUID,SGID、SBIT 等等的特性;chmod [-R] xyz 文件或目录
选项与参数:
xyz
:就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R
:进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
复制行为(cp
)会复制执行者的属性与权限
bash
cp 来源文件 目标文件
权限对文件
r(read): 可读取此一文件的实际内容,如读取文本文件的文字内容等:
w(write): 可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
x(eXecute): 该文件具有可以被系统执行的权限。
权限对目录
r (read contents in directory) :表示具有读取目录结构列表的权限,所以当你具有读取ri)一个目录的权限时,表示你可以查询该目录下的文件名数据。
w (modify contents of directory) :
这个可写入的权限对目录:
1.建立新的文件与目录;
2.删除已经存在的文件与目录(不论该文件的权限为何)
3.将已存在的文件或目录进行更名;
4.搬移该目录内的文件、目录位置。
x (access directory): 目录的x
代表的是用户能否进入该目录成为工作目录的用途。 所谓的工作目录(work directory)就是目前所在的目录。
如果在某目录下不具有
x
的权限, 那么你无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的r
或w
的权限。要开放目录给任何人浏览时,应该至少也要给予,及
x
的权限,但w
权限不可随便给
Linux 文件种类与拓展
文件种类
一、正规文件
一般我们在进行存取的类型的文件,在由 ls -al
所显示出来的属性方面,第一个字符为 [-]
依照文件的内容,又大略可以分为:
1.纯文本档(ASCII) : 这是 Limux 系统中最多的一种文件类型, 称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设定的文件都属于这种文件类型。 举例来说,可以下达[ cat ~/bashrc
] 就可以看到该文件的内容。 (cat 是将个文件内容读出来的指令)
2.二进制文件(bimary) : 系统仅认识且可以执行二进制文件(binary file),Linux 当中的可执行文件(scripts,文字型批处理文件不算)就是这种格式,举例来说,刚刚下达的指令 cat 就是一个binary file.
3.数据格式文件(data) : 有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件(data ile)。举例来说,Linux 在使用者登入时,都会将登录的数据记录在 /ar/log/wtmp 那个文件内,该文件是一个 data file,他能够透过 last 这个指令读出来! 但是使用 cat 时,会读出乱码,因为它是属于一种特殊格式的文件。
二、目录
第一个属性为[d]
,例如 [drwxrwxrwx]
三、连接档(link)
类似 Windows 系统底下的快捷方式。第一个属性为[l]
(英文L的小写),例如[lwxrwxrwx]
四、设备与装置文件(device)
与系统周边及储存等相关的一些文件,通常都集中在/dev 这个目录之下! 通常又分为两种:
1.区块(block)设备档 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等可以随机的在硬盘的不同区块读写,这种装置就是成组设备。第一个属性为[b]
。
2.字符(character)设备文件 : 亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是[一次性读取]的,不能够截断输出。 !第一个属性为 [c]
。
五、资料接口文件(sockets)
既然被称为数据接口文件,想当然尔,这种类型的文件通常被用在网络上的数据承接了。可以启动个程序来监听客户端的要求, 而客户端就可以透过这个 socket
来进行数据的沟通了。第一个属性为 [s]
,最常在/run 或/tmp 这些个目录中看到这种文件类型了。
六、数据输送文件FITFOpipe)
FIFO 也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。FIFO 是 first-in-first-out 的缩写。第一个属性为[p]
。
Linux 文件扩展名
基本上,Linux 的文件是没有所谓的[扩展名]的,一个 Linux 文件能不能被执行,与他的第一栏的十个属性有关, 与文件名根本一点关系也没有。
具有[可执行的权限] 以及[具有可执行的程序代码] 是两回事 :在 Linux 底下,可以让一个文本文件具有了可执行的权限 (加入 x
权限即可), 但是这个文件明显的无法执行,因为他不具备可执行的程序代码。而如果将上面提到的 cat
这个可以执行的指令,将他的 x
拿掉那么 cat
将无法被执行!
常用的扩展名:
*.sh
:脚本或批处理文件 (scripts),因为批处理文件为使用 shell 写成的,所以扩展名就编成.sh
。*Z.*.tar, *.targz,*.zip,*tgz
: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip,tar 等等的,由于不同的压缩软件,而取其相关的扩展名。*.html,*,php
:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件。.html
的文件可使用网页浏览器来直接开启,至于.php
的文件, 则可以透过 client 端的浏览来 server 端浏览,以得到运算后的网页结果呢。
Linux 文件长度限制
在 Linux 底下,使用传统的 Ext2/Ext3/Ext4 文件系统以及近来被 CentOS 7 当作预设文件系统的 xfs而言,针对文件的档名长度限制为:
单一文件或目录的最大容许文件名为 255bytes
,以一个 ASCII
英文占用一个 bytes
来说,则大约可达255
个字符长度。若是以每个中文字占用 2bytes
来说, 最大档名就是大约在 128
个中文字之间。
Linux 文件名的限制
由于 Linux 在文字接口下的一些指令操作关系,一般来说,在设定 Linux 底下的文件名时,最好可以避免一些特殊字符比较好。例如底下这些
bash
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
Linux 目录配置
Linux 目录配置的依据--FHS
(FHS): Filesystem Hierarchy Standard
FHS 的重点在于规范每个特定的目录下应该要放置什么样子的数据。
FHS 依据文件系统使用的频繁与否与是否允许使用者随意更动, 而将目录定义成为四种交互作用的形态:
可分享的: 可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录;
不可分享的: 自己机器上面运作的装置文件或者是与程序有关的 socket
文件等, 仅与自身机器有关。
不变的: 有些数据是不会经常变动的,跟随着 distribution 而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等:
可变动的: 经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。
事实上,FHS 针对目录树架构仅定义出三层目录底下应该放置什么数据而已,分别是底下这三个目录的定义:
/(root,根目录)
: 与开机系统有关:
/usr (unix software resource)
: 与软件安装/执行有关
/var (variable)
: 与系统运作过程有关。
根目录
FHS 标准建议: 根目录(/)
所在分区槽应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区槽内,保持根目录越小越好。如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。
第一部份: FHS 要求必须要存在的目录
1./bin
: 放置的是在单人维护模式下还能够被操作的指令。在/bin
底下的指令可以被root
与一般账号所使用。主要有:cat, chmod, chown, date, my, mkdir, cp, bash
等等常用的指令。
2./boot
: 主要在放置开机会使用到的文件,包括 Linux 核心文件以及开机选单与开机所需配置文件等等。Linux kernel 常用的档名为: vmlinuz
3./dev
:任何装置与接口设备都是以文件的型态存在于这个目录当中。比要重要的文件有/dev/null, /dev/zero, /dev/tty,/dev/loop*,/dev/sd*
等等
4./etc
:系统主要的配置文件几乎都放置在这个目录内。这个目录下的各文件属性是可以让一般使用者查阅的, 但是只有 root 有权力修改 。FHS建议不要放置可执行文件(binary
)在这个目录中 。比较重要的文件有: /etc/modprobe.d/, /etc/passwd, /etc/fstab, /etc/issue
等等。
另外 FHS 还规范几个重要的目录最好要存在 /etc/
目录下:
a./etc/opt(必要)
: 这个目录在放置第三方协力软件 /opt
的相关配置文件
b./etc/X11/(建议)
: 与 X Window 有关的各种配置文件都在这里,尤其是 xorg.conf
这 X Server的配置文件。
c./etc/sgml/(建议)
: 与 SGML 格式有关的各项配置文件;
d./etc/xml/(建议)
: 与 XML 格式有关的各项配置文件。
5./lib
:放置的是在开机时会用到的函式库, 以及在/bin 或/sbin 底下的指令会呼叫的函式库。
某些指令必须要有这些函式库才能够顺利完成程序的执行之意。 另外 FSH 还要求 /lib/modules/
必须要存在: 这个目录主要放置可抽换式的核心相关模块(驱动程序)。
6./media
:放置的是可移除的装置。 包括软盘、光盘DVD 等等装置都暂时挂载于此。常见的档名有: /media/floppy, /media/cdrom
等等
7./mnt
:暂时挂载某些设备。
8./opt
:给第三方协力软件放置的目录。以前的 Linux 系统中,习惯放置在/usr/local
目录下。
9./run
:早期的 FHS 规定系统开机后所产生的各项信息应该要放置到 var/run
目录下,新版的 FHS 则规范到 /run
底下。 由于 /run
可以使用内存来仿真,因此效能上会好很多。
10./sbin
:开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。某些服务器软件程序,一般则放置到/usr/sbin/
当中。至于本机自行安装的软件所产生的系统执行文件(system binary), 则放置到/usr/local/sbin/
当中了。常见的指令包括: fdisk, fsckifconfig, mkfs
等等。
11./srv
:srv 可以视为 [service] 的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。 常见的服务例如 www,FTP
等等。举例来说,www
服务器需要的网页资料就可以放置在/srv/www/
里面。不过,系统的服务数据如果尚未要提供给因特网任何人浏览的话,预设还是建议放置到 /var/lib
底下即可。
第二部份: FHS 建议可以存在的目录
\home
:这是系统默认的用户家目录(home directory)。在你新增一个一般使用者账号时,默认的用户家目录都会规范到这里来。比较重要的是,家目录有两种代号:
~
:代表目前这个用户的家目录
~feng
: 则代表 feng 的家目录!
/lib<qual>
:用来存放与 /lib
不同的格式的二进制函式库,例如支持 64
位的 /lib64
函式库等。
/root
:系统管理员(root)的家目录。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,送目录就能够拥有 root 的家目录,所以会希望 root 的家目录与根目录放置在同一个分区槽中。
几个在 Linux 当中也是非常重要的目录:
1./lost+found
:这个目录是使用标准的 ext2/ext3/ext4
文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时, 将一些遗失的片段放置到这个目录下。如果使用的是 xfs 文件系统的话,就不会存在这个目录了。
2./proc
:这个目录本身是一个[虚拟文件系统(virtualfilesystem)]。他放置的数据都是在内存当中 , 例如系统核心、行程信息(process)、周边装置的状态及网络状态等等。因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间 。比较重要的文件例如: /proc/cpuinfo,/proc/dma,/proc/interrupts./proc/ioports,/proc/net/*
等等。
3./sys
:这个目录其实跟/proc 非常类似,也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息较相关的信息。 包括目前已加载的核心模块与核心侦测到的硬件装置信息等等。这个目录同样不占硬盘容量。
依据FHS 的基本定义,/usr
里面放置的数据属于可分享的与不可变动的 (shareable,static), usr 是 Unix Software Resource 的缩写, 也就是 Unix 操作系统软件资源所放置的目录,而不是用户的数据。应该将数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。
/var
:如果/usr
是安装时会占用较大硬盘容量的目录,那么/var
就是在系统运作后才渐渐占用硬盘容量的目录。 因为/var
目录主要针对常态性变动的文件,包括快取(cache)、登录档(log file)以及某些软件运作所产生的文件,包括程序文件(lock file,run file),或者例如 MySOL 数据库的文件等等。
目录树
在 Linux 底下,所有的文件与目录都是由根目录开始的!那是所有目录与文件的源头~
然后再一个一个的分支下来。因此,也称这种目录配置方式为:目录树(directorytree)
1.目录树的启始点为根目录 (/,root
);
2.每一个目录不止能使用本地端的 patition 的文件系统,也可以使用网络上的 filesystem 。举例来说,以利用 Network File System(NFS) 服务器挂载某特定目录等。
3.每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
绝对路径与相对路径
绝对路径 :由根目录(/
)开始写起的文件名或目录名称, 例如 /home/feng/.bashrc
;
相对路径 :相对于目前路径的文件名写法。 例如 ./home/feng
或 ../../home/feng/
等等。反正开头不是 /
就属于相对路径的写法。
bash
cd ./
.
:代表当前的目录,也可以使用 ./
来表示;
..
:代表上一层目录,也可以 ../
来代表。
《鸟哥的Linux私房菜-基础篇》学习笔记