现在我们知道磁盘的整体数据是在superblock区块中,但是每个个别文件的容量则在 inode 当中记录的。那如何在文字接口底下显示出这些数据呢?
[root@server ~]# df [-ahikHTm] [目录或文件名]
选项与参数:
-a:列出所有的文件系统,包括系统特有的/proc等文件系统
-k:以Bytes的容量显示
-m:以MBytes的容量显示
-h:较为易读的方式显示
-H:以十进制代替二进制显示
-T:连同分区的文件系统名称也列出
-i:不用磁盘容量,而以inode数量显示
[root@server ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 485852 0 485852 0% /dev
tmpfs 497840 0 497840 0% /dev/shm
tmpfs 497840 7812 490028 2% /run
tmpfs 497840 0 497840 0% /sys/fs/cgroup
/dev/mapper/centos-root 17811456 1436916 16374540 9% /
/dev/sda1 1038336 140028 898308 14% /boot
tmpfs 99568 0 99568 0% /run/user/0
[root@server ~]# df -hi
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 119K 385 119K 1% /dev
tmpfs 122K 1 122K 1% /dev/shm
tmpfs 122K 784 121K 1% /run
tmpfs 122K 16 122K 1% /sys/fs/cgroup
/dev/mapper/centos-root 8.5M 32K 8.5M 1% /
/dev/sda1 512K 326 512K 1% /boot
tmpfs 122K 1 122K 1% /run/user/0
[root@server ~]# du [-ahskm] 目录或文件名
选项与参数:
-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已
-h:易读的方式
-s:列出总量而已,而不列出每个个别的目录占用容量
-S:不包括子目录下的总计
-k:以KBytes列出容量
-m:以MBytes列出容量
[root@server ~]# du
40
[root@server ~]# du -a
4 ./.bash_logout
4 ./.bash_profile
4 ./.bashrc
4 ./.cshrc
4 ./.tcshrc
4 ./anaconda-ks.cfg
4 ./.rnd
8 ./.viminfo
4 ./.bash_history
40 .
[root@server ~]# du -s
40 .
从前面的知识我们知道:
也就是说,其实文件名只与目录有关,但是文件内容与inode有关。那有没有可能多个文件名对应到同一个inode呢?有的,那就是hard link了。简单的说:hard link只是在某个目录下新增一笔文件名链接到某inode号码的关联记录而已。
[root@server ~]# ll -i /etc/crontab
17336313 -rw-r--r--. 1 root root 451 6月 10 2014 /etc/crontab
[root@server ~]# ln /etc/crontab
[root@server ~]# ll -i /etc/crontab crontab
17336313 -rw-r--r--. 2 root root 451 6月 10 2014 crontab
17336313 -rw-r--r--. 2 root root 451 6月 10 2014 /etc/crontab
可以发现,两个文件名都链接到 17336313 这个 inode 号码。有一个字段也由 1 变成了 2 ,那个字段就是“链接”的意思。
在这种情况下,无论将任何一个文件名删除,其实 inode 和 block 都存在!此时,你可以通过另一个文件名去读取正确的内容!此外,不论你使用哪个文件名编辑,最终的结果都会写入到同一个 block 中。因此,两个文件名均能进行修改。同时,硬链接只是在某个目录下多写入一个关联数据而已,既不会增加 inode 也不会消耗 block数量。
但是,硬链接也是有限制的:1、不能跨文件系统;2、不能链接目录。
符号链接就是在建立一个独立的文件,而这个文件会让数据的读取指向它链接的那个文件的文件名!由于是利用文件来作为指向的动作,所以,当被指向的文件被删除后,symbolic link 的文件就打不开了!
[root@server ~]# ln -s /etc/crontab crontab2
[root@server ~]# ll -i /etc/crontab crontab2
33574991 lrwxrwxrwx. 1 root root 12 7月 31 10:35 crontab2 -> /etc/crontab
17336313 -rw-r--r--. 2 root root 451 6月 10 2014 /etc/crontab
可以发现两个文件名对应的是不同的 inode 号码,当然是两个不同的文件了。
符号链接会新建一个文件,当然会占用 inode 和 block 了。
[root@server ~]# ln [-sf] 源文件 链接文件
选项与参数:
-s:如果不加任何参数,那就是硬链接,至于-s则是符号链接
-f:如果链接文件存在,就主动将链接文件删除后再建立
如果想要在系统里边新增一块磁盘,应该有哪些动作:
[root@server ~]# lsblk [-dfimpt] [device]
选项与参数:
-d:仅列出磁盘本身,并不会列出该磁盘的分区数据
-f:同时列出该磁盘内的文件系统名称
-i:使用ASCII的线段输出
-m:同时输出该设备在/dev底下的权限数据
-p:列出该设备的完整文件名
-t:列出该磁盘的详细信息
[root@server ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 19G 0 part
├─centos_li-root 253:0 0 17G 0 lvm /
└─centos_li-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
[root@server ~]# lsblk -ip /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda 8:0 0 20G 0 disk
|-/dev/sda1 8:1 0 1M 0 part
|-/dev/sda2 8:2 0 1G 0 part /boot
`-/dev/sda3 8:3 0 19G 0 part
|-/dev/mapper/centos_li-root 253:0 0 17G 0 lvm /
`-/dev/mapper/centos_li-swap 253:1 0 2G 0 lvm [SWAP]
UUID是全局单一标识符,设备独一无二的标识符。
[root@server ~]# blkid
/dev/sda1: PARTUUID="cfa1d5d0-a865-449d-9710-40dbf10503f9"
/dev/sda2: UUID="2353541d-eb76-4ff1-9592-ab771e2969af" TYPE="xfs" PARTUUID="bf0e00c3-5cf0-4b8f-abda-8e53aadb7dc7"
/dev/sda3: UUID="x8WReu-Yhrw-H6Qe-1XGr-OLdg-L1G1-gcp2e2" TYPE="LVM2_member" PARTUUID="7b3ea3bf-97cf-4fe8-a134-a0bef62ed7c7"
/dev/mapper/centos_li-root: UUID="ec2f4b86-770c-4d81-a1ce-b929becb235e" TYPE="xfs"
/dev/mapper/centos_li-swap: UUID="51f4c516-207e-4069-bbc9-ef0e766d0e01" TYPE="swap"
[root@server ~]# parted device_name print
[root@server ~]# parted /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot
Number Start End Size File system Name 标志
1 1049kB 2097kB 1049kB bios_grub
2 2097kB 1076MB 1074MB xfs
3 1076MB 21.5GB 20.4GB lvm
注:以下的主机名更改了,内容并不影响。
MBR分区表采用的是fdisk分区,GPT分区表请使用gdisk分区!
[root@li ~]# yum install gdisk -y
[root@li ~]# gdisk 设备名称
[root@li ~]# gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
d delete a partition #删除一个分区
i show detailed information on a partition
l list known partition types
n add a new partition #新增一个分区
o create a new empty GUID partition table (GPT)
p print the partition table #打印出分区表
q quit without saving changes #不存储分区就离开gdisk
r recovery and transformation options (experts only)
s sort partitions
t change a partition's type code
v verify disk
w write table to disk and exit #存储后再离开gdisk
x extra functionality (experts only)
? print this menu
Command (? for help): p #这里可以输出目前磁盘的状态
Disk /dev/sda: 41943040 sectors, 20.0 GiB #磁盘文件名/扇区总数与总容量
Logical sector size: 512 bytes #每一个扇区的大小5112 bytes
Disk identifier (GUID): 993284BF-F048-4E2B-9D73-A81B3C0504B5 #磁盘的 GPT 标识
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)
Number Start (sector) End (sector) Size Code Name #分区表信息
1 2048 4095 1024.0 KiB EF02
2 4096 2101247 1024.0 MiB 0700
3 2101248 41940991 19.0 GiB 8E00
Command (? for help): q #不存储就离开输入q,w不要轻易输入!
分区表信息的每个项目的意义:
新加了一块 2.5G 的磁盘,假设需要有如下的分区要求:
[root@li ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 19G 0 part
├─centos_li-root 253:0 0 17G 0 lvm /
└─centos_li-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 2.5G 0 disk <==新增的磁盘
sr0 11:0 1 4.5G 0 rom
[root@li ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries.
Command (? for help): p
Disk /dev/sdb: 5242880 sectors, 2.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 36458782-15CD-4860-B400-6572DA453043
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 5242846
Partitions will be aligned on 2048-sector boundaries
Total free space is 5242813 sectors (2.5 GiB)
Number Start (sector) End (sector) Size Code Name
#可以看到因为是新增的磁盘,并没有进行分区,所以下面的分区表是空白的
Command (? for help): n #使用n新增一个分区
Partition number (1-128, default 1): 1 #从1开始
First sector (34-5242846, default = 2048) or {+-}size{KMGTP}: #第一个扇区,可以直接enter
Last sector (2048-5242846, default = 5242846) or {+-}size{KMGTP}: +1G #千万不要enter,否则就会占用整个磁盘
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): #文件系统的ID
Changed type of partition to 'Linux filesystem'
Command (? for help): p #显示分区,可以看到已经出现了一个分区
Disk /dev/sdb: 5242880 sectors, 2.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 36458782-15CD-4860-B400-6572DA453043
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 5242846
Partitions will be aligned on 2048-sector boundaries
Total free space is 3145661 sectors (1.5 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB 8300 Linux filesystem
Command (? for help): n #按照需求新增其余两个分区
Partition number (2-128, default 2):
First sector (34-5242846, default = 2099200) or {+-}size{KMGTP}:
Last sector (2099200-5242846, default = 5242846) or {+-}size{KMGTP}: +1G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 0700
Changed type of partition to 'Microsoft basic data'
Command (? for help): n
Partition number (3-128, default 3):
First sector (34-5242846, default = 4196352) or {+-}size{KMGTP}:
Last sector (4196352-5242846, default = 5242846) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'
Command (? for help): p
Disk /dev/sdb: 5242880 sectors, 2.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 36458782-15CD-4860-B400-6572DA453043
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 5242846
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB 8300 Linux filesystem
2 2099200 4196351 1024.0 MiB 0700 Microsoft basic data
3 4196352 5242846 511.0 MiB 8200 Linux swap
Command (? for help): w #使用w进行分区表的保存
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
[root@li ~]# partprobe [-s] #如果不加 -s,屏幕将不会出现信息
[root@li ~]# partprobe -s
/dev/sda: gpt partitions 1 2 3
/dev/sdb: gpt partitions 1 2 3
#实际的分区状况
[root@li ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 2.5G 0 disk
├─sdb1 8:17 0 1G 0 part
├─sdb2 8:18 0 1G 0 part
└─sdb3 8:19 0 511M 0 part
#内核的分区记录
[root@li ~]# cat /proc/partitions
major minor #blocks name
8 0 20971520 sda
8 1 1024 sda1
8 2 1048576 sda2
8 3 19919872 sda3
8 16 2621440 sdb
8 17 1048576 sdb1
8 18 1048576 sdb2
8 19 523247 sdb3
11 0 4669440 sr0
253 0 17821696 dm-0
253 1 2097152 dm-1
#现在内核也抓到了分区参数了
[root@li ~]# gdisk /dev/sdb
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB 8300 Linux filesystem
2 2099200 4196351 1024.0 MiB 0700 Microsoft basic data
3 4196352 5242846 511.0 MiB 8200 Linux swap
Command (? for help): d
Partition number (1-3): 3
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB 8300 Linux filesystem
2 2099200 4196351 1024.0 MiB 0700 Microsoft basic data
Command (? for help): w
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
[root@li ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 2.5G 0 disk
├─sdb1 8:17 0 1G 0 part
└─sdb2 8:18 0 1G 0 part
[root@li ~]# partprobe -s
/dev/sda: gpt partitions 1 2 3
/dev/sdb: gpt partitions 1 2
注意:千万不要处理正在使用的文件系统!必须先卸载!
fdisk的使用方法几乎和gdisk的方法一样,只不过一个是使用?作为提示数据,一个使用m作为提示数据。
[root@li ~]# mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] [-r parms] 设备名称
选项与参数:
-b:后面接的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k
-d:后面接的是重要的 data section 的相关参数,主要的值有:
agcount=数值:设定需要几个存储群组的意思(AG),通常与 CPU 有关
agsize=数值:每个 AG 设定为多少容量的意思,通常 agcount/agsize 只选一个设定即可
file:指的是“格式化的设备是个文件而不是个设备”的意思
size=数值:data section 的容量,也就是说你可以不将全部容量用完
su=数值:当有 RAID 时,那个 stripe 数值的意思,于底下的 sw 搭配使用
sw=数值:当有 RAID 时,用于存储数据的磁盘数量
sunit=数值:与 su 相当,不过单位使用的是“几个 sector(512bytes大小)”的意思
swidth=数值:就是 su*sw 的意思
-f:如果设备内已经有文件系统,就用 -f 强制格式化
-i:与 inode 相关的参数:
size=数值:最小是 256bytes 最大是 2k
internal=[011]:log设备是否内建
logdev=device:log设备为后面的设备,需设定 internal=0 才可
size=数值:指定登录区的容量,通常最小有 512 个 block,大约 2M 以上才行
-L:这个文件系统的标头名称 Label Name的意思
-r:指定 realtime section 的相关设定值,常见的有:
extsize=数值:就是那个重要的 extent 数值,一般不须设定,但有 RAID 时,最好设定与 swidth 的数值相同较佳
#将 /dev/sbd1格式化为 xfs 文件系统
[root@li ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
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
#使用默认值格式化,速度非常快
[root@li ~]# blkid /dev/sdb1
/dev/sdb1: UUID="9a2e881c-c84b-403e-903a-d1e8a92b005c" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="31ce0980-9bfe-459d-a770-1d33e4967605"
#找出系统的 CPU 数,并据此设定你的 agcount 数值
[root@li ~]# grep 'processor' /proc/cpuinfo
processor : 0
#1颗CPU
[root@li ~]# mkfs.xfs -f -d agcount=2 /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=2, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
可以发现,agcount变成了2。
[root@li ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.minix
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.xfs
[root@li ~]# mkfs -t vfat /dev/sdb2
mkfs.vfat: 没有那个文件或目录
[root@li ~]# mkfs -t ext4 /dev/sdb2
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
当 xfs 文件系统错乱时才会使用这个指令。
[root@li ~]# xfs_repair [-fnd] 设备
选项与参数:
-f:后面接的是文件
-n:单纯检查并不维修文件系统
-d:通常用在单人维护模式下,针对根目录(/)进行检查与修复的动作!很危险!不要随意使用
[root@li ~]# xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
- scan filesystem freespace and inode maps...
...
- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done #共有7个检查流程
同样,修复是时文件系统最好不要正在挂载,可以先卸载了,再修复。
[root@li ~]# fsck.ext4 /dev/sdb2
e2fsck 1.42.9 (28-Dec-2013)
/dev/sdb2: clean, 11/65536 files, 12955/262144 blocks
在挂载之前,最好确定几件事:
如果目录非空,那么挂载了文件系统后,原目录底下的东西就会暂时消失。等分区卸载后,就会再次显示出来。
[root@li ~]# blkid /dev/sdb1
/dev/sdb1: UUID="71b60c0b-7c2d-4522-beaa-fc7abc2e94a3" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="31ce0980-9bfe-459d-a770-1d33e4967605"
[root@li ~]# mount UUID="71b60c0b-7c2d-4522-beaa-fc7abc2e94a3" /data/xfs
mount: 挂载点 /data/xfs 不存在
[root@li ~]# mkdir -p /data/xfs
[root@li ~]# mount UUID="71b60c0b-7c2d-4522-beaa-fc7abc2e94a3" /data/xfs
[root@li ~]# df /data/xfs
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sdb1 1038336 32896 1005440 4% /data/xfs
[root@li ~]# blkid /dev/sdb2
/dev/sdb2: UUID="68580139-f2f6-423a-a15a-35d73d8c0e01" TYPE="ext4" PARTLABEL="Microsoft basic data" PARTUUID="a3416769-7de6-4b4c-8e08-aa6bfff242b7"
[root@li ~]# mkdir /data/ext4
[root@li ~]# mount UUID="68580139-f2f6-423a-a15a-35d73d8c0e01" /data/ext4
[root@li ~]# df /data/ext4/
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sdb2 999320 2564 927944 1% /data/ext4
[root@li ~]# umount [-fn] 设备文件名或挂载点
选项与参数:
-f:强制卸载!
-l:立刻卸载文件系统,比 -f 还强!
-n:不更新 /etc/mtab 情况下卸载
[root@li ~]# mount
...
/dev/sdb1 on /data/xfs type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sdb2 on /data/ext4 type ext4 (rw,relatime,seclabel,data=ordered)
[root@li ~]# umount /dev/sdb1
[root@li ~]# umount /data/ext4
先要说明一下系统挂载的限制:
[root@li ~]# cat /etc/fstab
#设备名 挂载点 文件系统 参数 dump fsck
/dev/mapper/centos_li-root / xfs defaults 0 0
UUID=2353541d-eb76-4ff1-9592-ab771e2969af /boot xfs defaults 0 0
/dev/mapper/centos_li-swap swap swap defaults 0 0
六个字段很重要:
第一栏:磁盘设备文件名/UUID/Label Name
第二栏:挂载点
第三栏:文件系统
第四栏:文件系统参数
文件系统参数 | 说明 |
---|---|
async/sync | 设定磁盘是否以异步方式运作!预设为async(效能较佳) |
auto/noauto | 当下达 mount -a 时,此文件系统是否会被主动测试挂载。预设为 auto |
rw/ro | 如果你想要分享数据而不给用户随便更改,可以设定为只读!则不论在此文件系统上的文件是否设定为w,都无法写入! |
exec/noexec | 同上 |
user/nouser | 是否允许用户使用 mount 指令挂载。一般不允许一般用户使用 mount,所以设定为 nouser |
suid/nosuid | 该文件系统是否允许 SUID 的存在 |
defaults | 同时具有 rw,suid,exec,auto,nouser,async等 |
第五栏:是否被 dump 备份指令作用
第六栏:是否以 fsck 检验扇区
[root@li ~]# vim /etc/fstab
UUID="71b60c0b-7c2d-4522-beaa-fc7abc2e94a3" /data/xfs xfs defaults 0 0
UUID="68580139-f2f6-423a-a15a-35d73d8c0e01" /data/ext4 ext4 defaults 0 0
[root@li ~]# mount -a
[root@li ~]# df /data/xfs /data/ext4
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sdb1 1038336 32896 1005440 4% /data/xfs
/dev/sdb2 999320 2564 927944 1% /data/ext4