1 AUG TUE
P146 - P153
6.2.2 如何改变文件属性与权限
改变权限 chmod
r: read 4
w: write 2
x: execute 1
[-rwxrwx—] is 7 7 0
chmod [-R] xyz filename/directory
-R 为递归的持续更改,即子目录下的所有文件都会更改对于以vim编辑一个shell的文字批处理文件后,它的权限通常是“-rw-rw-r–”(664),要把它变成可执行文件,并且不让其他人修改此文件的话,就需要改成[-rwxr-xr-x]755.
另一种方法修改权限:
chmod | u(user) g(group) o(others) a(all) | +(加入)-(除去)=(设置) | r,w,x | 文件或目录 |
eg chmod u=rwx,go=rx filename
eg chmod a+x filename
means adding execute permission to all
6.2.3 目录与文件的权限意义
对于文件而言:
- read. 可读取此文件的实际内容,如读取文本文件的文字内容等
- write. 可以编辑新增或者修改改文件的内容(但不含删除该文件)
- execute. 可以被执行
对于目录而言:
- read. 有读取目录结构列表的权限,比如可以用ls命令把该目录的内容显示出来
- write. 有更改该目录结构列表的权限,如:新建文件或目录,删除文件或目录(不管文件的权限如何),重命名,转移该目录内的文件、目录位置。(反正目录的w权限与该目录下面的文件名变动有关)
- x. access directory. 代表用户能否进入该目录成为工作目录。比如说cd。
cat filename
可以把文件内容读出来。
2 AUG WED
P154-P196
6.4
- 有五个目录不可与根目录放在不同的分区,分别为/etc, /bin, /lib, /dev, /sbin
- chown username filename
修改文件所有者
- chgrp groupname filename
修改文件用户组
Linux中重启的两个命令:reboot和init 6之间的区别
reference
init命令用于改变操作系统的运行级别。
Init 6是重新启动机器。
reboot也是重新启动机器。
那么这两个命令到底有什么区别呢?
对这两个操作使用man命令看到的内容如下:
“init 6” 基于一系列/etc/inittab文件,并且每个应用都会有一个相应shutdown脚本。
‘init 6’ 调用一系列shutdown脚本(/etc/rc0.d/K*)来使系统优雅关机;
‘reboot’并不执行这些过程,reboot更是一个kernel级别的命令,不对应用使用shutdown脚本。 .
- 所有目录下面都会存在的两个目录,分别是”.”和”..”,分别代表当前层目录与上一层目录。(根目录“/”的“.”和“..”是同一个目录)
cd
切换目录
cd ~
切换回到当前用户的主文件夹
pwd
显示当前目录 print working directory
- 用
pwd -P
可以显示链接文件的实际目录。
- 用
mkdir
新建一个新的目录
mkdir -p test/test2/test3/test4
使用-p可以自行创建多层目录mkdir -m 711 test2
使用-m可以强制设置属性
rmdir
删除一个空的目录remove empty directory
- 如果文件夹不为空,则不能删除
rmdir -p test1/test2/test3/test4
可以用-p将连同上层“空的”目录也一起删除。如这里可以最后把四个文件夹都删除。
- 用
rm -r
删除非空文件夹 - 环境变量
$PATH
, 每个目录中间用冒号(:)来隔开,每个目录是有顺序的。
- 把某目录添加到PATH中:
PATH="$PATH":yourdirectory(eg. /root)
- 把某目录添加到PATH中:
7.2 文件与目录管理
ls -h
将文件容量以KB,GB之类人类易读方式列出来
ls -l
列出长数据串,包含文件的属性与权限等数据
ls -r
将排序结果反向输出,如从小到大变成从大到小
ls -t
以时间排序,而不是用文件名
7.2.2 cp, rm, mv
cp [options] sourcefile destfile/directory
-r
递归持续复制,多用于复制文件夹-i
若目标文件(destination)已存在时,在覆盖时会先询问操作的进行-p
连同文件的属性一起复制过去,而非使用默认属性- 注意: 默认条件中,cp的源文件与目的文件的权限是不同的,目的文件的所有者通常是命令操作者本身。所以,复制的时候要注意特殊权限文件,必须要加上
-a
或者是-p
等可以完整复制文件权限的参数才行。
用通配符*,可以进行正则匹配。如
rm -i bashrc*
可以把所有开头为bashrc的文件名全部删除。rm -r directoryname
会询问是否要删掉此目录,要输入‘y’或者‘n’操作。如果想直接删除目录而不要询问,则在命令前加上反斜杠\rm -r /tmp/etc
,同理的还有\cp -r /etc/ .
- mv可以用来移动文件与目录,或者重命名。
mv [-fiu] source destination
-f: (force)强制的意思,如果目标文件已经存在,不会询问而直接覆盖;-i,(inform)如果目标文件已经存在,会先询问;-u:(update)若目标文件存在,且source比较新,才会更新mv [options] source1 source2 source3 ... directory
- 使用rename进行大量文件名的批量修改: 匹配关键字 替代字 所有匹配的文件名(正则):
rename from to file
7.3 文件内容查阅
cat
从第一行开始显示文件内容, -n 可以显示行号,-A:列出一些特殊字符,结尾断行字符用$显示,【TAB】用^I显示。tac
从最后一行开始显示(把cat倒写)nl
显示的时候,顺便输出行号more
一页一页地显示文件内容less
与more相似,但是可以往前翻页head -n number filename
只看头几行(如果要求不打印后100行,只打印之前的,则-n -100
)tail -n number filename
只看结尾几行(对很大型的几百MB的log很有用)。持续监测某文件内容,可以用-f
指令,直到输入ctrl+c退出od
以二进制的方式读取文件内容touch
用来创建一个空的文件;还可以将某个文件日期修改为目前日期(mtime: modification time与atime: access time)
7.4.1 文件默认权限: umask
umask
对于root用户,一般是 0022
,意思是“该默认值需要减掉的权限”。一般看后面三个数“022”:user没有被减掉权限,group被减掉write权限,others被减掉write权限。注意不是用777对这个022相减,而是根据实际情况减掉权限。
- 新建文件时:[-rw-rw-rw-] - [—–w–w-]==[-rw-r–r–]
- 新建目录时:[drwxrwxrwx]-[d—-w–w-]==[drwxr-xr-x]
如何修改umask的值?
umask targetvalue
–> umask 002
7.4.3 文件特殊权限 SUID, SGID, SBIT
- SUID: SetUID e.g.
-rwsr-xr-x
,说明用户自己执行文件时,会暂时获得root权限. SUID仅可用在二进制程序上,而且对于目录是无效的。 - SGID:SetGID e.g
-rwx--s--x
,SGID可以针对文件或目录来设置。 - SBIT:Sticky Bit. 只针对目录有效。
如何修改文件特殊权限:
- SUID:u+s
- SGID:g+s
- SBIT:o+t
7.4.4 查看文件类型file
7.5.1 脚本文件名的查询
- which : 寻找“执行文件”
which [-a] command
-a
表示将所有由PATH目录中可以找到的命令都列出,而不只是第一个被找到的命令名称。which
是根据用户所设置的PATH变量内的目录去查找可执行文件的,所以不同的用户(eg root and common users)的PATH设置内容找到的内容指令有可能不一样。alias
为命令别名。
7.5.2 文件名的查找
whereis
寻找特定文件
eg.whereis ifconfig
locate
寻找相关的文件名/文件夹(只需要提供文件的部分名称) 相当方便!!
eg.locate passwd
会比find
指令快很多,因为locate是经由数据库来查找的。linux系统会将系统内的所有文件都记录在一个数据库文件里面,每天执行一次更新,所以有可能出现新建文件之后查找该文件,然后locate会显示“找不到”。于是要手动更新数据库。updatedb
用来更新locate数据库(需要root权限)find
指令:find [PATH] [option] [action]
- 与时间有关的参数
eg. 找出过去24小时以内有改动的文件:find / -mtime 0
eg. 找出3天前的24小时以内有改动的文件:find / -mtime 3
最后一个参数3,表示3天前;0则表示从今天开始算的过去24小时。
eg.find / -mtime -4
这里-4表示小于等于4天内的文件。即从四天前到今天;同理,+4表示大于等于5天前的文件。 - 与用户或组名有关的参数
eg.-uid n
,-gid n
,-user name
,-group name
,-nouser
(不存在的用户),-group name
(不存在的用户组)
eg.find /home -user username
查找/home下面属于username用户的文件
- 与时间有关的参数
练习
groupadd project
增加新的用户组”project”
useradd -G project userA
-G 表示创建该用户自己的分组,并放入project分组中,若为-g,则直接放入project分组中,不会创建自己的分组。
useradd -G project userB
3 AUG THU
P197-207
索引式文件系统indexed allocation.
- super block: 记录此文件系统的整体信息,包括inode/block总量、使用量、剩余量…
- inode: 记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码
- block:实际记录文件的内容,若文件太大时,会占用多个block
FAT格式
- 没有inode存在,所以没办法将整个文件的所有block在一开始就读取出来
- 每一个block号码都记录在前一个block当中。
碎片整理
原因:文件写入的block太过于离散了,此时文件读取的性能将变得很差。这个时候通过碎片整理将同一个文件所属的block汇合在一起,这样数据的读取会比较容易。FAT的文件系统需要经常碎片整理。
data block 数据块
- 用来放置文件内容的地方,ext2文件系统支持的block大小有1KB,2KB , 4KB三种。
- block的大小和数量在格式化完了之后就不能够再改变了(除非重新格式化)
- 每个block内最多只能够放置一个文件的数据
- 如果文件大于block的大小,则一个文件会占用多个block数量
- 如果文件小于block的大小,则剩余的空间也不会再被使用了(磁盘空间会浪费)
inodetable(inode表格)
- 直接,间接,双间接,三间接
df -h
列出目前挂载的设备dumpe2fs -h deviceName
只列出superblock的数据 ,eg.dumpe2fs /dev/sda1
inode本身并不记录文件名,文件名的记录是在目录的block中。inode用来指向block。
数据存放区域:inode table, data block
- 中间数据metadata:super block, block bitmap, inode bitmap. 因为他们的数据是经常变动的,每次添加删除编辑时都有可能影响到这三个部分的数据,因此成为中间数据。
4 AUG FRI
P208-P238
8.2 文件系统的简单操作
df
列出文件系统的整体磁盘使用量
-h
用GB.MB.KB等易读的格式显示-i
不用硬盘容量,而以inode的数量来显示
du
评估文件系统的磁盘使用量(用于评估目录所占用量)-s
列出总量而已,而不列出每个个别的目录占用容量- eg.
du -sm /*
检查根目录下面每个目录所占用的容量
连接文件:
ln
- hard link 硬连接或实际连接
- 有多个文件名对应到同一个inode号码
- 如果将任何一个“文件名”删除,其实inode与文件实际内容的block还是存在的。
- 无论用哪个“文件名”来编辑,最终的结果都会写入相同的inode与block中,均能进行数据的修改。
- hard link不能跨文件系统,不能连接到目录(因为如果使用hard link连接到目录时,连接的数据需要连同被连接目录下面的所有数据都建立连接,复杂度很大)
- symbolic link 符号连接(也就是快捷方式)
- 就是创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。
- 当源文件被删除之后,symbolic link的文件会“开不了”,表示“无法打开某文件”。实际上就是找不到它的源文件。symbolic link 的文件记录的其实是目标文件的“文件名(含路径)”,它会根据文件名连接到正确的目录去取的目标文件的inode,最终就能读到正确的数据了。
- eg.
ln -s 源文件 目标文件
如果不加任何参数就进行连接,那就是hard link, 加上-s就是symbolic link
- hard link 硬连接或实际连接
8.3.1 磁盘分区 fdisk
- fdisk [-l] deviceName
参数-l
作用是输出后面接的设备所有的分区内容。若仅有fdisk -l
时, 则系统将把整个系统内能找到的设备的分区列出来。
- eg. 先找出系统中的根目录所在磁盘:df /
,加入找到的是/dev/hdc2
,则fdisk /dev/hdc
(这里不要加上数字)
8.3.2 磁盘格式化 mkfs
- make file system
mkfs [-t 文件系统格式] 设备文件名
eg.mkfs -t ext3 /dev/hdc6
mke2fs [-b block大小] [-i block大小] [-L 卷标] [-cj] deviceName
8.3.3 磁盘检验:fsck, badblocks
fsck [-t 文件系统] -[ACay] deviceName
检验文件系统是否出错,对发生错乱的文件系统进行分析badblocks -[svw] deviceName
检查硬盘或软盘扇区有没有坏轨
8.3.4 磁盘挂载与卸载
- 单一文件系统不应该被重复挂载不同的挂载点(目录)中
- 单一目录不应该重复挂载多个文件系统
作为挂载点的目录理论应该都是空目录才是:如果要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时消失(被隐藏了)。
mount
- eg.
mount /dev/hdc6 /mnt/hdc6
把/dev/hdc6(分区)挂载到/mnt/hdc6(空文件夹)上面 - eg.
mount -a
按照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来 - eg.
mount -l
查看目前已挂载的文件系统,包含各文件系统的label名称 - eg. 重新挂载根目录
mount -o remount,rw,auto /
对/进行重新挂载为读写方式 - eg.
mount --bind /home /mnt/home
把/home这个目录暂时挂载到/mnt/home下面(把两者连接到同一个inode)
- eg.
umount 将设备文件卸载
umount [-fn] 设备文件名或花在点
-f:强制拆卸- 使用Label name进行挂载的方法
- eg.
dumpe2fs -h /dev/hdc6
找出/dev/hdc6的label name - eg.
mount -L "label name" /mnt/hdc6
- eg.
8.4 设置开机挂载
修改/etc/fstab
开机时的配置文件
- 根目录/要先于其他mount point被挂载进来
- 其他挂载点必须为已新建的目录
- 如果要进行卸载,不许先把工作目录移到挂载点(及其子目录)之外
- 设置完毕务必使用mount -a
测试语法正确否
8.4.2 特殊设备loop挂载
创建大型文件以制作loop设备文件,解决分区不良的情况。如:在分区时,只分出一个根目录,但是没有多余的空间可以进行额外的分区。
dd if=/dev/zero of=/home/loopdev bs=1M count=512
ll -h /home/loopdev
mkfs -t ext3 /home/loopdev
mount -o loop /home/loopdev /media/cdrom