- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
根据存储的特性不同,可以将存储分为内存和外存两类.
内存:又叫做主存储器,计算机中所有程序的运行都是在内存中进行.
外存:又叫做辅助存储器,因为内存容量小且断电会丢失所有数据。所以磁盘来实现数据的持久化存储。例如:硬盘,U盘,软盘,光盘 。
磁盘是一个广泛的概念,是 一个总的称呼 ,用来描述多种不同类型的存储介质,包括硬盘、软盘、光盘、闪存盘等等.
所以硬盘也可以被称为磁盘,因为硬盘也是一种磁性存储介质.
根据存储原理的不同,可以将硬盘分为机械硬盘和固态硬盘两类.
机械硬盘:HDD(Hard Disk Drive), 由物理盘片、磁头、控制电机、转轴等几部分组成.
固态硬盘:SSD(Solid State Drive) ,用固态电子存储芯片阵列而制成的硬盘.
从整体的角度上,硬盘接口分为IDE、SCSI、STAT、USB、M.2等类型.
服务器使用的硬盘尺寸只要有两种,LFF和SFF.
LFF:3.5寸硬盘 。
SFF:2.5寸硬盘 。
机械硬盘存储数据的时候,是将数据存储在其内部的盘面上。盘面类似于DVD光盘,每个盘面划分成了一圈一圈的磁道,最外圈是0磁盘。然后每个磁盘有划分为了N多个小块,这个小块叫做扇区。扇区大小固定,是512byte.
0磁道0扇区: 指的就是最外面那个磁盘的第一个扇区,大小是512字节.
在服务器上加入一块新的硬盘后,需要经过分区、格式化和挂载才能正常使用硬盘的空间.
将硬盘进行分区具备以下优点:
对硬盘进行分区的时候有两种分区方式(MBR分区和GPT)分区,不同的分区方式具有不同的特点.
MBR分区:
Master Boot Record(主引导记录),1982年开发而来,使用32位表示扇区数,分区的大小不能超过2T,最多只能有四个主分区,如果需要使用更多的分区,可以将一个分区格式化为逻辑分区,再基于逻辑分区创建多个扩展分区.
硬盘使用MBR的分区类型方式后,会将整个硬盘的分区信息放在0磁道0扇区这个512字节大小的空间中,前446字节存放boot loader,中间64字节存放分区表信息。每16字节用来标识一个分区信息。最后2字节作为标志位.
MBR的三种分区类型 。
GPT分区:
GUID(Globals Unique Identifiers) partition table,最多支持128个分区,其中没有扩展分区的概念。每个分区都可以是主分区.每个分区的最大空间理论上可以达到9.4ZB.
BIOS和UEFI:
作用:BIOS和UEFI都是负责计算机硬件初始化、开机自检和引导操作系统.
BIOS和UEFI的区别 。
windows:只能安装 BIOS + MBR 或是 UEFI + GPT组合。
linux:可以实现 BIOS + GPT + GRUB 组合
Linux中的设备文件:
在linux中,一切及皆文件,包括硬件设备。硬件设备会被映射为 /dev 下面的一个文件设备文件.
设备文件根据存储单位的不同分为两种 :
设备文件的命令规则:
# SAS,SATA,SCSI,IDE,USB: /dev/sdX
# nvme协议: /dev/nvme0n#
# 虚拟磁盘: /dev/vd 或/dev/xvd
查看块设备文件:lsblk 。
tom@ubuntu1604:~$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 8a39188a-59cd-4899-b4c1-22aec246c18f /
├─sda2
└─sda5 swap 4442a597-37c1-4639-bc25-881505c12d98 [SWAP]
sdb
├─sdb1 ntfs 老毛桃U盘 1C98D9A698D97EA8
└─sdb2 vfat EFI 0BE8-0ECB
sr0 iso9660 Ubuntu-Server 16.04.6 LTS amd64 2019-02-27-00-06-32-00
文件系统就是在操作系统中 负责管理和存储文件信息的软件结构 称为文件管理系统.
文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索.
文件系统的创建:
硬盘或分区在进行格式化的过程,就是创建文件系统的过程.
windows 常用文件系统 。
Linux 常用文件系统 。
裸文件系统 。
裸文件系统是一个块设备,它可以像其他块设备一样进行读写操作,因此裸文件系统通常用于虚拟化环境中,作为虚拟机磁盘镜像的基础.
网络文件系统 。
虚拟文件系统 。
例如:
使用ls查看磁盘上的文件,因为文件系统的功能是由操作系统的内核提供,应用程序是通过访问文件系统,然后文件系统再去访问具体的文件,但是不同文件系统底层是实现和区别差别可能非常大。所以程序的系统调用可能会不同,为了方便程序的统一调用,就就使用了虚拟文件系统提供统一的接口.
文件系统的组成 。
由三部分组成,分别是内核中的模块,虚拟文件系统和用户空间的管理工具.
查看当前系统支持的文件系统:
# 方法一:
ls -l /lib/modules/`uname -r`/kernel/fs
# 方法二:
cat /proc/filesystems
当某个存储设备被格式化为EXT系列的文件系统后,文件系统会将磁盘空间分为两部分:inode区域和数据区域(也称为块区域).
Inode区域: 存放文件的元数据信息 。
包含了若干了Inode,每个inode存放一个文件的元数据信息(文件大小、类型、权限、UID、GID、所有者、所属组等信息)和唯一的Inode编号,以及指向文件数据块的指针.
Block区域: 存放文件真正的数据部分 。
例如:
当需要访问一个文件时,文件系统会通过目录项找到对应的inode,然后根据inode中的信息来读取或写入文件的内容。因此,目录项在文件系统中扮演了非常重要的角色,它们充当了文件和文件系统之间的桥梁.
删除某个目录就是把目录文件的数据块部分的文件列表和文件的节点编号的映射关系删除的过程 。
在EXT系列文件系统中创建文件流程:
软链接: 类似于windows的快捷方式 。
特点:
软链接和源文件不是同一个文件 。
允许对目录文件创建软链接.
支持跨设备和跨分区创建软链接.
创建一个软链接到一个目录下,没有指定软连接的名字,那么软连接的名字和源文件名一致 。
硬链接: 一个文件多个文件名 。
特点:
fdisk 。
使用fdisk创建硬盘分区的时候,默认会将硬盘的分区类型格式化为MBR格式的分区类型.
例如:
# 创建分区表
root@ubuntu1804:~# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n # 创建一个分区表
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p # 创建主分区
Partition number (1-4, default 1): # 分区编号,
First sector (2048-41943039, default 2048): # 不输入表示从当前位置开始
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +10G # 分区的大小
Created a new partition 1 of type 'Linux' and of size 10 GiB.
Command (m for help): p # 查看分区表的信息
Disk /dev/sdb: 20 GiB, 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
Disklabel type: dos
Disk identifier: 0x3ea7c314
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 20973567 20971520 10G 83 Linux
Command (m for help): w # 保存设置并退出
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
# 删除分区表
root@ubuntu1804:~# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sdb: 20 GiB, 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
Disklabel type: dos
Disk identifier: 0x3ea7c314
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 20973567 20971520 10G 83 Linux
/dev/sdb2 20973568 31459327 10485760 5G 83 Linux
Command (m for help): d # 删除分区表
Partition number (1,2, default 2): 2 # 删除的分区表编号 表示删除第二个分区
Partition 2 has been deleted.
Command (m for help): p
Disk /dev/sdb: 20 GiB, 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
Disklabel type: dos
Disk identifier: 0x3ea7c314
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 20973567 20971520 10G 83 Linux
Command (m for help): w #保存退出
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
gdisk 。
gdisk工具是默认会把硬盘的分区类型格式化为GPT类型。如果分区类型非gpt格式,会默认转换为gpt格式.
例如:
# 新建分区表
root@ubuntu1804:~# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +2G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): 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@ubuntu1804:~# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present # 当前硬盘的分区类型
Found valid GPT with protective MBR; using GPT.
Command (? for help): p
Disk /dev/sdb: 41943040 sectors, 20.0 GiB
Model: VMware Virtual S
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): E0199E20-EDB2-43D1-B653-3E8080E547EA
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 37748669 sectors (18.0 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 4196351 2.0 GiB 8300 Linux filesystem
Command (? for help): d 1 # 删除标号为1的分区表
Using 1
Command (? for help): 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.
parted 。
parted工具可以管理gpt和mbr类型的分区表,其它的分区类型也可以管理,例如sun、bsd等.
注意:parted的操作都是实时生效的,需要小心使用.
例如:
# 新建分区表
root@ubuntu1804:~# parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p # 将硬盘分区类型改为gpt
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
(parted) mklabel gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes # 确认更改
(parted) mkpart primary ext4 0% 20% # mkpart 分区类型 文件系统类型 分区的开始位置 分区的结束位置 -1:表示磁盘的最后
(parted) mkpart primary ext4 20% 40%
(parted) mkpart primary ext4 40% 70%
(parted) p # 查看分区表信息
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 4295MB 4294MB ext4 primary
2 4295MB 8590MB 4295MB ext4 primary
3 8590MB 15.0GB 6442MB ext4 primary
(parted) quit
Information: You may need to update /etc/fstab.
# 删除分区表 # 退出
root@ubuntu1804:~# parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 10.7GB 10.7GB primary
(parted) rm 1 # rm 1 表示删除编号为1的分区表
(parted) quit
Information: You may need to update /etc/fstab.
查看分区类型:
blkid /dev/device
PTTYPE="dos" # MBR类型
PTTYPE="gpt" # GPT类型
parted -l
Partition Table: msdos # MBR类型
Partition Table: gpt # GPT类型
fdisk -l
Disklabel type: dos # MBR类型
Disklabel type: gpt # GPT类型
修改分区类型 。
MBR-->GPT
parted /dev/sdb
(parted) mklabel gpt
GPT-->MBR
parted /dev/sdb
(parted) mklabel msdos
mkfs工具 。
mkfs是一个Linux/Unix操作系统中用于创建文件系统的命令行工具,它可以用于格式化磁盘或分区,以便在上面创建新的文件系统.
例如:
# 格式化硬盘为ext4文件系统
sudo mkfs.ext4 /dev/sdb 或 sudo mkfs -t ext4 /dev/sdb
# 指定Inode的数量
sudo mkfs -t ext4 -M 2000000 /dev/sdb
常用选项:
-t {ext2|ext3|ext4|xfs} 指定文件系统类型
-b {1024|2048|4096} 指定块 block 大小,默认4kb
-L ‘LABEL’ 设置卷标,便于在系统中识别。
-i # 指定一个inode节点的大小;默认256字节,即一个block可以存放16个inode
-N # 指定分区中创建多少个inode,默认inode空间占总空间的1%
硬盘挂载工具 。
硬盘挂载是将硬盘驱动器(例如硬盘、SSD等)连接到操作系统文件系统的过程,将某个硬盘驱动器挂载到文件系统后就可以对硬盘进行读写等操作.
mount工具 。
例如:
# 将/dev/sdb1挂载到/mnt/data 不指定文件系统类型,会自动进行检测
sudo mount /dev/sdb1 /mnt/data
# 挂载的时候手动指定文件系统的类型
sudo mount -t ntfs /dev/sdb1 /mnt/data
说明:
使用mount进行挂载的时候,如果确定了要挂载的文件系统的类型,使用-t参数指定文件系统类型可以确保系统以正确的方式挂载文件系统,避免可能的错误和问题.
如果挂载的时候不确定文件系统的类型,系统会对文件系统进行自动检测,但是当存在多个可能的文件系统类型时,系统可能会选择错误的类型导致挂载失败.
mount命令的常用参数:
-t fstype:指定文件系统类型,如果不指定会自动进行检测
-o <挂载选项>:指定挂载选项,多个选项用逗号隔开。
# 挂载选项
# ro 以只读方式挂载文件系统。
# remount 重新挂载文件系统,相当于先umount再mount
# defaults 使用默认的挂载选项,相当于rw, suid, dev, exec, auto, nouser, async
# async 异步模式,内存更改时,写入缓存区buffer,过一段时间再写到磁盘中,效率高,但不安全
# sync 同步模式,内存更改时,同时写磁盘,安全,但效率低下
# noatime 指定文件系统不更新最后访问时间
# _netdev 当网络可用时才对网络资源进行挂载,如:NFS文件系统,如果网络不可达不加该选项会导致系统无法启动。
-r:以只读方式挂载文件系统。
-w:以可读写方式挂载文件系统,默认就是以可读可写的方式挂载
-a 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
noatime选项说明:
使用 noatime 选项可以禁止系统更新文件或目录的访问时间戳,即 atime 属性。当文件或目录被访问时,系统不会更新 atime 属性,而是保留原来的值,可以较少磁盘IO,提高文件系统的性能.
使用noatime的场景:
在某些高并发的应用中,可能会有大量的读取操作,如果每次读取都更新 atime 属性,会对系统的性能造成很大的影响。这种情况下可以考虑加noatime选项.
不能使用noatime的场景:
如果应用程序需要用到文件的访问时间,就不能使用 noatime 选项。因为使用 noatime 选项会禁止系统更新文件或目录的访问时间戳,即 atime 属性,这会导致应用程序无法获取文件的最后访问时间,从而影响应用程序的功能.
挂载规则说明:
umount工具 。
umount用于卸载挂载的文件系统.
例如:
umount device 或 umount mountpoint
# 例如:
umount /dev/sda1
查看挂载的设备 。
# 方法一:使用mount命令,会列出所有已挂载的设备及其挂载点
root@ubuntu1804:~# mount
/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
# 方法二:查看内核参数
root@ubuntu1804:~# cat /proc/mounts
/dev/sda1 /boot ext4 rw,relatime,data=ordered 0 0
# 方法三:df命令
root@ubuntu1804:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 954M 0 954M 0% /dev
tmpfs tmpfs 198M 11M 187M 6% /run
/dev/sda5 ext4 58G 4.2G 51G 8% /
tmpfs tmpfs 986M 0 986M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 986M 0 986M 0% /sys/fs/cgroup
/dev/sda1 ext4 922M 80M 780M 10% /boot
tmpfs tmpfs 198M 0 198M 0% /run/user/0
持久挂载:
将挂载保存到 /etc/fstab 中可以下次开机时,自动启用挂载 。
#使用`man 5 fstab `查看/etc/fstab配置文件格式
# 格式
device mountpoint fs_type options 0 0
# 例如:
/dev/sdb1 /data ext4 defaults,noatime 0 0
# 表示将/dev/sdb1这个分区挂载到/data这个目录,并且使用默认的挂载选项,不进行本分和文件系统检查。
# 说明
# 备份频率(一般用不上):0:不做备份 1:每天转储 2:每隔一天转储
# 文件系统检查的次序:开机检测文件系统的过程。其中允许的数字是0 1 2
# 0:不自检 ,1:首先自检;一般只有rootfs才用 2:非rootfs使用
当把u盘设备插入linux系统后,会被内核探测为SCSI设备,会被映射到/dev下作为一个设备文件。例如:/dev/sdaX、/dev/sdbX等.
图形界面:usb设备会自动挂载到 /run/media/ 路径下.
字符界面:需要手动进行usb设备的挂载才能正常使用.
![image-20230319200153939](E:\学习文档\Linux文件权限管理\Linux 存储和文件系统\Linux 存储和文件系统_img\image-20230319200153939.png) 。
说明: ubuntu默认支持识别 NTFS 文件系统格式的 U 盘,CentOS 默认情况下不支持识别 NTFS 文件系统格式的 U 盘.
如果不识别需要安装 ntfs-3g 软件包来支持 NTFS 格式的 U 盘.
插入u盘后可以通过系统日志看到相关信息:
root@ubuntu1804:~# tail -f /var/log/syslog
Mar 19 17:14:51 ubuntu1804 kernel: [ 5822.106369] usb 1-1: new high-speed USB device number 8 using ehci-pci
Mar 19 17:14:51 ubuntu1804 kernel: [ 5822.455825] usb 1-1: New USB device found, idVendor=0930, idProduct=6544
Mar 19 17:14:51 ubuntu1804 kernel: [ 5822.455827] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Mar 19 17:14:51 ubuntu1804 kernel: [ 5822.455828] usb 1-1: Product: DataTraveler 2.0
Mar 19 17:14:51 ubuntu1804 kernel: [ 5822.455829] usb 1-1: Manufacturer: Kingston
Mar 19 17:14:51 ubuntu1804 kernel: [ 5822.455829] usb 1-1: SerialNumber: 001BFC3653BCC341E91386F4
Mar 19 17:14:51 ubuntu1804 kernel: [ 5822.458677] usb-storage 1-1:1.0: USB Mass Storage device detected
Mar 19 17:14:51 ubuntu1804 kernel: [ 5822.458909] scsi host33: usb-storage 1-1:1.0
Mar 19 17:14:52 ubuntu1804 kernel: [ 5823.499865] scsi 33:0:0:0: Direct-Access Kingston DataTraveler 2.0 1.00 PQ: 0 ANSI: 4
Mar 19 17:14:52 ubuntu1804 kernel: [ 5823.500256] sd 33:0:0:0: Attached scsi generic sg3 type 0
Mar 19 17:14:52 ubuntu1804 kernel: [ 5823.504780] sd 33:0:0:0: [sdc] 60549120 512-byte logical blocks: (31.0 GB/28.9 GiB)
Mar 19 17:14:52 ubuntu1804 kernel: [ 5823.507219] sd 33:0:0:0: [sdc] Write Protect is off
Mar 19 17:14:52 ubuntu1804 kernel: [ 5823.507220] sd 33:0:0:0: [sdc] Mode Sense: 45 00 00 00
Mar 19 17:14:52 ubuntu1804 kernel: [ 5823.509773] sd 33:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Mar 19 17:14:52 ubuntu1804 kernel: [ 5823.523647] sdc: sdc1 sdc2
Mar 19 17:14:52 ubuntu1804 kernel: [ 5823.535055] sd 33:0:0:0: [sdc] Attached SCSI removable disk
lsusb工具 。
lsusb工具用于显示 USB 总线上连接的设备列表。使用 lsusb 可以查看连接到计算机上的 USB 设备列表。从而判断u盘设备是否插入了系统中.
例如:查看usb设备信息:
# usbutils工具包
root@ubuntu1804:~# lsusb
Bus 001 Device 008: ID 0930:6544 Toshiba Corp. TransMemory-Mini / Kingston DataTraveler 2.0 Stick (2GB)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
du :disk usage。 一般是用来查看目录或指定文件的大小 。
选项:
-h # 自动使用合适的单位进行显示,默认单位是kb
-s # 显示指定目录或文件的总大小
--exclude=/path # 用于排除指定的文件或目录
例如:
# 查看整个系统的大小,但不统计/sys和/proc这连个虚拟文件系统
root@ecs-1746-0001:~# du -sh --exclude='/proc' --exclude='/sys' /
23G /
# 统计某个目录下目录文件的大小
# 需要进入待统计的目录
root@ecs-1746-0001:~# cd DeploySystem-Ubuntu-20.04/
root@ecs-1746-0001:~/DeploySystem-Ubuntu-20.04# du -sh */ | sort -rh
2.1G packages/
5.6M lib/
3.1M phplib/
156K conf/
48K include/
16K job/
4.0K SourceCode/
# */通配符表示所有子目录
# 统计某个目录下每个文件的大小
# 1. 进入该目录
root@ecs-1746-0001:~# cd DeploySystem-Ubuntu-20.04/
# 2. 进行统计
root@ecs-1746-0001:~/DeploySystem-Ubuntu-20.04# du -ah --exclude='{'.','..'}' */ | sort -rh | more
# --exclude='{'.','..'}'表示不统计.和..文件
# */通配符表示所有子目录
df: disk free,主要用来查看挂载了的文件系统情况.
注意: df看到的文件系统中真实占用的空间大小,而非表面上的空间大小。因为文件系统本身就有元数据,所以即使是刚创建的干净文件系统,也会占用一定的空间 。
选项:
-h:自动使用合适的单位进行数据的显示
-T:显示文件系统的类型
例如:
root@ubuntu1804:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 954M 0 954M 0% /dev
tmpfs tmpfs 198M 11M 187M 6% /run
/dev/sda5 ext4 58G 4.2G 51G 8% /
tmpfs tmpfs 986M 0 986M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 986M 0 986M 0% /sys/fs/cgroup
/dev/sda1 ext4 922M 80M 780M 10% /boot
tmpfs tmpfs 198M 0 198M 0% /run/user/1000
tmpfs tmpfs 198M 0 198M 0% /run/user/0
df和du统计信息不相同的情况:
df > du
的情况: 当把文件删除了,但是空间并没有被释放(有进程再使用这个文件,删除了这个文件不会马上释放空间)时候,使用df看到的数据比du统计的大。即: df>du 。
例如:
# 创建要给1G大小的文件
root@ubuntu1804:~# dd if=/dev/zero of=./a.txt bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.23766 s, 868 MB/s
#
root@ubuntu1804:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda5 ext4 58G 5.2G 50G 10% /
/dev/sda1 ext4 922M 80M 780M 10% /boot
root@ubuntu1804:~# du -sh /
5.2G /
# 在另一个窗口使用vim打开这个文件
root@ubuntu1804:~# vim a.txt
# 在本窗口删除该文件
root@ubuntu1804:~# rm -rf a.txt
# 使用lsof查看,发现a.txt这个文件被vim进程使用,所以删除了文件没有释放空间
root@ubuntu1804:~# lsof | grep delete
vim 22197 root 3r REG 8,5 1073741824 3673208 /root/a.txt (deleted)
# 再次统计大小
root@ubuntu1804:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda5 ext4 58G 5.2G 50G 10% /
/dev/sda1 ext4 922M 80M 780M 10% /boot
root@ubuntu1804:~# du -sh /
4.2G /
df < du
的情况: 当某个目录文件挂载到其他设备了的时候(多个设备空间的组合),这就是所说的文件系统重叠时候。即 df < du 。
例如:
# /dev/sda5分区挂载到/根目录下,显示已经用了4.2G空间
root@ubuntu1804:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda5 ext4 58G 4.2G 51G 8% /
/dev/sda1 ext4 922M 80M 780M 10% /boot
# 使用du工具统计根目录大小也是4.2G
root@ubuntu1804:~# du -sh /
4.2G /
# 将sdb1分区挂载到/xx下
root@ubuntu1804:~# mount /dev/sdb1 /xx
# 创建要给1G大小的文件
root@ubuntu1804:~# dd if=/dev/zero of=/xx/a.txt bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 10.6664 s, 101 MB/s
# 再次使用du统计/的大小已经变为了5.2G
root@ubuntu1804:~# du -sh /
5.2G
# 使用df查看 仍然是4.2G
root@ubuntu1804:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda5 ext4 58G 4.2G 51G 8% /
/dev/sda1 ext4 922M 80M 780M 10% /boot
/dev/sdb1 ext4 3.9G 1.1G 2.7G 28% /xx
最后此篇关于Linux硬盘存储和文件系统介绍的文章就讲到这里了,如果你想了解更多关于Linux硬盘存储和文件系统介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
今天我在一个 Java 应用程序中看到了几种不同的加载文件的方法。 文件:/ 文件:// 文件:/// 这三个 URL 开头有什么区别?使用它们的首选方式是什么? 非常感谢 斯特凡 最佳答案 file
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我有一个 javascript 文件,并且在该方法中有一个“测试”方法,我喜欢调用 C# 函数。 c# 函数与 javascript 文件不在同一文件中。 它位于 .cs 文件中。那么我该如何管理 j
需要检查我使用的文件/目录的权限 //filePath = path of file/directory access denied by user ( in windows ) File fil
我在一个目录中有很多 java 文件,我想在我的 Intellij 项目中使用它。但是我不想每次开始一个新项目时都将 java 文件复制到我的项目中。 我知道我可以在 Visual Studio 和
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我有 3 个组件的 Twig 文件: 文件 1: {# content-here #} 文件 2: {{ title-here }} {# content-here #}
我得到了 mod_ldap.c 和 mod_authnz_ldap.c 文件。我需要使用 Linux 命令的 mod_ldap.so 和 mod_authnz_ldap.so 文件。 最佳答案 从 c
我想使用PIE在我的项目中使用 IE7。 但是我不明白的是,我只能在网络服务器上使用 .htc 文件吗? 我可以在没有网络服务器的情况下通过浏览器加载的本地页面中使用它吗? 我在 PIE 的文档中看到
我在 CI 管道中考虑这一点,我应该首先构建和测试我的应用程序,结果应该是一个 docker 镜像。 我想知道使用构建环境在构建服务器上构建然后运行测试是否更常见。也许为此使用构建脚本。最后只需将 j
using namespace std; struct WebSites { string siteName; int rank; string getSiteName() {
我是 Linux 新手,目前正在尝试使用 ginkgo USB-CAN 接口(interface) 的 API 编程功能。为了使用 C++ 对 API 进行编程,他们提供了库文件,其中包含三个带有 .
我刚学C语言,在实现一个程序时遇到了问题将 test.txt 文件作为程序的输入。 test.txt 文件的内容是: 1 30 30 40 50 60 2 40 30 50 60 60 3 30 20
如何连接两个tcpdump文件,使一个流量在文件中出现一个接一个?具体来说,我想“乘以”一个 tcpdump 文件,这样所有的 session 将一个接一个地按顺序重复几次。 最佳答案 mergeca
我有一个名为 input.MP4 的文件,它已损坏。它来自闭路电视摄像机。我什么都试过了,ffmpeg , VLC 转换,没有运气。但是,我使用了 mediainfo和 exiftool并提取以下信息
我想做什么? 我想提取 ISO 文件并编辑其中的文件,然后将其重新打包回 ISO 文件。 (正如你已经读过的) 我为什么要这样做? 我想开始修改 PSP ISO,为此我必须使用游戏资源、 Assets
给定一个 gzip 文件 Z,如果我将其解压缩为 Z',有什么办法可以重新压缩它以恢复完全相同的 gzip 文件 Z?在粗略阅读了 DEFLATE 格式后,我猜不会,因为任何给定的文件都可能在 DEF
我必须从数据库向我的邮件 ID 发送一封带有附件的邮件。 EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Adventure Works Admin
我有一个大的 M4B 文件和一个 CUE 文件。我想将其拆分为多个 M4B 文件,或将其拆分为多个 MP3 文件(以前首选)。 我想在命令行中执行此操作(OS X,但如果需要可以使用 Linux),而
快速提问。我有一个没有实现文件的类的项目。 然后在 AppDelegate 我有: #import "AppDelegate.h" #import "SomeClass.h" @interface A
我是一名优秀的程序员,十分优秀!