磁盘的基本概念
MBR(Master Boot Rcord) 早期linux为了兼容windows处理磁盘上开机管理程序和分区表,将这些信息放在磁盘的第一个扇区,通常512bytes大小(其中,446bytes用来安装开机管理程序的地方,64bytes记录整个硬盘的分区),而64bytes的容量导致只能记录四组分区,记录每组分区的开始和结束磁柱(分区槽的最小单元号码。
四组分区信息称为 主要分区槽(primary)和延伸分区槽(extended)。 但是可以使用extended分区槽来记录更多的分区信息,这样就实现了可以分成更多的分区槽,即逻辑分区,所以一个系统,延伸分区槽最多只能有一个。
延伸分区的目的是使用额外的扇区来记录分区的信息,延伸分区本身不能被拿来格式化,由延伸分区切出来的分区槽被称为逻辑分区槽(logical partition), 延伸分区槽被破坏则所有的逻辑分区槽都会被删除。
对于MBR分区表,由于每组分区表仅有16bytes,导致:
- 操作系统无法抓取到22T以上的磁盘容量
- MBR仅有一个区块,一旦被破坏,很难恢复。
- 开机管理程序仅有446bytes,无法容纳更多的程序代码。
GPT 为了解决MRB分区的限制,同时也考虑到兼容,使用逻辑区块地址(Logical Block Address,LBA)来处理,使用34个LBA来处理,并且在整个磁盘的末尾33个LBA也拿来作为另一个备份。GPT分区方案下,每个LBA有4笔分区记录,最多有4 *32 = 128个分区记录(34个LBA中前两个用来记录其他信息),没有所谓的主,延伸,逻辑分区的概念了,每一个分区记录都可以独立存在,都可以视为主分区,并且可以拿来格式化使用。
主机加载硬件驱动方面的程序的两种机制,BIOS和UEFI
BIOS是在开机的时候计算机主动执行的第一个程序,定位到硬盘读取第一个扇区MBR的位置,执行MBR中446bytes的最基本开机管理程序,开机管理程序则去加载核心文件,开始操作系统的功能。(GPT格式的分区表,BIOS也能从LBA0的MBR兼容区块读取开机管理程序代码)。
开机管理程序除了能够安装在MBR外,还能安装在每个分区槽的启动扇区(bootsector),可以实现了多重引导的功能。MBR的开机管理程序提供两个选择,直接加载核心文件,或者将开机管理工作交给其他分区槽的开机管理程序,无法直接加载其他的核心文件。
安装多重引导,最好先安装windows再安装linux:
- Linux在安装的时候,可以选择将开机管理程序安装在MBR或者别的分区槽的启动扇区,linux的loader可以手动设定选择,可以设置在linux的boot loader里面加入windows的开机选项。
- windows在安装系统的时候,安装程序会主动覆盖掉MBR以及自己所在分区槽的启动扇区,没有自己选择的机会,也没有让用户设置开机选项的功能。
UEFI主要是想要识别GPT,取代BIOS这个软件界面,不同于汇编写的BIOS,UEFI使用C语言开发的,可以定制一系列的功能,相当于一个裁减的操作系统。
挂载: 就是利用一个目录当成进入点,将磁盘分区槽的数据放置在该目录下,进入该目录就可以读取该分区槽,进入点的目录成为挂载点。linux系统的根目录一定需要挂载在某个分区槽的。
常用服务
Linux想要实现本机对外联机,然后其他用户通过这台机器连接到互联网上,需要使用IP分享器将资源分享到其他用户,通过NAT服务即可。
SAMBA服务可以用来在网络上传输数据,可以linux和windows之间传输数据,并且没有客户端连接数量的限制。
mail服务,公司内部的邮件服务器。
web服务器(WWW),除了可以提供Internet的WWW联机,以及在机器上软件功能使用WWW作为显示接口。
DHCP 客户端自动获取IP地址的功能,系统管理员上可以在DHCP服务器上设定即可,分配IP给客户端。
FTP服务器,进行网路数据的传输。
linux 下的文件系统
Linux的文件系统可以支持多人多任务进行合作开发,文件访问者的身份分为owner/group/others,且对文件的操作分为read/write/excute,可以对文件进行非常细致的权限管理,所以系统地学习Linux下的文件系统,对于linux系统下的开发工作是非常必要的。
文件的访问者:
owner是文件的拥有者,可以设定文件的访问权限,控制其他用户的访问;
group是群组,用于团队开发,文件在group级别下组员之间可以共享访问权限。
others即其他人员的访问身份。
root则是相当于系统管理员,拥有所有文件的最高访问权限。
在Linux下,所有系统上的账户和一般身份使用者(others),包括root的信息,都记录在/etc/passwd这个文件中,密码则是记录在/etc/shadow文件中,而group名记录在/etc/group内。
文件的权限
使用 [su -] 指令切换为 root , [exit]指令为退出
[ ls -al ] 查看文件的权限
-rw-r--r--. 5 root root 1864 May 4 19:10 .config
分别表示:权限,连接(i-node),文件拥有者,群组,文件大小(bytes),修改日期(最近修改),文件名(注:文件名前由一个[.],表示隐藏文件)
root不受权限的限制,可以访问权限是【----------】的文件。
数字类型对应权限 r:4 w:2 x:1
文件属性和权限的变更
chgrp : 改变文件所属群组
chown: 改变文件拥有者
chmod: 改变文件的权限
权限分为对文件内容或者文件目录结构的权限。
文件内容:
w 对应文件的 写入/编辑/新增/修改文件内容,但是不能删除文件。
x 在windows下一个文件是否有可执行的能力是由扩展名来判断的,比如 .exe,.bat,.com等,但是在Linux下文件是否能被执行,是根据 x 这个权限来决定的,跟文件名没有关系,后缀名一般只是让用户了解该文件的可能用途而已。
目录(directory)
r 可以读取目录结构列表的权限,决定用户是否能够看到此目录下的文件名。
w 新建/删除/重命名/移动 文件的相关权限。
x 表示该目录可以作为用户的工作目录,决定用户是否能够切换到此目录下工作,以及看到文件的详细信息。
开放给用户的目录,权限一般需要 r-x,至少是–x,用户才能正常操作。
在linux下,所有的文件和目录都是从根目录开始的。
每一个目录不仅能使用本地的文件系统分支也能使用网络上的文件系统挂载在系统的特定目录。
特殊的目录:
. 代表当前目录
… 代表上一层目录
- 代表前一个工作目录
~ 代表当前用户所在的home目录
umask命令可以看到当前用户建立文件或者目录默认权限
文件的特殊权限:
SetUID:
- SUID权限仅对二进制程序有效
- 执行者对该程序需要有x的可执行权限
- 当前权限仅在该程序执行过程中有效
- 执行者具有程序拥有者权限
比如:密码password文件只有root有权限,但是普通用户可以修改自己的密码,暂时获得root的权限。
SetGID:
- 对二进制文件有效
- 程序执行者对该程序来说,需要x权限
- 执行者在执行过程中将会获得该程序群组的支持
目录设定了SGID权限: - 用户对目录有r 和 x 的权限,该用户能够进入此目录
- 用户在此目录下有效群组将会变成该目录的群组
- 用途:用户在此目录子下具有W 的权限,则使用者所建立的新文件,该新文件的群组与此目录的群组相同
SBIT目录的作用:
- 用户对于此目录具有W x 权限
- 用户在该目录下建立文件或者目录时,仅有自己和root权限才有权力删除该文件,只能针对自己建立的文件或目录进行操作。
对应数字:
4 为 SUID
2 为 SGID
1 为 SBIT
[-rws r-x r-x] - [chmod od 4755 filename] 增加SUID权限,s替代x权限
[-rws r-s r-t] - 7755 […s…s…t] + [rwx r-x r-x]
文件的查找
有时候需要知道文件的位置,才能对文件进行一些修改或者维护,需要进行一些搜寻指令将文件名搜寻出来。
脚本文件名的查找:which [-a] command 指令是根据[PATH]环境变量规范的路径
例如: which ifconfig 、 which which
文件的搜寻:通常find不是常用,因为速度比较慢,也很伤害硬盘,一般使用whereis或者locate,最后才会选用find命令
whereis 只会查找系统中某些特定目录下的文件;
locate 是用数据库来查找文件;locate命令可以直接在后面接【文件的部分名称】
因为locate是经过数据库来查询的,数据库默认每天更新一次(比如centOS 7.X),所以新建立的文件,数据库没有及时更新会找不到此文件。可以手动更新数据库[updatedb],可能需要等待数分钟。
如果查找一段时间内被更改的文件名: find / -mtime 0
-mtime n : n 表示为数字,意思是在n天之前的被更改过内容的文件,-n表示n天之内,+n表示n天之前;
linux下文件系统
通常称一个可被挂载的数据为一个文件系统而不是一个分区槽
Linux 操作系统的文件除了文件的内容,包括文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。
superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
block:实际记录文件的内容,若文件太大时,会占用多个 block 。一个block只能放置一个文件,大量的小文件可能造成block内存的浪费。
可以通过inode索引到block内容,
FAT文件系统下每个block的号码记录在前面一个block中,进行连串索引;
Ext2文件系统是inode中记录所有的block号码,然后进行全部索引查找;
**碎片整理 **:碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,这样数据的读取会比较容易.性能对FAT采用的索引方式影响比较大。
linux下的EXT2文件系统(inode)
文件系统一开始将inode和block规划好了,除非每次重新格式化和或者使用resize2fs指令变更文件系统的大小,否则inode和block固定后就不再变动。
EXT2文件系统在格式化的时候会区分一个启动扇区和多个block group,每个block group中的block大小支持1K,2K,4K;
一个inode只有128bytes,记录一个block号码要花掉4byte,如果一个文件非常大,inode没有足够的空间记录,可以会指定另外一个block去记录block的索引号码,就是所谓的间接,文件持续增大,会使用双间接,三间接。
文件系统有一个block bitmap对照表,记录空的block和被占用的block;同理,inode bitmap记录inode对照表;
linux下文件系统建立一个目录时,文件系统会分配一个inode和至少一块block给该目录。
inode记录该目录相关权限和属性,并记录分配到的block号码,block则是记录在这个目录下文件名和该文件名占用的inode号码数据;
文件异步处理 async:文件在编辑的过程中频繁的要系统来写入到磁盘中,由于磁盘写入的速度要比内存慢很多, 因此常常耗在等待磁盘的写入/读取上当系统加载一个文件到内存后。如果该文件没有被更动过,则在内存区段的文件数据会被设定为干净(clean)的。但如果内存中的文件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存中的数据会被设定为脏的 (Dirty)。此时所有的动作都还在内存中执行,并没有写入到磁盘中! 系统会不定时的将内存中设定为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。 你也可以用sync 指令来手动强迫写入磁盘。
文件系统和目录树结合的动作称为挂载,挂载点一定是目录,该目录是文件系统的入口。
磁盘容量的越来越大,以及虚拟化磁盘应用,文件系统从Ext4改为xfs,用于适合大容量磁盘和文件系统。
xfs是一个日志式文件系统,不同于ext系统,block和inode可以设定不同的容量;并且文件系统活动区用于记录文件的变化,直至变化完整的写入数据区,记录才结束。文件系统若异常损毁,系统用此区域检验,并尝试修复。
**硬链接和软链接 **:对应创建command [ln]
硬链接:系统中每一个文件都会占用一个inode,读取文件必须经过目录记录的文件名指向inode号码,如果多个文件名对应一个inode号码,就是硬链接。
特点:任何一个文件删除,inode和block都会仍然存在,可以通过其他的文件名读取到文件数据,编辑任何一个文件,结果都会更新到inode和block中。并且只能在同一个filesystem中,不支持link目录。
软链接(symbolic link):建立一个独立的文件,inode和block,此文件会让数据的读取link到目标文件,如果目标文件被删除,则symbolic link就会无法打开。
软链接使用更加频繁。
磁盘的分区格式化检验和挂载
系统新增一个磁盘,一般进行如下操作:
- 对磁盘进行分区,以建立可用的 partition ;
- 对该 partition 进行格式化 (format),以建立系统可用的 filesystem;
- 对刚刚建立好的 filesystem 进行检验(option);
- 在 Linux 系统上,需要建立挂载点 (即目录),并挂载上来;
lsblk命令列出系统上所有的磁盘列表;
blkid命令列出装置的UUID等参数,UUID是全局装置唯一标识符,可以用来挂载或者使用这个装置或文件系统;
parted命令列出磁盘的分区表类型和分区信息;
- MBR分区表使用fdisk命令分区,GPT分区表使用gdisk命令进行分区,parted命令对于两种分区表类型都支持; - [gdisk /dev/vda] [?] [4]
- 创建文件系统; - [mkfs.xfs /dev/vda4]
- 文件系统检查(一致性); - [xfs_repair /dev/vda4]
- 文件系统挂载和卸载 - [blkid /dev/vda4] [mount UUID="" /data/xfs] (查找UUID,并挂载) - umount /dev/vda4
- 挂载前:
-1. 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
-2. 单一目录不应该重复挂载多个文件系统;
-3. 要作为挂载点的目录,理论上应该都是空目录才是。
挂载新的文件系统在一个目录下,此目录下的其他目录会被暂时隐藏,直至文件系统被卸载;
[mount]指令: 比如 mount [-t 文件系统] UUID=’’ 挂载点
文件系统几乎都有 superblock ,Linux 可以通过分析superblock 搭配 Linux 自己的驱动程序去测试挂载, 如果成功地兼容了,就立刻自动的使用该类型的文件系统挂载上。
开机挂载
linux下文件系统的挂载选项和参数设置在 /etc/fstab 文件中,
系统挂载的规则:
- 根目录 / 是必须挂载的,而且一定要先于其它 mount point 被挂载进来。
- 其它 mount point 必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录架构原则 (FHS)
- 所有 mount point 在同一时间之内,只能挂载一次。
- 所有 partition 在同一时间之内,只能挂载一次。
- 如若进行卸除,您必须先将工作目录移到 mount point(及其子目录) 之外。
当无法新建分区槽的情况下,但是需要隔离出一个新的文件系统。可以制作一个大文件,然后将这个文件格式化后挂载。loop挂载。
可以作为多种解决方案.
步骤:
[dd if=/dev/zero of=/srv/loopdev bs=1M count=512]
#dd 就好像在迭砖块一样,将 512 块,每块 1MB 的砖块堆栈成为一个大文件 (/srv/loopdev), 最终就会出现一个 512MB 的文件.
#这个指令的简单意义如下:
#if是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的装置!# of 是 output file ,将一堆零写入到后面接的文件中。
#bs 是每个 block 大小,就像文件系统那样的 block 意义;
#count 则是总共几个 bs 的意思。所以 bs*count 就是这个文件的容量了!
#查看文件属性参数
[ll -h /srv/loopdev]
#格式化为xfs系统
[mkfs.xfs -f /srv/loopdev]
#查看UUID 文件系统类型
[blkid /srv/loopdev]
#挂载
[mount -o loop UUID=“7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee” /mnt]
#测试是否挂载成功
[df /mnt]
内存置换空间(swap)创建
可以暂时将内存的程序拿到硬盘中的内存置换空间(swap),在物理内存不足的情况下,为了让后续的程序能够继续运行,在内存中暂时不使用的程序和数据就会被放在swap中。
目前来说,swap空间存在的意义已经不大了,但是对于服务器或者常年上线的工作站来说,swap是必须的。
如果主机支持电源管理模式,即linux主机系统可以进入【休眠】模式的话,运行的程序状态会记录到swap中,作为【唤醒】主机的状态依据。
swap不是文件系统,没有挂载点。
创建一个swap:
- 设定一个swap partition
- 建立一个虚拟内存文件
步骤: - 分区:先使用 gdisk 在你的磁盘中分区出一个分区槽给系统作为 swap 。由于 Linux 的 gdisk 预设会将分区槽的 ID 设定为 Linux 的文件系统,所以你可能还得要设定一下 system ID 就是了。
- 格式化:利用建立 swap 格式的『mkswap 装置文件名』就能够格式化该分区槽成为 swap 格式啦
- 使用:最后将该 swap 装置启动,方法为:『swapon 装置文件名』。
- 观察:最终通过 free 与 swapon -s 这个指令来观察一下内存的用量!
不新建分区槽,也可以创建文件来作为swap的载体。
文件和文件系统的压缩
linux下文件扩展名用于提示该文件是由那种压缩指令生成的:
*.Z compress 程序压缩的文件;
*.zip zip 程序压缩的文件;
*.gz gzip 程序压缩的文件;
*.bz2 bzip2 程序压缩的文件;
*.xz xz 程序压缩的文件;
*.tar tar 程序打包的数据,并没有压缩过;
*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩
压缩比:
compress < gzip < bzip2 < xz
注:xz会得到最优化的压缩比,但是耗费的时间也相对较长.
打包:将多个文件或者目录包成一个大文件
#打包 备份 在压缩后路径描述中会主动去掉根目录 即 ‘/etc’ -> ‘etc’
#exclude 关键字去除某些特定不需要打包的文件或者目录
[time tar -zpcv -f /root/etc.tar.gz /etc]
#查看tar文件的数据内容
[tar -jtv -f /root/etc.tar.bz2]
#全部解压缩
[tar -jxv -f /root/etc.tar.bz2]
#单独取出单个文件
[tar -jtv -f /root/etc.tar.bz2 | grep ‘文件名关键字’] #查看文件名称
[tar -jxv -f 打包文件名.tar.bz2 待解开文件名]
备份中为什么要主动去掉根目录呢?
主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来使用, 在 tar 所记录的文件名 (就是我们刚刚使用 tar -jtvf 所查看到的文件名) 那就是解压缩后的实际文件名。 如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的档名就会变成『/tmp/etc/xxx』。但『如果没有拿掉根目录,解压缩后的档名就会是绝对路径, 亦即解压缩后的数据一定会被放到 /etc/xxx 去!』如此一来,系统中的 /etc/ 底下的数据, 就会被备份数据所覆盖掉。
SELinux问题:备份还原后可能会覆盖掉系统的配置,比如 /etc/shadow 下登陆用户密码文件被更改,导致无法登陆系统。
那如何处理呢?简单的处理方式有这几个:
- 通过各种可行的救援方式登入系统,然后修改 /etc/selinux/config 文件,将 SELinux 改成 permissive 模式,重新启动后系统就正常了;
- 在第一次复原系统后,不要立即重新启动!先使用 restorecon -Rv /etc 自动修复一下 SELinux 的类型即可。
- 透过各种可行的方式登入系统,建立 /.autorelabel 文件,重新启动后系统会自动修复 SELinux 的类型,并且又会再次重新启动,之后就正常了!
CentOS7.X已经使用XFS文件系统作为默认设置,可以用xfsdump和xfsrestore对xfs进行文件系统的备份。