磁盘管理
fdisk命令用于管理磁盘分区,格式为:“fdisk [磁盘名称]”。
管理Linux系统中的硬盘设备最常用的方法就当属是fdisk命令了,这条命令提供了添加、删除、转换分区等等功能于一身的“一站式服务”,不过这条命令的参数是交互式的,而不是像我们以前直接写到命令后面的参数一样,这样在管理硬盘设备的时候特别方便,可以根据需求动态的调整。
参数 | 作用 |
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区表信息 |
w | 保存并退出 |
q | 不保存直接退出 |
1.首先使用fdisk命令尝试管理/dev/sdb硬盘设备,看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,这其中包括了硬盘的容量大小,扇区个数等等信息:
[root@linuxprobe ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x47d24a34. Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x47d24a34 Device Boot Start End Blocks Id System
2.输入参数n来尝试新建分区信息,系统会要求选择继续输入参数p来创建主分区,或者输入参数e来创建扩展分区,因此我们输入参数p来创建一个主分区:
Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p
3.确认创建一个主分区后,系统要求您先输入分区的编号,我们知道主分区的编号范围是1-4,因此默认输入1就可以了,接下来系统会提示咱们定义下起始的扇区,这一项我们默认不需要改动,系统会自动计算出最靠前空闲的扇区位置,我们只需要敲击一下回车就可以,最后系统会要求咱们定义分区的结束扇区位置,这其实就是想要咱们去定义下整个分区的大小是多少,但其实我们不用去算扇区的个数,只需要输入+2G即可创建出一个容量为2G的硬盘分区。
Partition number (1-4, default 1): 1 First sector (2048-41943039, default 2048):此处敲击回车 Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G Partition 1 of type Linux and of size 2 GiB is set
4.再次使用参数p来查看下硬盘设备中的分区信息,果然就能看到一个名称为/dev/sdb1,起始扇区为2048,结束扇区是4196351的分区啦,这时候千万不要直接关闭窗口,而应该敲击参数w后回车,这样我们的分区信息才是真正的写入成功啦。
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x47d24a34
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
5.当我们做完上面所说的所有步骤后,咱们的Linux系统会自动将这个硬盘分区抽象成/dev/sdb1这个设备文件,我们可以用file命令来看到这个文件的属性,但是刘遄老师在讲课和工作中发现有些时候系统并没有自动的将分区信息同步给Linux内核,而且这种情况似乎还比较常见,但不能算作是严重的bug,因为如果设备信息没有被抽象为文件,我们也可以输入partprobe命令来手动的同步信息到内核,而且一般推荐敲击两次会效果更佳,但一旦遇到连这个命令都不能解决的时候,咱们就重启计算机吧,这个方法一定会有用的。
[root@linuxprobe ]# file /dev/sdb1 /dev/sdb2: cannot open (No such file or directory) [root@linuxprobe ]# partprobe [root@linuxprobe ]# partprobe [root@linuxprobe ]# file /dev/sdb1 /dev/sdb1: block special
Linux系统对于没有被格式化的存储设备是不知道怎么样写入数据的,因此当咱们对存储设备分区后需要再进行一次格式化操作,很类似于咱们平时给白纸划上横线,这样我们再写字的时候就会十分规整有条理啦,在Linux系统中用于格式化的是mkfs命令,这条命令很有意思,因为当我们在Shell终端中输入mkfs后再敲击两下Tab键补齐命令就会有这样的效果:
[root@linuxprobe ~]# mkfs mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
对!这个mkfs命令作为一款格式化的工具非常贴心,它把常用的文件系统名称用后缀的方式保存成了文件,使用方法非常的简单:"mkfs.文件类型名称",例如要格式分区为xfs,则命令为"mkfs.xfs/dev/sdb1"。
[root@linuxprobe ~]# mkfs.xfs /dev/sdb1 meta-data=/dev/sdb1 isize=256 agcount=4, agsize=131072 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 data = bsize=4096 blocks=524288, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
终于把存储设备给分区、格式化好了,接下来就是要来挂载并使用啦。这些步骤也非常的简单,首先是创建一个用于挂载设备的挂载点目录,然后使用mount命令将存储设备与挂载点进行关联,最后我们还可以用df -h命令来查看下挂载状态和硬盘使用量信息。
[root@linuxprobe ~]# mkdir /newFS [root@linuxprobe ~]# mount /dev/sdb1 /newFS/ [root@linuxprobe ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 18G 3.5G 15G 20% / devtmpfs 905M 0 905M 0% /dev tmpfs 914M 140K 914M 1% /dev/shm tmpfs 914M 8.8M 905M 1% /run tmpfs 914M 0 914M 0% /sys/fs/cgroup /dev/sr0 3.5G 3.5G 0 100% /media/cdrom /dev/sda1 497M 119M 379M 24% /boot /dev/sdb1 2.0G 33M 2.0G 2% /newFS
du命令用于查看文件的数据占用量,格式为:“ du [选项] [文件]”。
既然存储设备已经顺利的挂载完毕,我们就可以来尝试通过挂载点目录往存储设备中写入文件了,顺便再给同学们介绍一下用于查看文件数据占用量的du命令,简单来说就是看一个或多个文件占用了多大的硬盘空间,还可以用du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小,那么比如我们可以先从某些目录中复制过来一批文件,然后查看下这些文件总共占用了多大的容量:
[root@linuxprobe ~]# cp -rf /etc/* /newFS/ [root@linuxprobe ~]# ls /newFS/ abrt hosts pulse adjtime hosts.allow purple aliases hosts.deny qemu-ga aliases.db hp qemu-kvm alsa idmapd.conf radvd.conf alternatives init.d rc0.d anacrontab inittab rc1.d ………………省略部分输入信息……………… [root@linuxprobe ~]# du -sh /newFS/ 33M /newFS/
细心的同学一定想到刚刚咱们讲过使用mount命令挂载的设备文件会在下一次重启的时候失效,因此如果您还想让这个设备文件的挂载永久的有效下去,我们需要将挂载的信息项目写入到配置文件才可以:
[root@linuxprobe ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Wed May 4 19:26:23 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/rhel-root / xfs defaults 1 1 UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2 /dev/mapper/rhel-swap swap swap defaults 0 0 /dev/cdrom /media/cdrom iso9660 defaults 0 0 /dev/sdb1 /newFS xfs defaults 0 0
6.6 添加交换分区
SWAP交换分区是一种类似于Windows系统虚拟内存的功能,将一部分硬盘空间虚拟成内存来使用,从而解决内存容量不足的情况,因为SWAP毕竟是用硬盘资源虚拟的,速度上比真实物理内存要慢很多,所以一般只有当真实物理内存耗尽时才会调用SWAP交换分区,把内存中暂时不常用的数据临时存放到硬盘中,腾出内存空间让更活跃的程序服务来使用。
1.SWAP交换分区的创建过程非常类似于我们上一个小节所讲到的分区设备挂载使用的方法,首先第一步就是再进行对/dev/sdb存储设备分区操作,取出一个大小为5GB的主存储分区然后保存退出即可:
[root@linuxprobe ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0xb3d27ce1. Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extendedSelect (default p): p Partition number (2-4, default 2): First sector (4196352-41943039, default 4196352): 此处敲击回车 Using default value 4196352 Last sector, +sectors or +size{K,M,G} (4196352-41943039, default 41943039): +5G Partition 2 of type Linux and of size 5 GiB is set Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xb0ced57f Device Boot Start End Blocks Id System /dev/sdb1 2048 4196351 2097152 83 Linux /dev/sdb2 4196352 14682111 5242880 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) Syncing disks.
2.将新建的存储分区使用SWAP交换分区专用的格式化mkswap命令进行格式化操作:
[root@linuxprobe ~]# mkswap /dev/sdb2 Setting up swapspace version 1, size = 5242876 KiB no label, UUID=2972f9cb-17f0-4113-84c6-c64b97c40c75
3.接下来我们使用swapon命令将准备好的SWAP交换分区设备正式的挂载到系统中,并可以使用free -m 命令来看到交换分区大小的变化(由2047M提升至了7167M):
[root@linuxprobe ~]# free -m total used free shared buffers cached Mem: 1483 782 701 9 0 254 -/+ buffers/cache: 526 957 Swap: 2047 0 2047 [root@linuxprobe ~]# swapon /dev/sdb2 [root@linuxprobe ~]# free -m total used free shared buffers cached Mem: 1483 785 697 9 0 254 -/+ buffers/cache: 530 953 Swap: 7167 0 7167
4.对了~为了能够让咱们新的SWAP交换分区设备在重启后依然生效,我们需要按照下面的格式写入到配置文件中,记得保存哦~
[root@linuxprobe ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Wed May 4 19:26:23 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/rhel-root / xfs defaults 1 1 UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2 /dev/mapper/rhel-swap swap swap defaults 0 0 /dev/cdrom /media/cdrom iso9660 defaults 0 0 /dev/sdb1 /newFS xfs defaults 0 0 /dev/sdb2 swap swap defaults 0 0
6.7 磁盘容量配额
前面章节讲到的Linux系统的设计初衷理念就让许多人一起使用,成为多用户、多任务的操作系统,但是硬件的资源是固定有限的,如果出现个小破坏份子不断的创建文件或下载电影,那么硬盘空间总有一天会被占满的吧,这时就需要磁盘配额服务帮助管理员限制某用户或某个用户组对特定文件夹可以使用的最大硬盘空间,一旦超出预算就不再允许他们继续使用。quota服务做磁盘配额可以限制用户的硬盘可用量或最大创建文件数量,并且还有软、硬限制的功能:
软限制:当达到软限制时会提示用户,但允许用户在规定额度内继续使用。
硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
在红帽RHEL7系统中已经默认安装了quota磁盘配额服务程序包,但是硬盘设备默认是没有支持的,我们需要手动的编辑一下配置文件让对应的/boot目录能够支持了quota磁盘配额技术,对于学习过早期Linux系统或有红帽RHEL6系统使用经验的同学可能会犯一个小错误,因为原先让设备支持quota磁盘配合服务的是usrquota参数,而在本系统中则是uquota参数,然后重启系统后就能使用mount命令看到/boot目录已经支持了quota磁盘配额技术啦:
[root@linuxprobe ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Wed May 4 19:26:23 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/rhel-root / xfs defaults 1 1 UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults,uquota 1 2 /dev/mapper/rhel-swap swap swap defaults 0 0 /dev/cdrom /media/cdrom iso9660 defaults 0 0 /dev/sdb1 /newFS xfs defaults 0 0 /dev/sdb2 swap swap defaults 0 0 [root@linuxprobe ~]# reboot [root@linuxprobe ~]# mount | grep boot /dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
接下来创建一个用于检查磁盘配额效果的用户,并对/boot目录增加其他人的写权限,保证咱们的用户能够正常的写入数据:
[root@linuxprobe ~]# useradd tom [root@linuxprobe ~]# chmod -Rf o+w /boot
xfs_quota命令用于管理XFS文件系统的quota硬盘配额,格式为:“quota [参数] 配额 文件系统”。
这是一个专门针对于XFS文件系统管理quota磁盘配额服务而设计的命令,其中-c参数用于以参数的形式设置要执行的命令,-x参数是专家模式,让我们能够对quota服务做更多复杂的配置。那么我们来用xfs_quota命令设置tom用户对/boot目录的磁盘配额吧,具体的限额控制包括有硬盘使用软限制为3M,硬盘使用硬限制为6M,创建文件数量软限制为3个,创建文件硬限制为6个。
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot [root@linuxprobe ~]# xfs_quota -x -c report /boot User quota on /boot (/dev/sda1) Blocks User ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- root 95084 0 0 00 [--------] tom 0 3072 6144 00 [--------]
当我们配置好quota磁盘配额服务对tom用户在/boot目录上的各种限制后,就可以尝试切换到这个普通用户的身份上,然后分别尝试创建一个体积为5M和8M的文件,很明显第二次就会受到了系统限制:
[root@linuxprobe ~]# su - tom
[tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.123966 s, 42.3 MB/s
[tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
dd: error writing ‘/boot/tom’: Disk quota exceeded
1+0 records in
0+0 records out
6291456 bytes (6.3 MB) copied, 0.0201593 s, 312 MB/s
edquota命令用于编辑用户的quota配额限制,格式为:“edquota [参数] [用户]”。
在为用户设置了quota磁盘配额限制后可以用edquota来随着需求的变化而进一步修改限额的数值,其中-u参数代表要针对那个用户进行的设置,-g参数则代表要针对那个用户组进行的设置,edquota命令会调用vi或vim编辑器来让用户修改要限制的项目,比如我们把tom用户的硬盘使用量限额从5M提升到8M来试一试吧:
[root@linuxprobe ~]# edquota -u tom Disk quotas for user tom (uid 1001): Filesystem blocks soft hard inodes soft hard /dev/sda1 6144 3072 8192 1 3 6 [root@linuxprobe ~]# su - tom Last login: Mon Sep 7 16:43:12 CST 2015 on pts/0 [tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1 1+0 records in 1+0 records out 8388608 bytes (8.4 MB) copied, 0.0268044 s, 313 MB/s [tom@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=10M count=1 dd: error writing ‘/boot/tom’: Disk quota exceeded 1+0 records in 0+0 records out 8388608 bytes (8.4 MB) copied, 0.167529 s, 50.1 MB/s
6.8 软硬方式链接
当我们学习完了第六章中所有对硬盘管理的知识后,刘遄老师终于放心可以给同学们讲一下在Linux系统中的“快捷方式”啦。在Windows系统中的快捷方式就是指向原始文件的一个链接文件,让用户能够从不同的位置来访问到原始的文件,而原文件一旦被删除或剪切到其他地方也会导致链接文件失效,但是这个看似简单的东东在Linux系统中可不太一样。
硬链接(hard link)可以被理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode与文件,所以实际上来讲硬链接文件与原始文件其实是同一个文件,只是名字不同。于是每添加一个硬链接,该文件的inode连接数就会增加1,直到该文件的inode连接数归0才是彻底删除。也就是说因为硬链接实际就是指向原文件inode的指针,即便原始文件被删除依然可以通过链接文件访问,但是由于技术的局限性而不能跨文件系统也不能链接目录文件。
软链接也称为符号链接(symbolic link)即“仅仅包含它所要链接文件的路径名”因此能做目录链接也可以跨越文件系统,但原始文件被删除后链接文件也将失效,性质上和Windows™系统中的“快捷方式”是一样的。
ln命令用于创建链接文件,格式为:“ln [选项] 目标”。
咱们可以使用ln命令创建出两种性质不同的快捷方式文件,而这个差别实际只在这个-s参数上面,因此如果没有扎实的理论知识和实践经验做铺垫,可能实验能够做成功,但永远不会明白为什么会成功。
参数 | 作用 |
-s | 创建"符号链接"(默认是硬链接) |
-f | 强制创建文件或目录的链接 |
-i | 覆盖前先询问 |
-v | 显示创建链接的过程 |
为了更好的理解软、硬链接文件的不同性质,咱们先来尝试创建一个类似于Windows系统中的快捷方式软链接吧,这样当原始文件被删除后,新建出来的链接文件一定也就不能再继续读取了。
[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > readme.txt [root@linuxprobe ~]# ln -s readme.txt readit.txt [root@linuxprobe ~]# cat readme.txt Welcome to linuxprobe.com [root@linuxprobe ~]# cat readit.txt Welcome to linuxprobe.com [root@linuxprobe ~]# ls -l readme.txt -rw-r--r-- 1 root root 26 Jan 11 00:08 readme.txt [root@linuxprobe ~]# rm -f readme.txt [root@linuxprobe ~]# cat readit.txt cat: readit.txt: No such file or directory
接下来我们创建一个Linux系统中的硬链接来再对原文件硬盘存储位置做一个指针,而这样就不再依赖于原始文件的名称等等信息,也不会在因原文件被删除后导致新的文件读取失败,同时可以看到创建硬链接后的原文件的硬盘链接数量被增加到了2。
[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > readme.txt [root@linuxprobe ~]# ln readme.txt readit.txt [root@linuxprobe ~]# cat readme.txt Welcome to linuxprobe.com [root@linuxprobe ~]# cat readit.txt Welcome to linuxprobe.com [root@linuxprobe ~]# ls -l readme.txt -rw-r--r-- 2 root root 26 Jan 11 00:13 readme.txt [root@linuxprobe ~]# rm -f readme.txt [root@linuxprobe ~]# cat readit.txt Welcome to linuxprobe.com