gpt和mbr
MBR即主引导记录(Master Boot Record)
位置在磁盘的第一个逻辑扇区,即LBA0的位置。一个逻辑扇区仅有512B(字节),
MBR主要由三部分组成:主引导程序、硬盘分区表(DPT)、分区有效标志。
主引导程序占据446字节,分区表占据64字节,由4个大小为16字节的主分区组成,还有分区有效标志占据2字节。接下来谈谈有关这三个部分的作用:
主引导程序(boot loader):主要负责从活动分区中装载并运行引导系统程序
分区表(DPT,Disk Partition Table):分给MBR分区表的只有64B,由4个16B大小的分区,这也是硬盘主分区数目不能超过4个的原因,MBR分区表最大可寻址的存储空间只有2TB(2^32 * 512)。将大表的数据分成称为分区的许多小的子集。如果磁盘丢失了分区表,数据就无法按顺序读取和写入,导致无法操作.
分区有效标志(magic number):也称结束标志字,固定值为0xAA55或者0x55AA,取决于处理器类型,如果是小端模式处理器(如Intel系列),则该值为0xAA55,如果是大端模式处理器(如Motorola6800),则该值为0x55AA。如果该标志错误,系统就不能启动
传统的BIOS比较低级,它不能像操作系统一样识别文件系统,所有磁盘必须要有一个固定的物理块作为引导块(Boot Block),这个引导块就是MBR。也就是说MBR是用来引导内存加载并运行操作系统内核的。
GPT
GPT即全局唯一标识分区表(GUID Partition Table)
是一个实体磁盘的分区表的结构布局的标准。它是可扩展接口(EFI)标准的一部分。由于MBR分区表最大可寻址的存储空间只有2TB。CPT就诞生了,CGPT分类64bits给逻辑块地址,寻址存储空间达到8ZB。GPT支持最多128个主分区。
GPT分为以下几个部分:
保护性MBR: 处于位置LBA0,是在CPT分区表的开头,为了兼容性而存在的传统的MBR。一般情况下是没有引导代码,仅仅有一个被标识为未知的分区,当支持GPT分区表的操作系统检索到这个MBR后会自动忽略并跳到LBA1读取CGT分区表。
GPT头:定义了硬盘的可控件和组成分区表的项的大小和数量,还记录了这块硬盘的GUID,记录了分区表头本身的位置和大小以及备份分区表头和分区表的位置和大小。
分区表:用于存储分区的信息。如(分区类型GUID,起始LBA,末尾LBA等)
分区:是物理磁盘的一部分,作用如同一个物理分隔单元。其基本信息存在分区表中。
分区表备份对分区表进行备份
GPT头备份对GPT头进行备份。处于硬盘最后面
MBR和GPT的主要差别
MBR <2TB fdisk 4个分区(要么4主分区要么3主分区+1扩展分区包含n逻辑分区)
位于磁盘前的一段引导
GPT >2TB gdisk(parted) 128
主分区注意:从MBR转到GPT,或从GPT转换到MBR会导致数据全部丢失
windows系统安装支持 UEFI+GPT、MBR+BIOS。
Linux系统支持UEFI+GPT、MBR+BIOS、MBR+GPT。
操作系统的启动是有一定顺序的,传统的启动方式(详细的启动流程请自行google)大致是BIOS上电自检->加载MBR->加载磁盘上的内核,操作系统这样启动是需要硬件支持的,即MBR+BIOS。传统的MBR转变成了GPT。操作系统的启动当然也需要改变。这里不是介绍操作系统的安装,有兴趣的话可以自己去研究下。
mount umount fstab mtab
一、mount命令
1.功能:文件挂载
2.格式:mount [-参数] [设备名称] [挂载点]
3.常用选项:
-a :安装在/etc/fstab文件中类出的所有文件系统。
-f :伪装mount,作出检查设备和目录的样子,但并不真正挂载文件系统。
-n :不把安装记录在/etc/mtab 文件中。
-r :”将文件系统安装为只读。
-v :详细显示安装信息。
-w:将文件系统安装为可写,为命令默认情况。
-t <文件系统类型> :指定设备的文件系统类型,常见的有:
- ext2 是linux目前常用的文件系统
- msdos MS-DOS的fat,就是fat16
- vfat windows98常用的fat32
- nfs 网络文件系统
- iso9660 CD-ROM光盘标准文件系统
- ntfs windows NT/2000/XP的文件系统
- auto 自动检测文件系统
-o <选项> :指定挂载文件系统时的选项,有些也可写到在 /etc/fstab 中。常用的有:
defaults 使用所有选项的默认值(auto、nouser、rw、suid)
- auto/noauto 允许/不允许以 –a选项进行安装
- dev/nodev 对/不对文件系统上的特殊设备进行解释
- exec/noexec 允许/不允许执行二进制代码
- suid/nosuid 确认/不确认suid和sgid位
- user/nouser 允许/不允许一般用户挂载
- codepage=XXX 代码页
- iocharset=XXX 字符集
- ro 以只读方式挂载
- rw 以读写方式挂载
- remount 重新安装已经安装了的文件系统
- loop 挂载“回旋设备”以及“ISO镜像文件”
二、umount命令
1.功能:
umount命令用于卸载已经加载的文件系统。利用设备名或挂载点都能umount文件系统,不过最好还是通过挂载点卸载,以免使用绑定挂载(一个设备,多个挂载点)时产生混乱。
来自: http://man.linuxde.net/umount
用于卸载已经加载的文件系统
2.格式:
umount(选项)(参数)
来自: http://man.linuxde.net/umount
umount (选项) (参数)
3.常用选项
-a:卸除/etc/mtab中记录的所有文件系统; -h:显示帮助; -n:卸除时不要将信息存入/etc/mtab文件中; -r:若无法成功卸除,则尝试以只读的方式重新挂入文件系统; -t<文件系统类型>:仅卸除选项中所指定的文件系统; -v:执行时显示详细的信息; -V:显示版本信息。
来自: http://man.linuxde.net/umount
-a:卸载/etc/mtab中记录的所有文件系统
-h:显示帮助
-n:卸载时不要将信息存入/etc/mtab系统中
-r:如果无法卸载,则尝试以只读的方式重新挂入文件系统
-t<文件系统类型>:仅卸除选项中所指定的文件系统
-v:执行时显示详细的信息
-V:显示版本号
三、fuser命令
1.功能:fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息。
2.常用选项:
-c :和-m一样,用于POSIX兼容。
-k :杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。结合 –signal
-signal: 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或者号码来表示信号(例如-HUP,-1),这个选项要和-k一起使用,否则会被忽略。
-l :列出所有已知的信号名称。
-i :杀掉进程之前询问用户,如果没有-k这个选项会被忽略。
-m? name: 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name)。这样所有访问这个文件或者文件系统的进程都会被列出来。如果指定的是一个目录会自动转换成"name/",并使用所有挂载在那个目录下面的文件系统。
-n space :指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。对于端口,可以指定端口号或者名称,如果不会引起歧义那么可以使用简单表示的形式,例如:name/space (即形如:80/tcp之类的表示)。
-s :静默模式,这时候-u,-v会被忽略。-a不能和-s一起使用。?
-u :在每个PID后面添加进程拥有者的用户名称。
-v :详细模式。输出似ps命令的输出,包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel.
3.使用示例:
1)运行下面命令看一下哪个用户哪个进程占用着此设备
fuser -m -v /mnt/databak/
2)运行下面命令杀掉占用此设备的进程
fuser -m -v -k /mnt/databak/
或者fuser -m -v -k -i? /mnt/databak/(每杀掉一下进程会让你确认)
3)执行umount就可以正常卸载了
示例:
Linux下共享Window文件夹 mount -t cifs -o username=administrator,password=xxxxx //192.168.11.17/Data/ /mnt/databak/之后想卸载挂载目录,使用umount /mnt/databak卸载挂载点时,会遇到“device is busy”提示,
使用fuser -m -v /mnt/databak/看哪个用户,哪个进程占用此设备,再用fuser -m -v-k /mnt/databak/杀掉该进程
也可以umount –lf [挂载点] 也可以强制卸载。
fstab:
tab文件格式
下面是/etc/fatab文件的一个示例行:
fs_spec fs_file fs_type fs_options fs_dump fs_pass
/dev/hda1 / ext2 defaults 1 1
fs_spec - 该字段定义希望加载的文件系统所在的设备或远程文件系统,对于一般的本地块设备情况来说:IDE设备一般描述为/dev/hdXN,X是IDE设备通道(a, b, or c),N代表分区号;SCSI设备一描述为/dev/sdaXN。对于NFS情况,格式一般为:/,例如:knuth.aeb.nl:/。对于procfs,使用proc来定义。
fs_file - 该字段描述希望的文件系统加载的目录点,对于swap设备,该字段为none;对于加载目录名包含空格的情况,用40来表示空格。
fs_type - 定义了该设备上的文件系统,一般常见的文件类型为ext2 (Linux设备的常用文件类型)、vfat(Windows系统的fat32格式)、NTFS、iso9600等。
fs_options - 指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。对于大多数系统使用defaults就可以满足需要。其他常见的选项包括:
选项 含义
ro 以只读模式加载该文件系统
sync 不对该设备的写操作进行缓冲处理,这可以防止在非正常关机时情况下破坏文件系统,但是却降低了计算机速度
user 允许普通用户加载该文件系统
quota 强制在该文件系统上进行磁盘定额限制
noauto 不再使用mount -a命令(例如系统启动时)加载该文件系统
fs_dump - 该选项被dump命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0
fs_pass - 该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统/对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0
以上是默认的项目,对于不同的类型有不同的option,可以man mount查看,对于不同文件系统,选项不同例如,有些文件系统还有 codepage国家语言代码页 iocharset字符集选项
示例文件
/etc/fstab
/dev/hda8 swap swap defaults 0 0
/dev/hda9 / ext2 defaults 1 1
/dev/hda6 /wine vfat defaults,codepage=936,iocharset=cp936 0 0
/dev/hda7 /winf vfat defaults,codepage=936,iocharset=cp936 0 0
/dev/hdb /cdrom iso9660 noauto,user 0 0
none /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
fstab中存放了与分区有关的重要信息,其中每一行为一个分区记录,每一行又可分为六个部份,下面以/dev/hda7 / ext2 defaults 1 1为例逐个说明:
- 第一项是您想要mount的储存装置的实体位置,如hdb或/dev/hda6。
- 第二项就是您想要将其加入至哪个目录位置,如/home或/,这其实就是在安装时提示的挂入点。
- 第三项就是所谓的local filesystem,其包含了以下格式:如ext、ext2、msdos、iso9660、nfs、swap等,或如ext2,可以参见/prco/filesystems说明。
- 第四项就是您mount时(fstab里的选项是和mount的option对应的),所要设定的状态,如ro(只读)或defaults(包括了其它参数如rw、suid、exec、auto、nouser、async),可以参见「mount nfs」。
- 第五项是提供DUMP功能,在系统DUMP时是否需要BACKUP的标志位,其内定值是0。
- 第六项是设定此filesystem是否要在开机时做check的动作,除了root的filesystem其必要的check为1之外,其它皆可视需要设定,内定值是0。
对于已经挂载好的设备,现在要改变挂载参数,这时可以不用卸载该设备,而可以使用下面的命令(没有挂载的设备,remount 这个参数无效)
#mount /mnt/D/ -o remount,ro (改defaults为ro)
为了安全起见,可以指明其他挂载参数,例如:
noexec (不允许可执行文件可执行,但千万不要把根分区挂为noexec,那就无法使用系统了,连mount 命令都无法使用了,这时只有重新做系统了!
nodev (不允许挂载设备文件)
nosuid,nosgid (不允许有suid和sgid属性)
nouser (不允许普通用户挂载)
针对nfs,选择不同的nfs文件类型版本可能影响权限,例如
10.153.24.112这个服务器,原本是a1.nas.tkuat.com:/sdsfs/pension-oatms /tmsnfsdta nfs defaults 0 0配置的,但是wasadmin无法通过ftp下载nas 下的文件sftp可以,在系统里使用wasadmin拷贝也可以,最后改为
10.152.168.1:/sdsfs/pension-oatms /tmsnfsdta nfs4 defaults 0 0,使用nfs4类型可以了,排查过程主要是
nfsstat -m 看下版本
nfsstat -m
/tmsnfsdta from 10.152.168.1:/sdsfs/pension-oatms
Flags: rw,vers=4,rsize=1048576,wsize=1048576,hard,intr,proto=tcp,timeo=600,retrans=3,sec=sys,addr=10.152.168.1 其中可以看到vers=4
然后重新使用 mount.nfs4 a1.nas.tkuat.com:/sdsfs/pension-oatms /tmsnfsdta,发现 ftp正常了,所以重新修改了fstab改成了10.152.168.1:/sdsfs/pension-oatms /tmsnfsdta nfs4 defaults 0 0
unmount
不成功,显示device busy使用fuser或者lsof查找进程后kill,注意umount -f针对的是nfs(可以再man umount 中看到)
mtab
fstab说明了我们需要挂载的文件系统,即在此声明的文件系统,我们的系统才能识别、挂载
mtab说明在我们的系统中当前实际挂载的文件系统,包括具体的属性(defaults默认实际挂载会显示属性为rw)
mtab 文件记录的是,当前已挂载的分区信息。每当 mount 挂载分区、umount 卸载分区,都会动态更新 mtab,mtab 总是保持着当前系统中已挂载的分区信息,fdisk、df 这类程序,必须要读取 mtab 文件,才能获得当前系统中的分区挂载情况,包括伪文件系统
/etc/fstab和/etc/mtab是什么关系?
具体说说看?-----/etc/fstab是个配置文件,
而/etc/mtab则显示的是已经被挂载的fs的清单文件
man mount有一段
The programs mount and umount maintain a list of currently mounted file systems in the file /etc/mtab. If no arguments are given to mount,this list is printed
所以說 有mount上的filesystem會出現在/etc/mtab
fstab只是讓你是先設定一下mount point跟一些mount option 沒有的話其實也可以mount
fstab 是OS开机判断哪些要 mount 上來
而…
mtab 則是根据系统 mount 上了那些會实时更新
伪文件系统
Unix、Linux系统里面有文件描述符这个概念(万物皆文件),比如常规的文件,标准输入输出错误(0,1,2描述符),还有套接字,消息队列等等。
它们虽然存在文件系统中某个目录,但是不属于任何的文件系统,不占用硬盘的空间,只是在内存中作用。通过内核去管理调用,比如fifo有名管道,实际是内存缓冲区中用于进程通信的。这些文件通常被内核调用为系统提供某些功能。
伪文件系统
早期,UNIX 因为提供全局 API 以及将设备挂载到统一的文件系统命名空间的特性,大幅提升了输入/输出资源的集成度。这个方法是如此成功,以至于从那时开始有一种将更多资源和系统服务暴露为文件系统全局命名空间的趋势。Plan 9 是这种做法的先驱,而现在所有新的 UNIX 系统都这么做了。
这种方法导致产生了许多 伪文件系统,这些系统看起来和一般的文件系统一样,但是可以存取没有直接关联传统文件系统的资源。比如你可以使用伪文件系统来查询控制进程、存取内核内部或建立 TCP 连接。这些伪文件系统具有文件系统语义,可以展示分层信息,并为大部分对象提供了统一存取的方式。伪文件系统有时也被称为虚拟文件系统,特点是没有物理设备也没有备份存储器,只依靠内存来工作。
伪文件系统的例子:
procfs(/proc):proc 文件系统包含一个特殊文件层,这个文件层可以用来查询或控制运行中的进程,或通过标准文件入口(大部分基于文本)一窥内核内部文件。
devfs(/devor /devices):devfs 将所有系统中的设备以动态文件系统命名空间呈现。devfs 也可以通过内核设备驱动直接管理这些命名空间和接口,以此来提供智能的设备管理 —— 包括设备入口注册/反注册。
tmpfs(/tmp):临时文件系统的内容会在重启时消失,tmpfs 是为速度和效率而设计的,具有动态文件系统大小、用以空间清理的显式回退等特性。
portalfs(/p):通过 BSD 门户文件系统,你可以将一个服务器进程连接到文件系统通用命名空间上。这样可以提供明确的通过文件系统对网络服务的存取过程。比如一个 App 可以通过打开一个合规的文件 /p/tcp/ph7spot.com/smtp来和 ph7spot.com上的 SMTP 服务器进行交互。门户文件系统很神奇,因为它在文件系统中可以提供套接字语义,还可以被 UNIX 系统工具传输和使用(比如:cat, grep, awk等等)—— 甚至可以通过 shell 来使用!
ctfs(/system/contract):协定文件系统作为一个以文件为基础的接口的 Solaris 协定子系统。Solaris 协定为各种各样的事件和失败情况定义了一个进程或进程组的表现形式 —— 比如,进程停止时重启。 Solaris 协定为诸如群集故障转移软件,批处理排队系统和网格计算引擎等环境中的软件管理和监视提供了非常高级的功能。
block size
The problem with this is that there are four distinct units that you must be keeping in mind. To make things even worse, two of these units bear the same name. These are the different units:
- Hardware block size, “sector size”
- Filesystem block size, “block size”
- Kernel buffer cache block size, “block size”
- Partition table block size, “cylinder size”
To differentiate between the filesystem block size and the buffer cache block size, I will follow FAT terminology and use “cluster size” for the filesystem block size.
The sector size is the units that the hardware deals with. This ranges between different hardware types, but most PC-style hardware (floppies, IDE disks, etc.) use 512 byte sectors.
The cluster size is the allocation unit that the filesystem uses, and is what causes fragmentation - I’m sure you know about that. On a moderately sized ext3 filesystem, this is usually 4096 bytes, but you can check that with dumpe2fs. Remember that these are also usually called “blocks”, only that I refer to them as clusters here.
The cluster size is what gets returned in st_blksize in the stat buffer, in order for programs to be able to calculate the actual disk usage of a file.
The block size is the size of the buffers that the kernel uses internally when it caches sectors that have been read from storage device (hence the name “block device”). Since this is the most primitive form of storage in the kernel, all filesystem cluster sizes must be multiples of this. This block size is also what is almost always referred to by userspace programs. For example, when you run “du” without the -h or -H options, it will return how many of these blocks a file takes up. df will also report sizes in these blocks, the “Blocks” column in the fdisk -l output is of this type, and so on. It is what is most commonly referred to as a “block”. Two disk sectors fit into each block.
The cylinder size is only used in the partition table and by the BIOS (and the BIOS isn’t used by Linux).
“df” only operates on filesystems, so, no, it can’t be used without a filesystem - without a filesystem, the data that it would return doesn’t exist. “du” operates on individual files.
管理命令
mke2fs
mke2fs is used to create an ext2, ext3, or ext4 filesystem, usually in a disk partition.当前主流已经使用xfs系统ext家族逐步退出历史舞台。
option选项主要有:
-j:创建ext3类型文件系统
-b:指定块大小,默认4096:可用取值1024、2048、4096
-L:指定卷标
-m:指定预留给超级用户的百分比
-i:用于指定多少字节空间创建一个inode,默认8192,这里给出的数值应该为块大小的2^n倍 mke2fs -i 4096 /dev/sda5 //指定每4k创建一个inode。inode增多意味着可以存储更多的小文件。因为如果按照默认的8k创建一个inode。当存储过多的小文件时可能会将inode用完。一般来说不用改了8k也不差。
-N:指定inode数,用的不多
-F:强制创建文件系统
-E:用户指定额外文件系统属性
mkfs.ext3 或者 mke2fs -t ext3指定
mkfs -t ext3 /dev/sdb1 输出的一些信息介绍
mke2fs 1.41.12 (17-May-2010)
Filesystem label= #当前分区的盘符
OS type: Linux #操作系统类型
Block size=4096 (log=2) #组成文件系统的最小单元,块大小
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
251472 inodes, 1004054 blocks #当前文件系统(这个分区)共有251472inode(inode是用于存储文件的元数据信息,后边详细说明),共有1004054个数据块
50202 blocks (5.00%) reserved for the super user #为root用户保留50202个数据块,保障root用户能对当前磁盘进行操作。默认是总容量的5%,此数值可调且很有必要调。
First data block=0
Maximum filesystem blocks=1031798784
31 block groups #块组个数共31个(这个是文件系统的结构信息,后边会有详细介绍)
32768 blocks per group, 32768 fragments per group #每个块组有32768个数据块
8112 inodes per group #每个块组有8112个innode,后边会有文件系统的结构详细解释,看完就明白了
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736 #超级块被存贮在那些块上(超级块会按照一定的算法存储在不同的块组的块中,主要用来保证文件系统的安全,存储分区的很多信息,后边会详细介绍。着急的话自行google)
Writing inode tables: done #向文件系统里边写inode
Creating journal (16384 blocks): done #ext3是日志型操作系统,对文件错误的查找速度更快。此处创建日志
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 33 mounts or #此文件系统将会在33次后或者180天后被自动检查,一般应该加以控制,防止在一些关键业务上由于文件系统的检查使得性能下降甚至出现问题
180 days, whichever comes first. Use tune2fs -c or -i to override. #可以使用tune2fs来覆盖默认检查机制
注:cat /proc/filesystems 查看当前操作系统支持那些文件系统。
e2label
主要功能有两个:
- 查看 指定分区的当前卷标。
- 设置或修改 指定分区的卷标。
一般不太使用
e2label /dev/sdb1 MY_DATE1 #设置分区盘符
e2label /dev/sdb1 #查看分区盘符 当然blkid也能看见。盘符也经常用来进行自动挂载
tune2fs
tune2fs 命令语法:tune2fs [option] 文件系统名字(分区)
这个命令可以在文件系统挂载状态下使用
[option]主要有:
-j:不损坏原有数据,将ext2升级为ext3
例:tune2fs -j /dev/sda5 //调整分区sda5的文件系统类型为ext3,无损修改,里边有文件也没有问题。
-L:设定或修改卷标
例:tune2fs -L MY_DATA1 /dev/sdb1 //修改卷标
-m:调整预留百分比
例:tune2fs -m 3 /dev/sdb1 //修改为管理员预留的空间大小,默认5%
-r:指定预留块数
例: tune2fs -r30122 /dev/sdb1
-o:设定默认挂载选项
acl ,一般在/etc/fstab里边指定。 例 tune2fs -o acl /dev/sdb1 //使用acl控制列表。开启这个功能才可以对文件的权限设置使用facl功能。
-c:指定挂载次数到达多少之后进行自检,0或-1表示关闭此功能。与下边的-i一块用的情况多点
-i:每挂载使用多少天后进行自检,0或者-1表示关闭此功能
-l:显示超级快信息 tune2fs -l /dev/sdb1
dumpe2fs
dumpe2fs /dev/sda5 //显示超级块信息
dumpe2fs -h /dev/sda5 //只显示超级快信息
fsck
fsck -t ext3 /dev/sdb1 //检查文件系统
fsck -p /dev/sdb1 //修复文件系统
mount
mount [option] [-o option] DEVICE MOUNT_POINT
[option]
-a:表示只挂载/etc/fstab中的文件系统
-n:默认情况mount每挂载一个文件系统就会将挂载得设备信息保存到/etc/mtab文件中
-t: FS_TYPE:指定正在挂载设备上的文件系统类型,不适用此选项时mount会调用blkid命令获取对应文件系统类型。一般挂载ntfs文件系统是时会使用此选项。
-r:只读挂载文件系统
-w:“读写”挂载文件系统
-o :指定挂载的额外选项
remount:重新挂载当前文件系统
ro:只读挂载
rw:读写挂
umount
umount 设备/挂载点 //注意卸载文件系统的时候,此文件系统没有进程在使用。
例:umount /dev/sdb1
如果文件系统卸载不了,显示“busy”:
fuser -v /mnt/目录名 //查看谁或者那个进程正在访问这个文件系统(分区)
fuser -km /mnt/目录名 //将使用文件系统的用户或进程,踢出去或kill掉。之后再次umount即可
使用lsof也可以看
swap
#(交换分区的格式化):
mkswap /dev/sdb2 //创建交换分区。尽量不要使用交换分区,太慢了。
-L LABEL
swapon /dev/sdb2 //打开交换分区/dev/sdb2的使用
swapoff /dev/sdb2 //关闭交换分区/dev/sdb2的使用
#查看交换分区是否生效
free -m
total used free shared buffers cached
Mem: 1862 579 1283 0 32 204 #总共2G不到,使用了579M,空余1283M ,共享存储0M,缓冲32M,缓存204M
-/+ buffers/cache: 342 1520 #+-缓冲和缓存后的使用量342M,空闲1520M
Swap: 3999 0 3999 #交换分区4G,空余4G
# 关闭swap分区:
# 查看当前 swap 使用情况:
$ free -m
# 禁用 swap:
$ sudo swapoff -a
# 永久禁用 swap,需要修改 /etc/fstab 文件:
$ sudo vi /etc/fstab
# 在文件中找到包含 swap 的行,注释掉该行或者删除该行。
# /dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
# 重新启动系统,确认 swap 已经禁用:
$ free -m
作快照和作raid
创建快照(ETX4)
前提:快照卷和逻辑卷在同一个VG中
原始卷:lv2 centos -wi-ao---- 500.00m
快照卷:lv1-snap–/mnt/lv1-snap 2020.3.19.17.48
lvcreate -n lv2-snap -s -L 1G -p r /dev/centos/lv2 将会在/dev/centos/lv2的同一个VG内创建一个名称lv2-snap的lv
root@localhost lv2]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 centos -wi-ao---- 9.50g
lv2 centos owi-aos— 500.00m
lv2-snap centos swi-a-s— 100.00m lv2 0.00
[root@localhost ~]# mkfs.ext4 /dev/centos/lv2-snap
[root@localhost ~]# mkdir /mnt/lv2-snap
[root@localhost ~]# mount -o ro /dev/centos/lv2-snap /mnt/lv2-snap/
[root@localhost ~]# lvscan
ACTIVE '/dev/centos/lv1’ [9.50 GiB] inherit
ACTIVE Original '/dev/centos/lv2’ [500.00 MiB] inherit
ACTIVE Snapshot '/dev/centos/lv2-snap’ [100.00 MiB] inherit
挂载快照、尽量使用ro的方式,将不会破坏快照卷中的数据
raid
就不作赘述了,基本不会再OS层做了
lsof用法
lsof(list open files)是一个列出当前系统打开文件的工具。linux下万物皆文件,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 3,3 1024 2 /
init 1 root rtd DIR 3,3 1024 2 /
init 1 root txt REG 3,3 38432 1763452 /sbin/init
... ...
init 1 root 10u FIFO 0,15 1309 /dev/initctl
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小bytes
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
其中FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。
与 FD 列相比,Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
lsof常用参数:
===== lsof常用参数 =====
lsof 常见的用法是:
查找应用程序打开的文件的名称和数目。
查找出某个特定应用程序将日志数据记录到何处,
或者正在跟踪某个问题。如,linux限制了进程能够打开文件的数目。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。lsof语法格式是:
lsof [options] filename
常用的参数列表:
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
例1: 查看22端口现在运行的情况
# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 1409 root 3u IPv6 5678 TCP *:ssh (LISTEN)
例2:查看所属root用户进程所打开的文件类型为txt的文件:
# lsof -a -u root -d txt
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root txt REG 3,3 38432 1763452 /sbin/init
mingetty 1632 root txt REG 3,3 14366 1763337 /sbin/mingetty
... ...
kdm 1671 root txt REG 3,3 132548 1428194 /usr/bin/kdm
... ...
例3:查找谁在使用文件系统 ====
# lsof /GTES11/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/
在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。
这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因。
mknod
mknod命令用于创建一个设备文件,即特殊文件 。
首先要明白什么是设备文件,简单的我们说 操作系统与外部设备(如磁盘驱动器,打印机,modern,终端 等等)都是通过设备文件来进行通信的,在Unix/Linux系统与外部设备通讯之前,这个设备必须首先要有一个设备文件,
设备文件均放在/dev目录下 一般情况下在安装系统的时候系统自动创建了很多已检测到的设备的设备文件,但有时候我们也需要自己手动创建,
命令行生成设备文件的方式有 insf,mksf,mknod等等,
根据mknod命令的使用参数来看【mknod Name { b | c } Major Minor 】,使用mknod之前,至少要明白以下几点:
设备文件类型:分为块设备和字符设备。ls -l /dev 结果显示第一个字段有b*** 和 c****,这里即标识了块设备和字符设备。 字符设备文件----字符设备文件传送数据给设备的时候,一次传送一个字符,终端,打印机,绘图仪,modern等设备都经过字符设备文件传送数据
块设备—系统通过块设备文件存取一个设备的时候,先从内存中的buffer中读或写数据,而不是直接传送数据到物理磁盘,这种方式能有效的提高磁盘和CD-ROMS的I/O性能。磁盘和CD-ROMS即可以使用字符设备文件也可使用块设备文件。
主号和次号:
主号:当在任意目录使用ls -l 时,结果的第5个字段就是主号,设备主号代表了这个设备使用的是哪个设备驱动程序
次号:次号是一个24位的十六进制数字,定义了设个设备在系统中的物理的位置 就拿我们常用的创建卷组来看;
先来看看mknod 命令,如果该设备文件你想放在一个特定的文件夹下当然就先创建文件夹 mknod 设备文件名[/dev/xyz] b/c 主号 次号 { mkdir /dev/vg01 mknod /dev/vg01/group c 64 0X010000 } 创建之后,就可以使用你想要创建的设备对于德创建命令了,如我现在的卷组的创建命令: vgcreate /dev/vg01 /dev/dsk/ctd* 一直进行下去 之后的步骤根据不同的设备而不尽相同
fallocate
用于为文件预分配或释放磁盘空间的命令。它可以直接操作文件系统的空间分配,而不需要实际写入数据。这在处理大文件时特别有用,因为它可以快速分配空间,避免后续写入时因空间不足而失败,同时也可以提高写入性能。
主要作用:
- 预分配空间:可以快速为一个文件分配指定大小的磁盘空间。这对于需要创建大文件的应用(如数据库、虚拟化磁盘镜像)非常有用,可以确保文件有连续的磁盘空间,提高后续IO性能。
- 释放空间:可以释放文件中指定范围的磁盘空间,将文件中的某些区间打洞(hole),从而减少文件的磁盘占用(稀疏文件)。
与dd命令的区别:
使用dd命令创建大文件需要写入数据(即使写0),速度较慢。而fallocate只是分配空间,因此速度非常快。
与truncate命令的区别:
truncate命令可以设置文件大小,但不会实际分配磁盘空间(创建的是稀疏文件)。fallocate在默认情况下(预分配)会实际分配磁盘空间,确保空间被保留。
因此,fallocate在需要快速分配磁盘空间并确保空间可用的场景下非常有用。
# 预分配 1GB 空间给文件
fallocate -l 1G large_file.bin
# 预分配 100MB 空间
fallocate -l 100M data.bin
fuser
fuser -4 -n tcp 6379
6379/tcp: 585
[root@t0-cxtest-tkcnpic-redis03 ~]# ps -ef|grep -i 585
redis 585 1 0 May25 ? 01:39:37 ./redis-server *:6379 [cluster]
root 746 32652 0 08:29 pts/3 00:00:00 grep --color=auto -i 585
root 31585 2 0 08:09 ? 00:00:00 [kworker/5:1]
c 当前路径(current directory.)我的理解是表示这个资源的占用是以文件目录方式,也就是进进入了需要释放的资源的路径,这是最常用的资源占用方式。
e 正在运行可执行文件(executable being run.),比如运行了光盘上的某个程序
f 打开文件( open file),缺省模式下f忽略。所以上面的例子中,虽然是开打了光盘上的Autorun.inf文件,但是给出的标识是c,而不是f。
r root目录(root directory).没有明白什么意思,难道是说进入了/root这个特定目录?
m mmap文件或者共享库( mmap’ed file or shared library).这应该是说某个进程使用了你要释放的资源的某个共享文件。
在查找的同时,你还可定指定一些参数,比如:
-k 杀死这些正在访问这些文件的进程。除非使用-signal修改信号,否则将发送SIGKILL信号。
-i 交互模式
-l 列出所有已知的信号名称。
-n 空间,选择不同的名字空间,可是file,udp,tcp。默认是file,也就是文件。
-signal 指定发送的信号,而不是缺省的SIGKILL
-4 仅查询IPV4套接字
-6 仅查询IPV6套接字
- 重置所有的选项,将信息设回SIGKILL
rm -rf /test 因为挂载点的原因报错
rm: cannot remove ?.test?. Device or resource busy
[root@t0-cxtest-tkcnpic-redis03 ~]#
[root@t0-cxtest-tkcnpic-redis03 ~]# pwd
/root
[root@t0-cxtest-tkcnpic-redis03 ~]# umount /test 因为目录有人用报错
umount: /test: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
lsof|grep -i /test 查看占用的进程
bash 29698 admin cwd DIR 252,0 4096 2 /test
bash 32522 root cwd DIR 252,0 4096 2 /test
[root@t0-cxtest-tkcnpic-redis03 ~]# fuser /test 查看占用的进程
/test: 29698c 32522c
[root@t0-cxtest-tkcnpic-redis03 ~]# fuser -km /test 干掉占用的进程
/test: 29698c 32522c

被折叠的 条评论
为什么被折叠?



