导图社区 Linux 文件、目录与磁盘格式
linux基础篇梳理之Linux文件、目录与磁盘格式知识总结,包括Linux 的文件权限与目录配置、Linux 文件与目录管理、Linux 磁盘与文件系统管理等内容。
编辑于2021-11-13 11:23:03云计算中的部分存储基础知识整理,包括:开源企业存诸freenas、Account、storage、Sharing。
网络基础知识思维导图,主要内容有网络范围、网络模型(标准)、单位、数据发送方式、数据包装格式、网络层IP协议、网络设备路由器/交换机设置。
这是一篇关于第五部分 Linux 系统管理员的思维导图,从chapter 20 启动流程、模块管理与Loader、内核与内核模块、内核模块查看、initrd的重要性与创建initrd文件、内核功能中的vga设置、init配置文件错误等内容,总结的非常细致全面。
社区模板帮助中心,点此进入>>
云计算中的部分存储基础知识整理,包括:开源企业存诸freenas、Account、storage、Sharing。
网络基础知识思维导图,主要内容有网络范围、网络模型(标准)、单位、数据发送方式、数据包装格式、网络层IP协议、网络设备路由器/交换机设置。
这是一篇关于第五部分 Linux 系统管理员的思维导图,从chapter 20 启动流程、模块管理与Loader、内核与内核模块、内核模块查看、initrd的重要性与创建initrd文件、内核功能中的vga设置、init配置文件错误等内容,总结的非常细致全面。
Linux
第二部分 Linux 文件、目录与磁盘格式
chapter 6 Linux 的文件权限与目录配置
用户与用户组
Linux 中,任何一个文件都具有 User,Group,Others 3中身份的个别权限
每个账号都可以有多个用户组的支持
Linux 用户身份与用户组记录的文件
/etc/passwd
记录所有系统上的账号与一般身份用户还有 root 的相关信息
/etc/shadow
记录个人密码
/etc/group
记录所有组名
Linux 文件权限
Linux 文件属性
查看
ls -al
列出所有的文件的详细的权限与属性,包含隐藏文件
显示信息 7 字段
第一字段代表文件的类型与权限
含10个字符
第一个字符代表文件类型
d 表示是目录
- 表示是文件
l 表示是连接文件(linkfile)
b 表示是设备文件里面的可供存储的接口设备
c 表示是设备文件里面的串行端口设备
剩余的字符,3 个为一组且均为 rwx 这 3 个参数的组合
共 3 组
第一组
文件所有者权限
第二组
同用户组权限
第三组
其他人权限
3 参
r 代表可读(read)
w 代表可写(write)
x 代表可执行(execute)
3 个权限参数位置不会改变,没有某项权限即为 -
第二字段,连接数,表示有多少文件名连接到此节点(i-node)
第三字段,文件所有者,表示该文件或目录的所有者账号
第四字段,用户组,表示该文件的所属用户组
第五字段,文件容量,表示该文件容量大小,单位B
第六字段,修改日期,表示该文件的创建日期或最近修改日期
第七字段,文件名,若文件名之前多个 . 则代表是隐藏文件

