Linux学习笔记(14)文件系统管理
1 回顾分区与系统
(1)分区类型
Linux的分区一般包括主分区,扩展分区和逻辑分区。其中:
主分区最多只能分4个;
扩展分区只能有一个,也算作主分区的一种,即主分区加扩展分区最多有4个。但扩展分区不能存储数据和格式化,必须再划分成逻辑分区才能使用;
逻辑分区是由扩展分区划分出来的。如果是IDE硬盘,Linux最多支持59个逻辑分区,如果是SCSI硬盘,Linux最多只能支持11个逻辑分区。
(2)文件系统
Linux中常见的文件系统包括ext2,ext3,ext4。
ext2是ext文件系统的升级版本,RedHat Linux7.2版本以前的系统默认都是ext2文件系统。1993年发布,最大支持16TB的分区和最大2TB的文件。
ext3是ext2文件系统的升级版本,最大的区别在于增加了日志功能,可以在系统突然停止时提供系统文件系统的可靠性。支持最大16TB的分区和最大2TB的文件。
ext4是ext3的升级版本。ext4在性能、伸缩性和可靠性方面进行了大量改进。ext4的变化有向下兼容了ext3,最大支持1EB文件系统和16TB文件,无线数量子目录,Extents连续数据块概念,多块分配,延迟分配,持久预分配,快速fsck,日志校验,无日志模式,在线碎片整理,iNode增强,默认启动barrier等。
2 文件系统常用命令
(1)df,du,fsck及dumpe2fs命令
1)df是文件系统查看命令,其格式为:
df [选项] [挂载点]
其中,-a选项表示显示所有文件系统信息,包括特殊文件系统如/proc,/syfs等,-h选项表示使用习惯单位显示容量如KB、MB、GB等,-T表示显示文件系统的文件类型,-m选项表示以MB为单位显示容量,-k选项表示以KB为单位显示容量,默认就是以KB为单位。
例:查看本机的文件系统:
[root@localhost ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda5 ext4 14G 2.0G 11G 16% / tmpfs tmpfs 504M 0 504M 0% /dev/shm /dev/sda1 ext4 291M 32M 244M 12% /boot /dev/sda2 ext4 4.0G 136M 3.7G 4% /home
2)du命令用于统计目录或文件的大小,其格式为:
du [选项] [目录或文件名]
其中,-a选项表示显示每个子文件的磁盘占用量,默认只统计子目录的磁盘统计量,-h选项表示使用习惯单位显示磁盘占用量,-s选项表示统计总占用量,而不是列出子目录和子文件的占用量。
注:ls命令只会统计目录下的第一级子目录及文件的占用空间。
例:使用ls命令和du命令分别统计/etc目录的大小:
[root@localhost ~]# du -sh /etc/ 27M /etc/ [root@localhost ~]# ls -ld /etc/ drwxr-xr-x. 103 root root 12288 1月 31 05:00 /etc/
3)df与du命令的区别
df命令时从文件系统考虑的,不仅考虑文件的占用空间,还要统计被命令或程序占用的空间。最常见的就是文件已经删除,但是程序并没有释放空间。
du命令是面向文件的,只会计算文件或目录占用的空间。
例:分别使用df和du显示根目录"/"的大小:
[root@localhost ~]# df -h / Filesystem Size Used Avail Use% Mounted on /dev/sda5 14G 2.0G 11G 16% / [root@localhost ~]# du -sh / du: 无法访问"/proc/1597/task/1597/fd/4": 没有那个文件或目录 du: 无法访问"/proc/1597/task/1597/fdinfo/4": 没有那个文件或目录 du: 无法访问"/proc/1597/fd/4": 没有那个文件或目录 du: 无法访问"/proc/1597/fdinfo/4": 没有那个文件或目录 1.9G /
4)fsck是文件系统的修复命令,其格式为:
fsck [选项] 分区设备文件名
其中,-a选项表示不同显示用户提示,自动修复文件系统,-y选项表示自动修复,和-a的作用一致,不过有些文件系统只支持-y。
5)dumpe2fs命令用于显示磁盘状态命令,其格式为:
dumpe2fs 分区设备文件名
例:查看/dev/sda1的磁盘状态,使用-h选项仅显示超级块信息:
[root@localhost ~]# dumpe2fs -h /dev/sda1 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: <none> Last mounted on: /boot Filesystem UUID: 0b5697a3-9081-4b75-bf4c-71b4891d5e86 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean …………
(2)挂载命令
1)查询与自动挂载
mount命令用于查询系统中已经挂载的设备,如显示系统已挂载的设备:
[root@localhost ~]# mount /dev/sda5 on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0") /dev/sda1 on /boot type ext4 (rw) /dev/sda2 on /home type ext4 (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
加上-l选项表示显示卷标名称。加上-a选项则表示依据配置文件/etc/fstab的内容,自动挂载。
2)挂载命令格式为:
mount [-t 文件系统] [-L卷标名] [-o 特殊选项] 设备文件名 挂载点
其中,-t选项表示加入文件系统类型来指定挂载的类型,可以为ext3、ext4(针对于Linux)、iso9660(光盘)、fat(win16)、vfat(win32)等文件系统;
-L选项为卷标名,表示挂载指定卷标的分区,而不是安装设备文件名挂载;
-o选项为特殊选项,可以指定挂载的额外选项,常见的选项有
参数 |
说明 |
atime/noatime |
更新访问时间/不更新。访问分区文件时,是否更新文件的访问时间,默认为更新 |
async/sync |
异步/同步,默认为异步 |
auto/noauto |
自动/手动,mount –a命令执行时,是否会自动安装/etc/fstab文件内容挂载,默认为自动 |
defaults |
定义默认值,相当于rw,suid,dwv,exec,auto,nouser,async这七个选项 |
exec/noexec |
执行/不执行,设定是否允许在文件系统中执行可执行文件,默认是exec允许 |
remount |
重新挂载已经挂载的文件系统,一般用于指定修改特殊全乡 |
rw/ro |
读写/只读,文件系统挂载时,是否具有读写权限,默认是rw |
suid/nosuid |
具有/不具有SUID权限,设定文件系统是否具有SUID和SGID的权限,默认是具有 |
user/nouser |
允许/不允许普通用户挂载,设定文件系统是否允许普通用户挂载,默认是不允许,只有root可以挂载分区 |
usrquota |
写入代表文件系统支持用户磁盘配额。默认不支持 |
grpquota |
写入代表文件系统支持组磁盘配额,默认不支持 |
例:重新挂载/home分区,并使用noexec权限,尝试运行shell脚本helloworld.sh:
[root@localhost ~]# mount -o remount,noexec /home [root@localhost ~]# cd /home/ [root@localhost home]# vi helloword.sh [root@localhost home]# chmod 755 helloword.sh [root@localhost home]# ./helloword.sh -bash: ./helloword.sh: 权限不够 [root@localhost home]# ll 总用量 20 -rwxr-xr-x. 1 root root 31 1月 31 06:12 helloword.sh [root@localhost home]# cp helloword.sh /root/ [root@localhost home]# /root/helloword.sh hello world! [root@localhost home]# mount -o remount,exec /home
可见在/home下设置noexec权限后无法执行shell脚本,而在其他默认的分区中如/root是可以执行的。注意最后要修改回来,否则会影响系统启动。
(3)挂载光盘和U盘
1)挂载光盘
首先在Vmware虚拟机设置中选中挂载的光盘镜像,然后确保“设备状态”处于“已连接”,如下图所示:
其次,在/mnt目录下创建cdrom挂载点,然后挂载光盘,最后显示光盘内容,具体过程如下:
[root@localhost ~]# mkdir /mnt/cdrom/ #建立挂载点 [root@localhost ~]# mount -t iso9660 /dev/cdrom /mnt/cdrom/ #挂载光盘 mount: block device /dev/sr0 is write-protected, mounting read-only [root@localhost ~]# ls /mnt/cdrom/ CentOS_BuildTag Packages RPM-GPG-KEY-CentOS-Security-6 EULA RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Testing-6 GPL repodata TRANS.TBL images RPM-GPG-KEY-CentOS-6 isolinux RPM-GPG-KEY-CentOS-Debug-6 [root@localhost ~]# umount /mnt/cdrom/ #最后卸载挂载点
注:挂载点卸载命令umount的格式为:umount 设备文件名或挂载点。
2)挂载U盘
光标定位到Vmware虚拟机中,然后插入U盘。这样做U盘将被Linux识别,而不是被Windows识别。
首先使用fdisk命令查看U盘的设备文件名,具体命令为:fdisk –l。
其次挂载U盘:mount –t vfat /dev/sdb1 /mnt/usb
注意:U盘为FAT16文件系统,Linux的挂载文件系统格式为fat,若为FAT32,则Linux对应的挂载文件系统格式为vfat。Linux默认是不支持NTFS文件系统的移动硬盘。
(4)支持NTFS的文件系统
若要在Linux中挂载NTFS的文件系统,可以利用第三方软件ntfs-3g。其下载地址为:http://www.tuxera.com/community/ntfs-3g-download/。
安装编译的过程如下:
①解压缩:tar -xzvf ntfs-3g-ntfsprogs-2014.2.15.tar.gz
②进入压缩包:cd ntfs-3g-ntfsprogs-2014.2.15
③编译器准备,无需指定安装目录,将被安装到默认的位置中:./confgure④编译:make
⑤编译安装:make install
安装好之后,插入移动硬盘(和U盘的插入方法一样),然后进行挂载:
mount –t ntfs-3g 分区设备文件名 挂载点
3 fdisk分区
(1)fdisk命令的分区过程
①使用VMware新建硬盘:
在“虚拟机设置”中,选中“硬盘”,点击“添加”,随后选择默认即可添加新硬盘。注意:添加硬盘在系统尚未启动时进行。
②打开虚拟机,使用命令:fdisk –l查看新添加的硬盘:
[root@localhost ~]# fdisk -l Disk /dev/sdb: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
③使用fdisk /dev/sdb命令为新硬盘进行分区,fdisk交互指令说明如下表:
命令 |
说明 |
a |
设置可引导标记 |
b |
编辑bsd磁盘标签 |
c |
设置DOS操作系统兼容标记 |
d |
删除一个分区 |
l |
显示已知的文件系统类型,82为swap分区,83为Linux分区 |
m |
显示帮助菜单 |
n |
新建分区 |
o |
建立空白DOS分区表 |
p |
显示分区列表 |
q |
不保存退出 |
s |
新建空白SUN磁盘标签 |
t |
改变一个分区的系统ID |
u |
改变显示记录单位 |
v |
验证分区表 |
w |
保存退出 |
x |
附加功能(仅专家) |
新建/dev/sdb1主分区,/dev/sbd2扩展分区,/dev/sdb5逻辑分区。
#新建主分区,并分配2G硬盘空间 Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1305, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +2G #新建扩展分区,并分配剩余的硬盘空间 Command (m for help): n Command action e extended p primary partition (1-4) e Partition number (1-4): 2 First cylinder (263-1305, default 263): Using default value 263 Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305): Using default value 1305 #新建逻辑分区,其硬盘空间大小为扩展分区的硬盘空间 Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (263-1305, default 263): Using default value 263 Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305): Using default value 1305 #使用w命令保存并退出 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
④建立好分区后,使用partprobe命令重新读取分区表信息,显示正常报警。
[root@localhost ~]# partprobe Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (设备或资源忙). As a result, it may not reflect all of your changes until after reboot. Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。 Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。 Error: 无效的分区表 - /dev/sr0 出现递归分区。
⑤格式化分区,写入文件系统,采用:mkfs –t ext4 /dev/sdb1,/dev/sdb5同样处理。
[root@localhost ~]# mkfs -t ext4 /dev/sdb1 mke2fs 1.41.12 (17-May-2010) 文件系统标签= 操作系统:Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 131648 inodes, 526120 blocks 26306 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=541065216 17 block groups 32768 blocks per group, 32768 fragments per group 7744 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 正在写入inode表: 完成 Creating journal (16384 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 This filesystem will be automatically checked every 32 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
⑥建立分区挂载点并挂载。在根分区下创建disk1和disk5目录分别作为/devsdb1和/dev/sdb5的挂载点
[root@localhost ~]# mkdir /disk1 /disk5 [root@localhost ~]# mount /dev/sdb1 /disk1 [root@localhost ~]# mount /dev/sdb5 /disk5
⑦使用df或mount命令查看挂载
[root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda5 14G 2.0G 11G 16% / tmpfs 504M 0 504M 0% /dev/shm /dev/sda1 291M 32M 244M 12% /boot /dev/sda2 4.0G 136M 3.7G 4% /home /dev/sdb1 2.0G 68M 1.9G 4% /disk1 /dev/sdb5 7.9G 146M 7.4G 2% /disk5
(2)分区自动挂载
以上的分区为手动挂载,系统重启之后需重新挂载,所以需要设置自动挂载。主要是设置/etc/fstab文件
UUID=9288c490-0161-471c-b63a-6e56699065d5 / ext4 defaults 1 1 UUID=0b5697a3-9081-4b75-bf4c-71b4891d5e86 /boot ext4 defaults 1 2 UUID=fe5a8908-97e6-4670-a114-8bcc43af1bc2 /home ext4 defaults 1 2 UUID=3ae64e9d-7321-478b-b35f-14df91638287 swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
fstab共有六个字段,其中:
第一个字段为分区设备文件名或UUID(硬盘通用唯一标识码);
第二个字段为挂载点;
第三个字段为文件系统名称;
第四个字段为挂载参数,与mount –o选项的参数含义一样;
第五个字段为指定分区是否被dump备份,0表示不备份,1表示每天备份,2表示不定期备份。注:每个分区目录均有备份目录lost+found;
第六个字段为指定分区是否被fsck检测,0表示不检测,其他数字代表检测的优先级。
因此,将新建的分区/dev/sdb1和/dev/sdb5写入fstab中进行自动挂载:
/dev/sdb1 /disk1 ext4 defaults 1 2 /dev/sdb5 /disk5 ext4 defaults 1 2
(3)fstab文件修复
如果在/etc/fstab文件中输入的内容有误,则系统在重启时将报错,此时需要对其进行修复。
例:对/dev/sdb5分区进行自动挂载设置时,误输入/dev/sdb,即
/dev/sdb /disk5 ext4 defaults 1 2
系统在重启时,出现找不到指定分区的报错如下:
此时,输入密码重新修改/etc/fstab文件,由于该文件是只读文件,因此,需要先将其所在的根分区重新挂载为读写权限,即:
mount –o remount,rw /
随后将输入的fstab文件修改过来,然后进行重启。