修改文件属性与权限
改变文件所有者
chown
chown [-R] 账号名称 文件或目录
-R:进行递归的持续更改,即连同子目录下的所有文件一起更改
账号名称:必须是已经存在系统中账号,即记录在 /etc/passwd 中的
chown [-R] 账号名称 :组名 文件或目录
同时修改所有者和用户组
另一种写法,用小数点隔开
chown user.group file
同时修改
chown .group file
单纯修改用户组
改变文件所属用户组
chgrp
chgrp [-R] 组名 dirname/filename
组名:也必须要在 /etc/group 内存在
改变文件的权限
数字类型改变文件权限
rwx 三种权限的有无类比于1,0两种状态,再辅以各个权限的权重 (r -> 2次幂,w-> 1次幂,x->0次幂)
r:4
w:2
x:1
每种身份(owner,group,others)的权限分数为各自的三个(r,w,x)权限分数的累加
chmod [-R] xyz 文件或目录
xyz:就是数字类型的权限,为rwx属性值的累加
符号类型改变文件权限
用 u,g,o 代表三种身份,再加个 a 代表全部的身份(u,g,o 三个全部的意思),再辅以设置符号 +(单增加某项权限),-(单去掉某项权限),=(设置)
目录于文件的权限的意义
权限对文件的意义
r(read)
可读取此文件实际内容,如读取文本文件的文字内容
w(write)
可以编辑、新增或者修改该文件内容,但不具有删除该文件本身的权限
x(eXecute)
该文件可被系统执行
权限对目录的意义
r(read contents in directory)
表示具有读取目录结构列表的权限,可以查询该目录下的文件名数据,可以使用 ls 将该目录内容列表显示出来
w(modify contents of directory)
表示具有更改该目录结构列表的权限
可以新建新的文件与目录
可以删除已经存在的文件与目录,无论该文件的权限是什么
可以将已存在的文件或目录重命名
可以转移该目录内的文件、目录位置
x(access directory)
代表用户能否进入该目录成为工作目录
Linux 文件种类与扩展名
文件种类
普通文件(regular file)
-
依照内容又可分
纯文本文件(ASCII)
二进制文件(binary)
数据格式文件(data)
目录(directory)
d
连接文件(link)
l
设备与设备文件(device)
块(block)设备文件
b
存储数据以提供系统随机访问的接口设备,硬盘、软盘等
字符(character)设备文件
c
串行端口的接口设备,键盘、鼠标等
套接字(sockets)
s
数据接口文件,/var/run 中常见
管道(FIFO,pipe)
p
linux文件扩展名
*.sh
脚本或批处理文件(script)
*.Z、*.tar、*.tar.gz、*.zip、*.tgz
经过打包压缩的文件
*.html、*.php
网页相关文件
linux 文件名长度限制
默认的 Ext2/Ext3 文件系统
单一文件或目录的最大容许文件名为255个字符
包含完整路径名称及目录(/)的完整文件名为 4096 个字符
文件名限制
要避免的特殊字符
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
要避免文件名开头为
- 或 +
Linux 目录配置
linux 目录配置标准 FHS(Filesystem Hierarchy Standard)
根据目录树架构定义出三层目录
/(root,根目录)
与开机系统有关
/usr(UNIX software resource)
与软件安装/执行有关
/var(variable)
与系统运作过程有关
根目录(/)的意义与内容
FHS 标准建议:根目录所在分区应该越小越好且应用程序所安装的软件最好不要与根目录放在同以分区内
FHS 定义出根目录下面应该要有的子目录及所放置的内容
/bin
系统有很多放置可执行文件的目录,/bin 放置的是在单用户维护模式下还能够被操作的命令,/bin 下面的命令可以被 root 与一般账号所使用,也是启动时会用到的命令(cat,chmod,chown,date,mv,mkdir,cp,bash 等)
/boot
放置开机会使用到的文件,包括Linux内核文件以及开机菜单与开机所需配置文件等
/dev
再Linux系统上,任何设备与接口设备都是以文件的形式存在于这个目录中,访问这个目录中的文件就等于访问某个设备(/dev/null,/dev/zero,/dev/tty,/dev/lp*,/dev/hd*,/dev/sd* 等)
/etc
系统主要配置文件几乎都在这,该目录下的各文件属性可以让一般用户查阅,但只有 root 有权限修改(/etc/inittab,/etc/init.d/,/etc/modprobe.conf,/etc/X11,/etc/fstab,/etc/sysconfig 等)
/etc/init.d/
所有服务的默认启动脚本都放在这里
/etc/xinetd.d/
所谓的 super daemon 管理的各项服务的配置文件目录
/etc/X11
与 X Window 有关的各种配置文件都在这,尤其是 xorg.conf 这个 XServer 的配置文件
/home
系统默认的用户主文件夹,主文件夹两种代号
~
代表目前这个用户的主文件夹
~vincent
代表vincent 的主文件夹
/lib
/lib 放置的是开机时会调用的函数库以及 在/bin 或 /sbin 下面的命令会调用的函数库,尤其重要的是 /lib/modules/,其内放置的是内核相关的模块(驱动程序)
/media
这里放置的是可删除的设备,包括软盘、光盘、DVD等设备都暂时挂载于此,文件名:/media/floppy,/media/cdrom
/mnt
用来暂时挂载某些额外的设备
/opt
给第三方软件放置的目录
/root
系统管理员的主文件夹,为啥放在这?亦即 root 的主文件夹与根目录放置在同一分区的目的:进入单用户维护模式而仅挂载根目录时就能拥有root 主文件夹
/sbin
放在/sbin 下面的命令为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的命令,某些服务器软件程序一般在 /usr/sbin/当中,本机自行安装的软件所产生的系统执行文件则放置在 /usr/local/sbin/ 当中,常见命令包括 fdisk,fsck,ifconfig,init,mkfs 等
/srv
一些网络服务所需要取用的数据目录,比如 WWW服务需要的网页数据就可以放置到 /srv/www/里面
/tmp
让一般用户或正在执行的程序暂时放置文件的地方,任何人都能访问
其他的非 FHS 定义的标准但也重要的目录
/lost+found
使用标准的 Ext2/Ext3 文件系统才产生的目录,用来当文件系统发生错误时将一些丢失的片段放置到该目录下
/proc
该目录本身是个虚拟文件系统,所放置的数据都在内存中,如系统内核、进程、外部设备的状态及网络状态等,较重要的文件有 /proc/cpuinfo,/proc/dma,/proc/interrupts,/proc/ioports,/proc/net/* 等
/sys
也是个虚拟文件系统,主要记录与内核有关的信息,包括目前已加载的内核模块与内核检测到的硬件设备信息等
不能与根目录分开(放到不同分区)的目录
/etc
配置文件
/bin
重要执行文件
/dev
所需要的设备文件
/lib
执行文件所需要的函数库与内核所需的模块
/sbin
重要的系统执行文件
都与开机过程有关,不能与根目录分家,开机过程仅有根目录被挂载
/usr 的意义与内容
建议该目录下要有的子目录与放置的内容
/usr/X11R6/
是 X Window 重要数据所放置的目录
/usr/bin/
绝大部分用户可使用的命令都在这
/usr/include/
c/c++等程序语言的头文件(header)与包含文件 (include) 放置处
/usr/lib/
包含各应用软件的函数库、目标文件以及不被一般用户惯用的执行文件或脚本,x86_64的系统会有 /usr/lib64
/usr/local/
系统管理员在本机下载安装自己的软件建议安装到此目录
/usr/sbin/
非系统正常运行所需要的命令,最常见的就是网络服务器软件的服务命令
/usr/share/
放置共享文件的地方,最常见的:
/usr/share/man
man page 在线帮助文件
/usr/share/doc
软件的文件说明
/usr/share/zoneinfo
与时区有关的时区文件
/usr/src/
源码放置的地方
/var 的意义与内容
/var/cache/
应用程序本身运行过程中会产生的一些暂存文件
/var/lib/
程序本身执行过程中需要使用到的数据文件放置目录,各自软件在此目录下有各自的目录。如MySQL的数据库位置 /var/lib/mysql,rpm 的数据库在 /var/lib/rpm目录下
/var/lock/
某些设备或文件资源一次只能被一个应用程序所使用,通过对设备上锁以确保该设备只会给单一软件使用
/var/log/
登录文件放置的目录,较重要的文件:/var/log/messages,/var/log/wtmp(记录登录者的信息)
/var/mail/
放置个人电子邮件信箱的目录,也被放置到 /var/spool/mail 目录,这两个文件互为连接文件
/var/run/
某些程序或服务启动后,会将他们的 PID 放置到这个目录
/var/spool/
该目录通常放置队列数据,排队等待其他程序使用的数据
目录树(directory tree)
特性
目录树的起始点为根目录
每个目录不只能使用本地端的文件系统,也可以使用网络上的文件系统,比如利用NFS(Network File System)服务器挂载某特定目录
每个文件在此目录树中的文件名都是独一无二的
绝对路径与相对路径
绝对路径
由根目录开始写起的文件名或目录名称
相对路径
相对于目前路径的文件名写法
特殊的目录
.
代表当前的目录,也可以用 ./ 来表示
..
代表上一层目录,也可以用 ../ 来表示
-
代表前一个工作目录
chapter 7 Linux 文件与目录管理
目录与路径
目录的相关操作
cd
切换目录
cd [相对路径或绝对路径]
pwd
显示当前目录
pwd [-P]
-P:显示当前的路径,而非使用连接(link)路径,即若所在的目录文件是连接文件,会显示它连接到的那个文件正确的完整路径

mkdir
新建一个新的目录
mkdir [-mp] 目录名称
m:配置文件的权限,直接设置一个权限值,不管默认权限(umask)
-p:直接将所需要的目录(包含上层目录)递归创建起来
rmdir
删除一个空的目录也仅能删除空目录
rmdir [-p] 目录名称
-p:连同上层空的目录一起删除
文件与目录管理
查看文件与目录
ls [-aAdfFhilnrRSt] 目录名称
-a:全部的文件,连同隐藏文件一起列出来
-A:列出全部文件(连同隐藏文件,但不包括 . 与 .. 这两个目录)
-d:仅列出目录
-f:直接列出结果,而不进行排序(ls 默认会以文件名排序)
-F:根据文件、目录等信息给予附加数据结构,* 代表可执行文件,/ 代表目录,=代表 socket 文件,| 代表 FIFO 文件
-h:将文件容量以较易读的方式(GB,KB)列出来
-i:列出 i-node 号码
-l:列出长数据串,包含文件的属性与权限等
-n:列出 UID 与 GID,而非用户与用户组的名称
-r:将排序结果反向输出
-R:连同子目录内容一起列出来
-S:以文件容量大小排序,而不是以文件名排序
-t:依时间排序
ls [--color={never,auto,always}] 目录名称
--color=never
不要依据文件特性给予颜色显示
--color=always
显示颜色
--color=auto
让系统自行依据设置来判断是否给予颜色
ls [--full-time] 目录名称
--full-time
以完整时间模式(包含年、月、日、时、分)输出
--time={atime,ctime}
输出访问时间或权限属性改变时间(ctime)而非内容更改时间(modufication time)
复制、删除与移动
复制文件或目录
cp [-adfilprsu] 源文件(source) 目标文件(destination)
-a:相当于 -pdr 的意思
-d:若源文件为连接文件的属性(即为软连接文件),则复制连接文件属性而非文件本身,若不加参数d ,则复制的是源文件
-f:强制,若目标文件已经存在且无法开启,则删除后在尝试一次
-i:若目标文件已经存在时在覆盖前会先询问用户
-l:进行硬连接(hard link)的连接文件创建而不是复制文件
-p:连同文件的属性一起复制而不使用默认属性(备份用)
-r:递归持续复制,用于目录的复制行为
-s:复制成为符号连接文件(symbolic link),即快捷方式文件
-u:若destination 比 source 旧才更新 destination
cp [options] source1 source2 source3 ... directory
需要注意,若源文件有两个以上(将多个数据一次复制到同一个目录去),则最后一个目的文件一定要是目录
默认的条件中,cp 的源文件与目的文件的权限不同,目的文件的所有者通常会是命令操作者
移除文件或目录
rm [-fri] 文件或目录
f:强制删除,忽略不存在的文件,不会出现警告信息
-r:递归删除,最常用在目录删除
-i:互动模式,删除前会询问用户是否操作
注意:在命令前面加上反斜杠 \ 可以忽略掉 alias 的指定参数
移动文件与目录或更名
mv [-fiu] source destination
-f:强制,如果目标文件已存在不会询问而直接覆盖
-i:若目标文件已存在会询问是否覆盖
-u:若目标文件已存在且 source 比较新才会更新
mv [options] source1 source2 source3 ... directory
同样,将所有数据移动到一个目录时,最后一个目标文件一定要是目录
取得路径的文件名与目录名称
basename 路径
取得文件名
dirname 路径
取得目录名

文件内容查阅
直接查看文件内容
cat
由第一行显示文件内容
cat [-AbEnTv] 文件
-A:相当于 -vET 的整合参数,可列出一些特殊字符而不是(看起来显示成)空白而已
-b:列出行号,仅针对非空白行做行号显示,空白行不标行号
-E:将结尾的断行字符 $ 显示出来
-n:打印出行号,连同空白行也会有行号
-T:将 Tab 按键以 ^I 显示出来
-v:列出一些看不出来的特殊字符
tac
从最后一行开始显示,与 cat 相反
tac 文件
nl
显示的时候输出行号
nl [-bnw] 文件
-b:设置行号指定的方式
-b a
表示无论是否为空行都列出行号,类似 cat -n
-b t
如果有空行,空的那行不要列出行号(默认值)
-n:列出行号表示的方法
-n ln
行号在屏幕的最左方显示
-n rn
行号自己字段的最右方显示且不加 0
-n rz
行号在自己字段的最右方显示且加 0
-w:行号字段占用的位数

可翻页查看
more 文件
按键命令
空格键(space)
向下翻一页
Enter
向下滚动一行
/字符串
在显示内容中向下查询”字符串“,重复查询直接 按 n
:f
立刻显示出文件名以及目前显示的行数
q
离开 more
b 或 ctrl+b
往回翻页,只对文件有用
less 文件
按键命令
空格键
向下翻动一页
PageDown
向下翻动一页
PageUp
向上翻动一页
/字符串
向下查询字符串
?字符串
向上查询字符串
n
重复前一个查询(与 / 或 ? 有关)
N
反向重复上一个查询(与 / 或 ? 有关)
q
离开less
数据选取
head
取出前面几行
head [-n number] 文件
-n:后面接数字,代表显示几行,不加参数默认显示 10 行
number 为负数代表显示开始到倒数第几行的内容
tail
取出后面几行
tail [-n number] [ -f ] 文件
-n:后面接数字,代表显示几行,不加参数默认也是 10 行
非纯文本文件
od [-t TYPE] 文件
-t:后面接各种 类型(TYPE)的输出
a
利用默认字符来输出
c
使用 ASCII 字符来输出
b[size]
利用十进制(decimal)来输出数据,每个整数占用 size bytes
f[size]
利用浮点数(floating)来输出数据,每个数占用 size bytes
o[size]
利用八进制(octal)来输出数据,每个整数占用 size bytes
x[size]
利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes

修改文件时间或创建文件 touch
文件时间参数
mtime
modification time
当文件的内容数据更改时,这个时间会被更新
ls 默认显示的就是这个时间
ctime
status time
当文件的状态改变时会更新这个时间,状态就是文件的权限与属性
atime
access time
当文件的内容被取用时(比如使用 cat 去读取)就会更新这个时间
touch [-acdmt] 文件
a:仅修改访问时间
-c:仅修改文件的时间,若该文件不存在也不创建新文件
-d:后面可以接欲修改的日期而不用目前的时间,也可以使用 --date="日期或时间"
-m:仅修改 mtime
-t:后面可以接欲修改的时间而不用目前时间格式[YYMMDDhhmm]
文件与目录的默认权限与隐藏权限
文件默认权限
umask
指定目前用户在新建文件或目录时候的权限默认值
umask 值是要在原本默认权限上拿掉的权限
查看当前默认值
直接 umask 命令查看数字形态的权限值
加入 -S 参数以符号类型显示权限值

”原本“的默认权限
新建文件
666
u=rw,g=rw,o=rw
新建目录
777
u=rwx,g=rwx,o=rwx
umask=0022,一般权限是后3位022,u 的权限全部保留,g 的权限要拿掉w(2)的权限,同样 o 的权限拿掉 w 的权限结果就是
新建文件
644
u=rw,g=r,o=r
新建目录
755
u=rwx,g=rx,o=rx
这才是默认权限
修改 umask
umask 新值
e.g:umask 002
文件隐藏属性
查看隐藏属性
lsattr [-adR] 文件或目录
-a:将隐藏文件的属性也列出来
-d:如过接的是目录,仅列出目录本身的属性而不列出目录内的文件名
-R:连同子目录的数据也一并列出来
设置隐藏属性
chattr [+-=] [ASacdistu] 文件或目录
+:不改动原本存在的参数情况下,增加某一个参数
-:不改动原本存在的参数情况下,拿掉(删除)某一个参数
=:直接设置成后面接的参数
-A:当设置了 A 属性,若有访问此文件或目录时,它的访问时间 atime 不会被修改
-S:一般文件是异步写入磁盘,如果设置了 S 属性,当有进行任何修改时,该改动会同步写入磁盘
-a:当设置了 a 属性,该文件将只能增加数据,而不能删除也不能修改数据。只有 root 才能设置该属性
-c:当设置了 c 属性,将会自动将被设置的文件压缩,在读取的时候会自动解压缩,在存储的时候将会先进行压缩再存储
-d:当 dump 程序被执行时,设置了 d 属性将可使该文件或目录不会被 dump 备份
-i:最厉害!设置了 i 属性,那么这个文件不能被删除、改名、设置连接,也无法写入或添加数据。只有 root 能设置此选项
-s:当设置了 s 属性,如果文件被删除将会完全从这个硬盘空间中删除
-u:与 s 相反,当设置了 u ,如果该文件被删除了,则数据内容还存在磁盘中,可以找回文件

文件特殊权限 UID,GID,SBIT
SetUID
s 标志出现在文件所有者的 x 权限上,被称为 Set UID,简称 SUID 的特殊权限
限制与功能
SUID 权限仅对二进制程序有效
执行者对该程序需要具有 x 的可执行权限
本权限仅在执行该程序的过程中有效
执行者将具有该程序所有者的权限

/etc/shadow 文件只有 root 具有可读且强制写入的权限,按这种逻辑一般用户是没办法自己修改自己账号密码的!但是一般用户对 /usr/bin/passwd 具有可执行权限

/usr/bin/passwd 这个文件又具有 SUID 的特殊权限,那么一般用户在执行 passwd 时就会暂时获得 passwd 程序所有者 root 的权限从而设置自己的密码,这就是 SUID 的神奇伟大!
SetGID
当 s 标志出现在用户组的 x 权限上时,被称为 Set GID,简称 SGID 的特殊权限
限制与功能
SGID 对二进制程序有用
程序执行者对该程序需具有 x 的权限
执行者在执行过程中会获得该程序用户组的支持

查找文件命令 locate 是通过查询 /var/lib/mlocate/mlocate.db 这个数据库来完成的,看 该文件权限一般用户没有 read 的权限应该不能使用该命令的,但是!!一般用户对 /usr/bin/locate 具有可执行的权限

/usr/bin/locate 这个文件又具有 SGID 的特殊权限,那么一般用户在执行 locate 命令时会暂时获得 locate 程序用户组 slocate 的支持,就具有了 read 的权限从而能够执行 locate 查询
对目录设置 SGID 特殊权限
当一个目录设置了 SGID 权限后
用户若对此目录具有 r,x 的权限,该用户能够进入此目录
用户在此目录下的有效用户组将会变成该目录的用户组
若用户在此目录下具有 w 的权限,则用户所创建的新文件的用户组与此目录的用户组相同
利用在项目开发环境设置
Sticky Bit
SBIT
z只针对目录有效
SBIT 对于目录的作用
当用户对于此目录具有 w,x 权限,即具有写入的权限时,那么当用户在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
目录加了 SBIT 后,所有能够进入该目录进行新建、删除、重命名、移动文件或目录等操作的用户除 root 外就只能管理自己所创建的文件或目录,其他人创建的无权干涉!
t 出现在 others 权限位的 x 上面
SUID,SGID,SBIT 权限设置
数字法
权重分配
SUID
4-->2次幂
SGID
2-->1次幂
SBIT
1-->0次幂
将各自的权重值加载一般权限最前面即可
比如某文件一般权限为755
若要设置 SUID
chmod 4755 filename
若要设置 SGID
chmod 2755 filename
若针对某目录设置 SBIT,一般权限也为 755
chmod 1755 directory
符号法
一般权限 u=rwx,g=rx,o=rx
设置 SUID
chmod u+s filename
设置 SGID
chmod g+s filename
设置 SBIT
chmod o+t directory
S 与 T 的情况
当 owner,group,other 都没有 x 权限,即一般权限为 666,但又设置了特殊权限 chmod 7666 file,此时 SUID 和 SGID 对应位上就显示 S,SBIT 位上显示 T,称文件具有空的 SUID/SGID 权限

查看文件类型
ASCII ?
data ?
binary ?
use share library or not ?
file 文件名

命令与文件查询
脚本文件名查询
which
根据 PATH 环境变量所规范的路径去查找可执行文件的文件名
which [-a] command
-a:将所有由 PATH 目录中可以找到的命令均列出,而不只是第一个被找到的命令名称

type
type 找到后面的名称时,如果后面接的名称并不能以执行文件的状态被找到,那么该名称就不会被显示出来
type [-tpa] name
不加参数会显示name是外部命令还是bash内置命令
加入 -t 参数,type 会将name以以下字眼显示其意义
file,表示为外部命令
alias,表示该命令为命令别名所设置的名称
builtin,表示该命令为bash内置命令
-p,如果name为外部命令,则显示完整文件名
-a,由PATH变量定义的路径中,将所有含有name的命令列出来,包含alias

文件名查找
利用数据库查找
whereis
寻找特定文件
whereis [-bmsu] 文件或目录
-b:只找二进制格式文件
-m:只找在说明文件 manual 路径下的文件
-s:只找 source 源文件
-u:查找不再上述三个选项中的其他他叔文件

locate
依据 /var/lib/mlocate内的数据库记载找出用户输入的关键字文件名
locate [-ir] keyword
-i:忽略大小写
-r:后面可接正则表达式的显示方式

新建的文件后查找不到,需要手动更新数据库才行
updatedb
find
直接查找硬盘
find [PATH] [option] [action]
与时间有关的参数
[ -atime | -ctime | -mtime ]
以 -mtime 说明
-mtime n
n 为数字,意义为在 n 天之前的"一天之内"被改动过的文件
-mtime +n
列出在 n 天之前(不含 n 天本身)被更改过的文件名
mtime -n
列出在 n 天之内(含 n 本身)被更改过的文件名
-newer file
file 为一个存在的文件,列出比 file 还要新的文件名

+4
代表大于等于5天前的文件名
e.g:find /var -mtime +4
-4
代表小于等于4天内的文件名
e.g:find /var -mtime -4
4
代表4~5那一天的文件名
e.g:find /var -mtime 4
与用户或用户组名有关的参数
-uid n
n 为数字,是用户的账号ID,即UID
-gid n
n 为 GID
-user name
name 为用户账号名称
找出任何一个用户在系统当中的所有文件
-group name
name 为用户组名
-nouser
寻找文件的所有者不存在于 /etc/passwd 中的文件
找出系统中不属于任何人的文件
-nogroup
寻找文件的用户组不存在于 /etc/group 中的文件
与文件权限及名称有关的参数
-name filename
查找文件名为 filename 的文件
-size [+-] SIZE
查找比 SIZE 还要大(+)或小(-)的文件
SIZE 规格
c
代表 byte
k
代表 1024 bytes
e.g:要找比 50KB 还要大的文件就是 -size +50k
-type TYPE
查找文件类型为 TYPE 的
TYPE 主要有
f
一般正规文件
b,c
设备文件
d
目录
l
连接文件
s
socket
p
FIFO
-perm mode
查找文件权限"刚好等于" mode 的文件,这个 mode 为类似 chmod 的属性值,e.g:-rwsr-xr-x 的属性值为4755
-perm -mode
查找文件权限"必须全部包括 mode 的权限"的文件,e.g:要查找 -rwxr--r-- 即0744 的文件,使用 -perm -0744,当一个文件权限为 -rwsr-xr-x 即 4755 时也会被列出来,因为 -rwsr-xr-x 的属性已经包含了 -rwxr--r-- 的属性了
-perm +mode
查找文件权限"包含任一 mode 的权限 "的文件,e.g:查找 -rwxr-xr-x ,即使用 -perm +755,一个文件属性为 -rw------- 也会被列出来,因为它有 -rw...的属性存在
e.g:找出文件当中含有 SUID 或 SGID 或 SBIT 的属性的文件
find / -perm +7000
只要含有 s 或 t 的就列出来 ---s--s--t
若是 -7000,就是找出文件当中三个特殊权限都有的文件
其他可进行的操作
-exec command
command 为其他命令,-exec 后面可再接其他的命令来处理查找到的结果
e.g:将查找到的文件系统中含有 SUID 或 SGID 或 SBIT 的文件使用 ls -l 列出来
find / -perm +7000 -exec ls -l {}\;
find 的特殊功能就是能够进行额外的动作,几个特殊符号意义
{}
代表的是由 find 找到的内容
-exec
是关键字,代表 find 额外命令的开始
\;
也是关键字,代表 find 额外命令的结束
因为 ; 在 bash 环境下是有特殊意义的,因此利用反斜杠来转义
在这两个关键字之间的就是 find 命令内的额外命令,即 ls -l {}
将结果打印到屏幕上,默认操作
chapter 8 Linux 磁盘与文件系统管理
认识 EXT2 文件系统
磁盘组成与分区
磁盘的组成
机械手臂与机械手臂上的磁头(可读写盘片上的数据)
主轴马达,可以转动盘片,让机械手臂上的磁头在盘片上读写数据
圆形的盘片(主要记录数据部分)
盘片的物理组成
扇区(sector)为最小的物理存储单位,每个扇区为 512 bytes
将扇区组成一个圆,那就是柱面(Cylinder),柱面是分区(partition)的最小单位
第一个扇区最重要,里面有硬盘主引导记录(Master Boot Record,MBR )及分区表(pertition table),其中 MBR 占有 446 bytes,而 partition table 仅占有 64bytes
各种接口的磁盘在 Linux 中的文件名
SCSI,SATA,USB,Flash 等接口的磁盘文件名
/dev/sd[a-p][1-15]
IDE接口的磁盘文件名
/dev/hd[a-d][1-63]
磁盘分区
告诉操作系统,这块磁盘在此分出可以访问的区域是由 A 柱面到 B 柱面之间的块
何为磁盘分区
指定分区的起始与结束柱面
指定分区的柱面范围记录在哪?
就在第一扇区的分区表内
分区表仅有 64 bytes,最多只能记录4条分区记录,这4条记录称为主(primary)分区或扩展(extended)分区,其中扩展分区可以再分出逻辑分区(logical),能被格式化的仅有主分区与逻辑分区
Summary
主分区与扩展分区最多可以有 4 个(磁盘的限制)
扩展分区最多只能有一个(操作系统的限制)
逻辑分区是由扩展分区继续分出来的分区
能够被格式化后作为数据访问的分区为主要分区和逻辑分区,扩展分区无法格式化
逻辑分区数量依磁盘接口而不同,在Linux 系统中,IDE硬盘最多有59个逻辑分区(5号到 63 号),SATA 硬盘则有11个逻辑分区(5号到15号)
文件系统特性
每种操作系统所能使用的文件系统并不相同
windows 98以前的系统
FAT(或FAT16)文件系统
windows 2000 以后的版本
NTFS 文件系统
Linux 正规文件系统
EXT2
称谓的改变
不再是一个文件系统就是一个分区,而是称一个可被挂载的数据为一个文件系统(有了 LVM 与 RAID 技术的加持)
文件系统的运行与操作系统的文件数据有关
Linux操作系统的文件数据
文件实际内容
文件权限(rwx)与文件属性(所有者、群组、时间参数等)
文件系统通常将这两部分数据分别存放在不同的块,权限与属性放置到 inode 中,实际数据则放置到 data block 块中,还有一个超级块(super block)会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等
Summary:
索引式文件系统
super block
记录此文件系统的整体信息,包括 inode/block 的总量、使用量、剩余量,以及文件系统的格式与相关信息
inode
记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码
block
实际记录文件的内容,若文件太大会占用多个 block
U盘是使用的文件系统是 FAT 格式
依序将 block 读出后才知道下一个 block 在何处
碎片整理
就是文件写入的 block 太过于离散,此时文件读取的性能将会变得很差,通过碎片整理将同一个文件所属的 block 汇合在一起,这样数据的读取会较容易
linux 的 Ext2 文件系统
磁盘分区完要进行格式化,经过格式化区分为多个块组(block group),每个块组都有独立的 inode/block/superblock 系统
在整体规划中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装引导装载程序
图解

每个块组的主要内容
super block
超级块,记录整个文件系统相关信息,主要有
block 与 inode 总量
未使用与已使用的 inode/block 数量
block 与 inode 的大小(block 为 1K,2K,4K ,inode 为 128 bytes)
文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
一个 validbit 值
validbit=0
表示该文件系统已经被挂载
validbit=1
表示该文件系统未被挂载
大小为 1024 bytes
信息查看命令
dumpe2fs
实际上,除了第一个 block group 内会含有 super block,后续的 block group 不一定会含有,若含有 super block 那么这个 super block 也是作为第一个 block group 内 super block 的备份
文件系统描述
作用
该区段描述每个 block group 的开始与结束的 block 号码
说明每个区段(super block,bitmap,inodemap,data block)分别介于哪个 block 号码之间
信息查看命令
dumpe2fs
块对照表(block bitmap)
作用
记录了使用与未使用的 block 号码
inode 对照表(inode bitmap)
作用
记录使用与未使用的 inode 号码
inode table(inode 表格)
inode table 就是 inode 表格,包含多个 inode
再谈 inode
主要记录文件的属性以及该文件实际数据所在的 block 号码
inode 记录的文件数据主要内容
该文件的访问模式(read/write/excute)
该文件的所有者与组(owner/group)
该文件大小
该文件创建或状态改变的时间(ctime)
最近一次的读取时间(atime)
最近修改的时间(mtime)
定义文件特性的标志(flag),如 SetUID 等
该文件正真内容的指向(pointer)
特色
每个 inode 大小固定为 128 byts,格式化时就固定了的,另外记录一个 block 号码 要 4 bytes
每个文件都仅会占用一个 inode
文件系统能够创建的文件数量与 inode 数量有关
系统读取文件时先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容
结构
记录文件权限/属性的区域
记录 block 号码的区域
包括
12 个直接记录区
对应 12 个 block
12 x 1K
12K
一个间接记录区
意味着有一个 block 用来记录 block 号码,也就有 1K(1024bytes)/4 bytes=256 条记录
对应 256 个 block
256 x 1K
256K
一个双间接记录区
意味着有 256 x 256 个 block 用来记录 block 号码,也就有 256 x 256 条记录
对应 256 x 256 个block
256 x 256 x 1K
256 x 256 K
一个三间接记录区
也意味着有 256 x 256 x 256 个 block 用来记录 block 号码,也就有 256 x 256 x 256 条记录
对应 256 x 256 x 256 个 block
256 x 256 x 256 x 1K
256 x 256 x256 K
12 + 256 + 256 ² + 256 ³= 16 GB
直接
直接指向 block 号码的对照,能够直接取得 block 号码
间接
再拿一个 block 来当作记录 block 号码的记录区
双间接
第一个 block 仅再指出下一个记录 block 号码的 block 在哪,实际记录在第二个 block 中
三间接
实际 block 号码记录在第三层 block 中
若格式化时 block 大小为 1K,那么 inode 可以指定多少 block? 亦即能支持的单一文件最大容量多大?
这种计算方法只针对 block 为 1K 的,大于 2K 的 block 将会收到 Ext2 文件系统本身的限制,计算结果与实际不符
data block(数据块)
放置文件内容的地方
Ext2 文件系统所支持的 block 大小
1K
2K
4K
限制
原则上,block 的大小与数量在格式化完就不能够在改变了(除非重新格式化)
每个 block 内最多只能够放置一个文件的数据,如果文件大于 block 大小则一个文件会占用多个 block ;若文件小于 block ,则该 block 的剩余空间就不能再被使用了(磁盘空间会浪费)
容量限制,因为 block 大小而产生的 Ext2 文件系统限制
文件系统查看
dumpe2fs
查看文件系统的 super block 及每个区段的信息
dumpe2fs [-bh] 设备文件名
-b:列出保留为坏道的部分(基本用不到)
-h:仅列出 super block 的数据,不会列出其他区段的内容
显示信息
super block 信息块

block group 信息块

与目录树的关系
目录与文件在 Ext2 文件系统中如何记录数据
首先搞清楚两点
在 linux 系统下,每个文件(不管是一般文件还是目录文件)都会占用一个 inode,并且可依据文件内容大小来分配多个 block 给该文件
目录的内容在记录文件名,而一般文件则是实际记录数据内容的地方
目录
当在 linux 下的 Ext2 文件系统中创建一个目录时,ext2 会分配一个 inode 与至少一块 block 给该目录,其中,
inode
inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 的号码
block
block 则是记录该目录下的文件名与该文件名占用的 inode 号码数据
查看某个目录下的文件所占用的 inode 号码
ls -li

在目录下面的文件数如果太多而导致一个 block 无法容纳所有的文件名与 inode 对照表时,linux 会给予该目录多一个 block 来继续记录相关信息
文件
当在 linux 下的 ext2 新建一个一般文件时,ext2 会分配一个 inode 与相对于该文件大小的 block 数量给该文件
目录树读取
inode 本身并不记录文件名,文件名是记录在目录的 block 当中,因此当要读取某个文件时,就势必会经过目录的 inode 与 block,然后才能找到那个待读取文件的 inode 号码,最终才会读到正确的文件的 block 内的数据
目录树的读取是由根目录开始读起,系统通过挂载信息找到挂载点的 inode 号码(通常一个文件系统的最顶层 inode 号码由 2 号开始),拿到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的文件名

Ext3 的由来及日志文件系统的功能
再来详细看看在创建一个目录或者文件时,ext2 如何处理的?
新增一个文件
1st step
文件系统首先确定用户对于欲添加文件的目录是否具有 w 和 x 的权限,若有才能添加
2nd step
根据 inode bitmap 找到没有使用的 inode 号码,将新文件的权限与属性写入
3rd step
根据 block bitmap 找到没有使用的 block 号码,并将实际数据写入 block 中,并且更新 inode 的 block 指向数据
4th step
将刚才写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 super block 的内容
两个名词
数据存放区域
inode table
data block
metadata(中间数据)
super block
block bitmap
inode bitmap
这些区段的数据经常变动,每次添加、删除、编辑时都可能会影响这三部分的数据,故称为中间数据
数据的不一致状态
当文件在写入文件系统时因不明原因导致系统中断,那么写入的数据仅有 inode table 与 data block 而已,最后的同步中间数据步骤没做完,此时就会发生 meta data 的内容与数据存放区不一致的情况
对此,Ext2 文件系统是怎么处理的?
在系统重启时,会通过 super block当中记录的 validbit(是否有挂载) 与文件系统的 state(clean 与否)等状态来决定是否要强制进行数据一致性检查(针对 meta data 区域与实际数据存放区域来进行比对),若需要则以 e2fsck 这支程序来进行。相当相当的耗时!
日志文件系统(Journaling file system)
在文件系统中规划出一个块来专门记录写入或修订文件时的步骤,来简化一致性检查的步骤,即
预备
当系统要写入文件时,会先在日志记录块中记录某个文件准备要写入的信息
实际写入
开始写入文件的权限与数据,更新 meta data 的数据
结束
完成数据与 meta data 的更新后,在日志记录块中完成改文件的记录
如此,如果数据在记录的过程中发生问题,那么系统只要去检查日志记录块就知道哪个文件出问题,再针对该问题做一致性检查而不必对整个文件系统去检查
这也是 Ext3 文件系统具有的功能
来看看这个日志记录块在哪?
super block 中能看到

其他 linux 支持的文件系统与 VFS
linux 常见的支持的文件系统
传统文件系统
ext2
minix
MS-DOS
FAT(用 vfat 模块)
iso9660(光盘)
日志文件系统
ext3
ReiserFS
Windows'NTFS
IBM'sJFS
SGI'sXFS
网络文件系统
NFS
SMBFS
查看自己 linux 支持的文件系统

查看目前已加载到内存中支持的文件系统

Linux VFS(Virtual Filesystem Switch)
虚拟文件系统
整个linux 的系统通过 VFS 的内核功能去读取文件系统,即整个 linux 认识的文件系统都是 VFS 在进行管理
文件系统的简单操作
磁盘与目录的容量:df,du
df
列出文件系统的整体磁盘使用量
df [-ahikHTm] [目录或文件名]
-a:列出所有的文件系统,包括系统特有的 /proc 等文件系统
-k:以 KB 的容量显示各文件系统
-m:以 MB 的容量显示各文件系统
-h:以较易阅读的 GB、MB、KB 等格式显示
-i:不用硬盘容量而以 inode 的数量来显示
-H:以 M=1000K 替代 M=1024K 的进位方式
-T:连同该分区的文件系统类型也列出

du
评估文件系统的磁盘使用量(常用于评估目录所占容量)
du [-ahskm] 文件或目录名称
-a:列出所有的文件或目录容量,因为默认仅统计目录下面的文件量而已
-h:以较易读的方式(G/M)显示
-s:列出总量而已而不列出每个个别的目录占用容量
-S:不包括子目录下的总计
-k:以 KB 列出容量显示
-m:以 MB 列出容量显示

连接文件 ln
linux 下的两种连接文件
符号连接(软连接)symbolic link
就是创建一个独立的文件,而这个文件会让数据的读取指向它所连接的那个文件的文件名
使用 symbolic link 设置连接文件,会占用 inode 和 block
硬连接(实际连接)hard link
通过文件系统的 inode 连接来产生新文件名,而不是产生新文件
简单地说,hard link 只是在某个目录下新建一条文件名连接到某 inode 号码的关联记录而已,因此也造成多个文件名对应到同一个 inode 号码
使用 hard link 设置连接文件时,磁盘的空间与 inode 的数目基本都不会改变,hard link 只是在某目录下的 block 多写入一个关联数据而已,既不会增加 inode 也不会耗用 block 数量
限制
不能跨文件系统
不能连接到目录
ln [-sf] 源文件 目标文件
-s:如果不加任何参数设置的连接就是 hard link, 加了参数 -s 就是 symbolic link
-f:如果目标文件存在,就主动将目标文件删除后再创建
example

制作 /tmp/passwd 的 hard link passwd-hd,再来看看有啥变化

制作 /tmp/passwd 的 symbolic link passwd-so,再看看有啥变化

将源文件passwd 删除看看有啥影响

关于目录的连接数量
当新建一个目录时,新目录的连接数为 2 ,而上一层目录的连接数会加 1
空目录里面至少会存些啥?
. 与 .. 这两个目录
这也是为什么新目录的连接数 为 2 的原因
磁盘的分区、格式化、检验与挂载
在系统里面新增加一块磁盘,需要做些什么呢?
第一,对磁盘进行分区,以新建可用的分区
第二,对该分区进行格式化(format),以创建系统可用的文件系统
第三,再细致点,对刚新建好的文件系统进行检测
第四,在 linux 系统上,需要创建挂载点(也就是目录),并将其挂载上来
磁盘分区
fdisk
fdisk [-l] 设备名称
-l:输出后面接的设备所有的分区内容,若仅有 fdisk -l 时,则会把整个系统内能够找到的设备的分区均列出来
进入 fdisk 后的操作命令

m:键入 m 查看详细可用的命令
d:删除一个分区
n:新增一个分区
新增主分区
询问界面 键入 p
再设置分区号(1-4)
再设置分区起始柱面号码,直接 Enter 选用默认值
再设置结束柱面号,有两种方式
直接输入柱面的号码,需要自己计算柱面/分区的大小
用 +xxxM 来输入分区的大小,让系统自己分柱面号码,+ 与 M 必须要有,xxx 为数字,e.g:+512M
新增扩展分区
询问界面键入 e
后续直到设置结束柱面号码前操作都与新增主分区一样,只是设置结束柱面号码时直接键入 enter 来将所有未分区的区间都给扩展分区
新增逻辑分区
询问界面键入 l
如果已经分出了扩展分区,就只会有 logical/primary 的选项,并且不能再进行primary 的分区,只能选择 l
后续的操作与新增主分区一样
新建分区的状况
1-4 号尚有剩余,且系统未有扩展分区
此时会出现 Primary/Extended 的选项,用户可以指定1-4号间的号码
1-4 号尚有剩余,且系统有扩展分区
此时会出现 Primary/Logical 的选项,若选择 p ,用户还需指定1-4号间的号码,若选择 l,则不需要设置号码,系统会自动指定逻辑分区的文件名号码
1-4 号没有剩余,且系统有扩展分区
此时不会有挑选分区类型的选项,直接进入 logical 的分区形式
p:在屏幕上显示分区表
q:不存储,离开 fdisk 程序
w:将刚才的操作写入分区表
t:调整 System ID(LVM 使用)
限制
fdisk 无法处理大于 2TB 以上的磁盘分区,得使用 parted 命令
parted [ 设备 ] [ 命令 [ 参数 ] ]
命令功能
新增分区
mkpart [ primary | extended | logical ] [ ext3 | vfat ] 开始 结束
e.g:新增一个 512M 的逻辑分区

分区表
e.g:以 parted 列出目前本机得分区信息

Number
就是分区的号码,1 类似于 /dev/sda1
Start
表示起始柱面的位置
End
表示结束的柱面位置
Size
由上述两者的分析,得出这个分区的容量大小
Type
就是分区的类型,primary/extended/logical
File system
如同 fdisk 的 System ID
删除分区
rm [partition]
e.g:将新增的那个逻辑分区删除

分区完后,可以通过重启以更新内核的分区表信息,或者 执行 partprobe 来强制让内核读取新的分区表,操作不会有任何显示!
磁盘格式化
分区完要进行文件系统格式化
使用默认值进行格式化
mkfs(make file system)
mkfs [-t 文件系统格式] 设备文件名
-t:可以接文件系统格式,如 ext3,ext2,vfat 等

详细设置参数格式化
mke2fs [ -b block大小 ] [ -i block大小 ] [ -L 卷标 ] [ -cj ] 设备
-b:可以设置每个 block 大小,目前支持 1024,2018,4096 bytes 3种
-i:多少容量给予一个 inode
-c:检查磁盘错误,仅下达一次 -c 时,会进行快速读取测试,如果下达两次: -c -c 时,会测试读写(read-write)
-L:后面可以接卷标(lable)
-j:本来 mke2fs 是 ext2,加上 -j 会主动加入 journal 而成为 ext3
e.g:将 /dev/sda6 这个文件系统卷标设置为“vincent_logical”,block 指定为 2048,每 8192 bytes 分配一个inode,构建为 journal 的 ext3 文件系统

磁盘检验
检查文件系统是否出错
fsck(file system check)
fsck [-t 文件系统] [-ACay] 设备名称
-t:如同 mkfs,同样需要指定文件系统
-A:依据 /etc/fstab 的内容,将需要的设备扫描一次
-a:自动修复检查到的有问题的扇区
-y:与 -a 类似,但某些文件系统仅支持 -y 参数
-C:可以再检查的过程中使用一个直方图来显示目前的进度
EXT2/EXT3 的额外参数功能(e2fsck 这支命令提供)
-f:强制检查
-D:针对文件系统下的目录进行优化配置
注意!!该命令只是在文件系统出现问题或者怀疑所格式化的硬盘有问题才会使用,在执行 fsck 时,被检查的分区务必不能挂载到系统上,即需要在卸载的状态,此外,当使用 fsck 检查文件系统后,若出现问题,有问题的数据就会被放置到 "lost+found" 这个目录里面
检查硬盘或软盘扇区有没有坏轨
badblocks
badblocks [-svw] 设备名称
-s:在屏幕上列出进度
-v:可以在屏幕上看到进度
-w:使用写入的方式来测试,最好不要使用该参数,尤其待检查的设备已有文件
该命令了解,目前大多不使用了,因为可以使用 mke2fs -c 设备文件名 在进行格式化的时候处理磁盘表面的读取测试
磁盘挂载与卸载
挂载
mount -a
-a:依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
mount [ -l ]
-l:单纯输入 mount 会显示目前挂载的信息,加入参数 -l 可增列 Lable 名称
mount [-t 文件系统] [-L Label名] [ -o 额外选项] [-n] 设备文件名 挂载点
-t:与 mkfs 的 参数类似,可以加上文件系统种类来指定欲挂载的类型
常见的 linux 支持类型有
ext2
ext3
vfat
reiserfs
iso9660(光盘格式)
网络文件系统
nfs
cifs
smbfs
-n:在默认情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中以利于其他程序的运行,但在某些特殊情况下(单用户维护模式下)为了避免问题会刻意不写入,此时若要要求写入 /etc/mtab 就要使用 -n 参数
-L:系统除了可以利用设备文件名来挂载,还可以利用文件系统卷标名称来进行挂载
-o:后面可以接一些挂载时需要额外加上的参数,比如账号、密码、读写权限等
ro,rw
挂载文件系统成为只读(ro)或可读写(rw)
async,sync
此文件系统是否使用同步写入(sync)或异步(async)的内存机制,默认为 async
auto,noauto
允许此分区被以 mount -a 自动挂载(auto)
dev,nodev
是否允许此分区上可创建设备文件,dev 为允许
suid,nosuid
是否允许此分区含有 suid/sgid 的文件格式
exec,noexec
是否允许此分区上拥有可执行 binary 文件
user,nouser
是否允许此分区让任何用户执行 mount,一般而言 mount 只有 root 可以执行,但通过该参数设置 user,可让一般用户也能够对此分区进行 mount
defaults
默认值为 rw,suid,dev,exec,auto,nouser,async
remount
重新挂载,这在系统出错时或在重新更新参数时使用
挂载 ext2/ext3 文件系统
最简单挂载
mount 设备文件名 挂载点
e.g:

linux 可以通过分析 super block 搭配 linux 自己的驱动程序去测试挂载,如果成功挂载则立即自动使用该类型的文件系统挂载起来
哪些类型的文件系统需要进行挂载测试?参考两个文件
/etc/filesystems
系统指定的测试挂载文件系统类型
/proc/filesystems
linux 系统已经加载的文件系统类型
Linux 系统的相关文件系统类型的驱动程序所在目录
/lib/modules/$(uname -r)/kernel/fs/
挂载 U 盘
插入 u 盘 查看

创建挂载点,并挂载

如果带有中文文件名的数据,挂载时要指定一下挂载文件系统所使用的语言,vfat 文件格式当中可以使用 iocharset 来指定语系,中文语系为 cp950
若是可移动硬盘
通常这样的硬盘都使用 NTFS 格式
需要下载 ntfs 驱动程序并安装才能使用 NTFS 文件系统
重新挂载根目录与挂载不特定目录
重新挂载根目录
mount -o remount,rw,auto /
非常重要的重新挂载机制,尤其是进入单用户维护模式时,根目录通常会被系统挂载为只读,此时通过这个命令重新挂载为可读写是如此的好用!!
挂载不特定目录
mount --bind 原目录 新目录
通过 --bind 将原目录挂载到新目录下
e.g:将 /home 这个目录暂时挂载到 /mnt/home 下面

可以看出 类似于 symbolic link
卸载
将设备文件卸载
umount [-fn] 设备文件名或挂载点
-f:强制卸载,可用在类似网络文件系统(NFS)无法读取到的情况
-n:不更新 /etc/mtab 的情况下卸载
e.g:将之前挂载上来的 分区和 U盘卸载
先看看情况

用设备文件名来卸载

用挂载点来卸载

如果挂载的是目录,只能使用挂载点卸载

如果挂载的是目录,通过 df 也看不到挂载信息,只能通过 mount 查看
磁盘参数修改
mknod
创建设备文件
搞清楚一点
linux 下面所有设备都是文件,文件是怎么代表该设备的呢?
是通过文件的 major 与 minor 数值来替代
查看一下

8 为主设备代码(major)0~6 为次设备代码(minor),linux 内核认识的设备数据就是通过这两个数值决定
mknod 设备文件名 [bcp] [Major] [Minor]
设备种类
-b:设置设备名称成为一个外部存储设备文件,比如硬盘
-c:设置设备名称成为一个外部输入设备文件,比如鼠标/键盘
-p:设置设备名称成为一个 FIFO 文件
Major
主设备代码
Minor
次设备代码
e.g:/dev/sda8 设备代码应该为 8,8,建立这个设备文件并查看一下

e2label
修改卷标
e2label 设备名称 新的 Label 名称
先查看下 /dev/sda6 现在的 label

改成 “my_test”

tune2fs
直接将 ext2 的文件系统更新成为 ext3 文件系统
tune2fs [-jlL] 设备代号
-j:将 ext2 的文件系统转换成 ext3 的文件系统
-l:类似 dumpe2fs 的 -h 功能,将 super block 的信息列出来
-L:类似 e2label 的功能,修改文件系统的 Label
hdparm
没啥卵用!如果硬盘是 IDE 接口,可以用来设置一些高级参数,对于 SATA 接口的唯一能够用来做个测试:测试暂存区 cache 的访问性能或测试硬盘的实际访问性能
hdparm -Tt 设备名称

设置开机挂载
开机挂载 /etc/fstab 及 /etc/mtab
/etc/fstab

6 字段
第一字段
磁盘设备文件名或该设备的 Label
第二字段
挂载点(哪个目录)
第三字段
磁盘分区的文件系统,ext3,reiserfs,vfat 等
第四字段
文件系统参数
第五字段
能否被 dump 命令作用,通过这个设置文件系统是否需要进行 dump 备份
0
代表不要做 dump 备份
1
代表要每天进行 dump 备份
2
代表其他不定日期的 dump 的备份操作
通常就 0 跟 1
第六字段
是否以 fsck 检验扇区,通过这个来设置文件系统是否要以 fsck 来检验
0
表示不要检验
1
表示最早检验(一般只有根目录会设置为 1)
2
也是要检验,不过 1 会比较早检验
一般而言,根目录设置为 1,其他要检验的文件系统都设置为 2 就好
记住!!设置完务必使用 mount -a 来测试一下语法的正确性,不然贸然重启如果有语法错误就开不了机了!
/etc/mtab
/etc/fstab 是开机时的配置文件,实际文件系统的挂载是记录在 /etc/mtab 与 /proc/mounts 这两个文件当中的
特殊设备 loop 挂载(镜像文件不刻录就直接挂载使用)
挂载光盘/DVD 镜像文件
同样的创建挂载点后
mount -o loop 镜像文件名 挂载点
新建大文件以制作 loop 设备文件
比如分区时只分出一个 根目录,而现在又没有多余的空间可以进行额外的分区,就可以通过制作出一个大文件,将这个大文件格式化后挂载使用,感觉就像多了个分区
创建大型文件
dd
用来创建空文件
dd if=/dev/zero of=/home/loopdev bs=1M count=512
格式化
mkfs -t ext3 /home/loopdev
挂载
mout -o loop /home/loopdev /media/cdrom
内存交换空间(swap)的构建
想想分区的时候,必要的两个分区
/
swap
功能
在应对物理内存不足的情况下所造成的内存扩展记录的功能
那么如果分区的时候忘了分出 swap ,文件系统已经创建起来了怎么办?
使用物理分区构建swap
1st step
分区
fdisk 在磁盘中分出一个分区,并调整该分区的 System ID 为 82(swap 的 ID)
2nd step
格式化
mkswap 设备文件名 就能够格式化该分区为 swap 格式
3rd step
启动 swap 设备
swapon 设备文件名
4th step
可以查看一下
fee 查看一下内存使用情况或者 swapon -s
使用文件构建swap
1st step
使用 dd 命令新增一个合适大小(128M)的文件
dd if=/dev/zero of=/tmp/swap bs=1M count=128
2nd step
格式化
mkswap /tmp/swap 将这个文件格式化为 swap 格式
3rd step
启动
swapon /tmp/swap
4th step
可以查看一下
fee 查看一下内存使用情况或者 swapon -s
使用 swapoff 关掉swap file
swapoff 设备文件名
swapoff /tmp/swap
swap 使用上的限制
swap 主要功能
当物理内存不够时,将某些在内存中所占的程序暂时移到 swap 当中,让物理内存可以被需要的程序来使用
限制
在内核 2.4.10 版本之后,单一 swap 已经没有 2GB 的限制了
最多仅能新建 32 个 swap
由于 x86_64 最大寻址到 64 GB,因此 swap 总量最大也只能达 64 GB
chapter 9 文件与文件系统的压缩与打包
linux 常见的压缩命令
常见的压缩文件扩展名
*.Z
compress 程序压缩的文件
*.gz
gzip 程序压缩的文件
*.bz2
bzip2 程序压缩的文件
*.tar
tar 程序打包的数据,并没有压缩过
*.tar.gz
tar 程序打包的文件,其中经过 gzip 的压缩
*.tar.bz2
tar 程序打包的文件,其中经过 bzip2 的压缩
compress
压缩
compress [-rcv] 文件或目录
-r:可以连同目录下的文件也同时压缩
-c:将压缩数据输出成 stdout(输出到屏幕)
-v:可以显示出压缩后的文件信息以及压缩过程中的一些文件名变化
默认情况下,被 compress 压缩的源文件会被删除,创建起压缩文件,而解压缩就会删除压缩文件,创建出原来的文件
解压缩
uncompress 文件.Z
gzip
gzip [-cdtv#] 文件名
-c:将压缩的数据输出到屏幕,可以通过数据流重定向来处理
-d:解压缩的参数
-t:可以用来检验一个压缩文件的一致性,看看文件有无错误
-v:可以显示出源文件/压缩文件的压缩比信息
-#:压缩等级,-1 最快,但压缩比最差,-9 最慢,但压缩比最好,默认是 -6
zcat 文件名.gz
用来读取纯文本被压缩后的压缩文件
compress、zip、gzip 等软件所压缩的文件都可以用 gzip 来解压缩,并且 gzip 压缩的文件在 windows 中能被 WinRAR 软件解压缩
bzip2
bzip2 [-cdkzv#] 文件名
-c:将压缩过程产生的数据输出到屏幕上
-d:解压缩参数
-k:保留原文件而不会删除原始的文件
-z:压缩的参数
-v:可以显示出原文件/压缩文件的压缩比信息
-#:与 gzip 一样,-9 最佳,-1 最快
bzcat 文件名.bz2
不用解压缩直接查看
打包命令
tar
可以将多个目录或文件打包成一个大文件,同时可以通过 gzip/bzip2 的支持,将该文件同时进行压缩,windows 的 WinRAR 也支持 .tar.gz 文件的解压缩
打包与压缩
tar [ -j | -z ] [ cv ] [ -f 新建的文件名 ] filename ...
-c:新建打包文件,可搭配 -v 来查看过程中被打包的文件名
-j:通过 bzip2 的支持进行压缩/解压缩,此时文件名最好为 *.tar.bz2
-z:通过 gzip 的支持进行压缩/解压缩,此时文件名最好为 *.tar.gz
-v:在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f :-f 后面要接打包或压缩结果文件名,建议 -f 单独写一个参数
filename:表示被处理的文件名,多个以空格隔开
查看文件名
tar [ -j | -z ] [ tv ] [ -f 新建的文件名]
-t:查看打包文件的内容含有哪些文件名,重点在查看文件名
解压缩
tar [ -j | -z ] [ xv ] [ -f 新建的文件名] [ -C 目录 ]
-x:解打包或解压缩的功能,可以搭配 -C 解压缩到指定目录
-C 目录:该参数用在解压缩时,指定解压缩的目录,不指定该参数,则在当前目录解开
仅解开单一文件
首先查看并找到想要解开的那个单一文件名,配合grep
tar -jtv -f filename.tar.bz2 | grep 'xx'
然后使用解压缩命令语法,只不过将想要解压缩的那个文件名放到最后指明
tar -jxv -f filename.tar.bz2 待解开文件名
其他参数
-p:保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P:保留绝对路径,即允许备份数据中含有根目录存在之意
为安全起见,最好不要使用该参数,即不使用该参数,那么备份数据中会去掉根目录,由于tar 所记录的文件名就是解压缩后的实际文件名,如果去掉根目录,比如将备份数据在/tmp 中解开,那么解压缩后的文件名就是 /tmp/xxx/xxx,但如果没有去掉根目录,解压缩后的文件名就是绝对路径,即解压缩后的数据一定会被放置到/xxx/xxx 去,如此以来解压缩前系统原本的数据就会直接被解压缩出来的数据覆盖掉!
--exclude=FILE:在压缩的过程中,不要将 FILE 打包,多个不需要打包的文件都用 --exclude=指明,以空格隔开
--newer-mtime=时间:仅备份比某个时刻还要新的文件
先查找看看有没有较新的文件
find /etc -newer /etc/passwd
再查看限定日期
ll /etc/passwd
再使用 tar 打包
tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2021/09/13" /etc/*
最简单的记忆
tar 压缩
tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
tar 查询
tar -jtv -f filename.tar.bz2
tar 解压缩
tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
tar -zxv -f filename.tar.gz -C 欲解压缩的目录
文件名需自己起,tar 并不会主动创建
不加 -j 或 -z 就直接取为 *.tar
加了 -j 参数,代表有 bzip2 支持,取为 *.tar.bz2
加了 -z 参数,代表有 gzip 支持,取为 *.tar.gz
基本名称
tarfile
只经过打包的文件
tar -cv -f filename.tar
tartall
打包又压缩的文件
tar -jcv -f filename.tar.bz2
特殊应用
利用管道命令与数据流
e.g:将 /etc 整个目录一边打包一边在 /tmp 中解开
tar -cvf - /etc | tar -xvf -
省去了中间文件名,以 - 代替
完整备份工具 dump
dump
备份单一文件系统
使用完整的 dump 功能,包括利用 0~9 的数个 level 来备份,同时备份时可以使用挂载点或设备文件名来进行备份
备份数据只是目录,并非单一文件系统
限制
所有备份数据都必须要在该目录下
仅能使用 level 0,即仅支持完整备份
不支持 -u 参数,即无法创建 /etc/dumpdates 这个 level 备份的时间记录文件
dump [-Suvj] [level] [-f 备份文件] 待备份数据
-S:仅列出后面的待备份数据需要多少磁盘空间才能够备份完毕
-u:将这次 dump 的时间记录到 /etc/dumpdates 文件当中
-v:将 dump 的文件过程显示出来
-j:加入 bzip2 的支持,将数据进行压缩,默认 bzip2 压缩等级为 2
-level:从 0~9 共十个等级
-f:优点类似 tar,后面接产生的文件,可接类如 /dev/st0 设备文件名
-W 列出在 /etc/fstab 里面的具有 dump 设置的分区是否有备份过
restore
恢复
查看 dump 文件
restore -t [-f dumpfile] [-h]
-t:此模式用在查看 dump 起来的备份文件中含有什么重要数据,类似 tar -t 的功能
-h:查看完整备份数据中的 inode 与文件系统 label 等信息
-f:后面就接你要处理的那个 dump 文件
比较 dump 与实际文件
restore -C [-f dumpfile] [-D 挂载点]
-C:此模式可以将 dump 内的数据拿出来与实际的文件系统做比较,最终会列出 ”在 dump 文件内有记录的且与目前文件系统不一样“的文件
-D:与 -C 进行搭配,可以查出后面接的挂载点与 dump 内有不同的文件
进入互动模式
restore -i [-f dumpfile]
-i:进入互动模式,可以仅还原部分文件,用在 dump 目录时的的还原
进入互动模式后可以输入 help 查看可使用的命令
几个主要操作命令
add file
将 file 加入等下要解压缩的文件列表
delete file
将 file 从要解压缩的列表中删除,并不是删除 dump 内的文件
extract
开始将刚才选择的文件列表解压缩
ls
会显示出在 dump 内主要的目录
ls file
查看 file 这个文件是否在等会要解压缩的文件列表内,如果在列表里面则 file 文件前面会有 * 标记
还原整个文件系统
restore -r [-f dumpfile]
-r:将整个文件系统还原的模式,用在还原针对文件系统的 dump 备份
光盘写入工具
命令行界面的刻录行为
先将所需要备份的数据构建成一个镜像文件(iso)
处理命令
mkisofs
mkisofs [ -o 镜像文件 ] [ -rv ] [ -m file ] 待备份文件 ... [ -V vol ] -graft-point isodir=systemdir ...
-o:后面接你想要产生的那个镜像文件名
-r:通过 Rock Ridge 产生支持 UNIX/Linux 的文件数据,可记录较多的信息
光盘格式一般称为 iso9660,这种格式一般仅支持旧版的 DOS 文件,即文件名只能以 8.3(文件名 8 个字符,扩展名 3 个字符)的方式存在,加入 -r 参数能够让文件信息记录得较完整,包括 UID/GID 与权限等
-v:显示构建 ISO 文件的过程
-m file:-m 为排除文件(exclude)的意思,代表后面的文件不备份到镜像文件中的意思
-V vol:新建 Volume
-graft-point:graft 转嫁移植的意思
默认情况下,所有要被加到镜像文件中得文件都会被放置到镜像文件中得根目录,比如 /root ,/home ,/etc 三个目录内容都要加入镜像文件,默认情况下,三个目录的数据会全部放置到镜像文件的最顶目录中,杂乱无章,通过使用 -graft-point 参数,可以自定义镜像文件目录
三种定义方式
镜像文件中的目录所在=实际 linux 文件系统的目录所在
e.g:mkisofs -r -V 'linux_file' -o /tmp/system.img -m /home/lost+found -graft-point /root=/root /home=/home /etc=/etc
/movies/=/srv/movies
在 linux 的 /srv/movies 内的文件,加至镜像文件中的 /movies/ 目录
/linux/etc=/etc
将 linux 中的 /etc/ 内的所有数据备份到镜像文件中的 /linux/etc /目录中
将该镜像文件刻录至光盘或 DVD 中
处理命令
cdrecord
查询刻录机位置
cdrecord -scanbus dev=ATA
-scanbus:用在扫描磁盘总线并找出可用的刻录机,后续设备为 ATA 接口

抹除重复读写片,即先抹除原始内容
cdrecord -v dev=ATA:x,y,z blank=[ fast | all ]
-v:在 cdrecord 运行的过程中显示过程
dev=ATA:x,y,z:后续的x,y,z 为自己系统上刻录机所在位置
blank=[ fast | all ]:blank 为抹除可重复写入的 CD/DVD-RW,使用 fast 较快,all 较完整
格式化 DVD+RW
cdrecord -v dev=ATA:x,y,z -format
-format:仅针对 DVD+RW 这种格式的 DVD 而已
刻录
cdrecord -v dev=ATA:x,y,z [可用参数功能] file.iso
可用参数功能:主要是写入 CD/DVD 时可使用的参数,包括
-data:指定后面的文件以数据格式写入,不是以 CD 音轨(-audio)方式写入
speed=X:指定刻录速度,例如 CD 可使用 speed=40 为 40 的倍数,DVD可使用 speed=4 之类
-eject:指定刻录完成后自动退出光盘
fs=Ym:指定多少缓冲存储器,可用在镜像文件先暂存至暂存区,默认为 4M,一般建议可增加至 8M,视刻录机而定
其他常见备份与压缩工具
dd
不只能制作一个大文件而已,用在备份上,dd 可以读取磁盘设备内容(直接读取扇区),然后将整个设备文件备份成一个文件
备份
dd if="input file" of="output file" bs="block size" count="number"
if:就是 input file,也可以时设备
of:就是 output file,也可以是设备
bs:规划的一个 block 大小,若未指定则默认是 512 bytes(一个扇区的大小)
count:多少个 bs 的意思
还原
反过来
dd if="output file" if="input file"

cpio
可以备份任何东东,包括设备文件,但不会主动找文件来进行备份,需配合类似 find 等可以找到文件名的命令来告知 cpio 该备份的数据在哪里才行
备份
cpio -ovcB > [ file | device ]
-o:将数据 copy 输出到文件或设备
-B:让默认的 Blocks 可以增加至 5120 btytes,默认是 512 bytes,这样可以让大文件的存储速度加快
-v:让存储过程中文件名可以在屏幕上显示
-c:一种较新的 portable format 方式存储
还原
cpio -ivcdu < [ file | device ]
-i:将数据自文件或设备复制到文件系统当中
-d:自动新建目录,使用 cpio 所备份的数据内容不一定会在同一层目录,因此必须让 cpio 在还原时可以新建目录,就通过 -d 参数设置
-u:自动将较新的文件覆盖较旧的文件
查看
cpio -ivct < [ file | device ]
-t:需配合 -i 参数,可用在查看以 cpio 新建的文件或设备的内容