当前位置: 首页 > news >正文

鸟哥的Linux私房菜读书笔记:文件系统的简单操作

磁盘与目录的容量

现在我们知道磁盘的整体数据实在superblock区块中,但是每个个别文件的容量则在inode当中记载的.

那在命令行下面该如何显示处这几个数据呢?

  • df:列出文件系统的整体磁盘书用量
  • du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
  • df

先来说明一下范例一所输出的结果讯息为:

  • Filesystem:代表该文件系统是在哪个partition,所以列出设备名称;
  • 1k-blocks:说明下面的数字单位是1KB,可利用-h或者-m来改变容量;
  • Used:顾名思义,就是使用掉的磁盘空间
  • Avaliable:也就是剩下的磁盘空间大小
  • Use%:就是磁盘的使用率,如果使用率高达90%以上时,最好需要注意一下了,免得容量不足造成系统问题.
  • Mounted on :就是磁盘挂载的目录所在

由于df主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在Superblock内的信息,所以这个指令显示结果的速度非常的快速!

在显示的结果中需要特别留意的是哪个根目录的剩余容量

因为我们所有的数据都是根目录衍生出来的

需要注意的是, 如果使用 -a 这个参数时, 系统会出现 /proc 这个挂载点, 但是里面的东西都是 0 , 不要紧张! /proc 的东西都是 Linux 系统所需要载入的系统数据, 而且是挂载在“内存当中”的, 所以当然没有占任何的磁盘空间啰!

至于那个 /dev/shm/ 目录, 其实是利用内存虚拟出来的磁盘空间, 通常是总实体内存的一半!由于是通过内存仿真出来的磁盘, 因此你在这个目录下面创建任何数据文件时, 存取速度是非常快速的! ( 在内存内工作) 不过, 也由于他是内存仿真出来的, 因此这个文件系统的大小在每部主机上都不一样, 而且创建的东西在下次开机时就消失了! 因为是在内存嘛

  • du

与 df 不一样的是, du 这个指令其实会直接到文件系统内去搜寻所有的文件数据, 所以上述第三个范例指令的运行会执行一小段时间! 此外, 在默认的情况下, 容量的输出是以 KB 来设计的, 如果你想要知道目录占了多少 MB , 那么就使用 -m 这个参数即可啰! 而, 如果你只想要知道该目录占了多少容量的话, 使用 -s 就可以啦!

至于 -S 这个选项部分, 由于 du 默认会将所有文件的大小均列出, 因此假设你在 /etc 下面使用 du 时, 所有的文件大小, 包括 /etc 下面的次目录容量也会被计算一次。 然后最终的容量( /etc) 也会加总一次, 因此很多朋友都会误会 du 分析的结果不太对劲。 所以啰, 如果想要列出某目录下的全部数据, 或许也可以加上 -S 的选项, 减少次目录的加总喔!

实体链接与符号链接:ln

在 Linux 下面的链接文件有两种, 一种是类似 Windows 的捷径功能的文件, 可以让你快速的链接到目标文件( 或目录) ; 另一种则是通过文件系统的 inode 链接来产生新文件名, 而不是产生新文件! 这种称为实体链接 ( hard link) 。 这两种玩意儿是完全不一样的东西呢! 现在就分别来谈谈。

  • Hard Link(实体链接,硬式链接或实际链接)

在前面,我们知道几件重要的信息:

  • 每个文件都会占用一个inode,文件内容由inode的记录来指向
  • 想要读取该文件,必须要经过目录记录的文件名来指向到正确的inode号码才能读取

也就是说,其实文件名只与目录有关,但是文件内容则与inode有关

那么有没有可能多个文件名对应到同一个inode呢?

有的,那就是hard link的由来.

所以简单地说:hard link只是在某个目录下新增一笔文件名链接到某inode号码的关连记录而已

举个例子来说,假设我系统有个/root/crontab他是/etc/crontab的实体链接,也就是或这两个文件名链接到同一个inode,自然这两个文件名的所有相关信息都会一模一样(除了文件名之外)

你可以发现两个文件名都链接到 34474855 这个 inode 号码, 所以您瞧瞧, 是否文件的权限/属性完全一样呢? 因为这两个“文件名”其实是一模一样的“文件”啦! 而且你也会发现第二个字段由原本的 1 变成 2 了! 那个字段称为“链接”, 这个字段的意义为: “有多少个文件名链接到这个 inode 号码”的意思。 如果将读取到正确数据的方式画成示意图, 就类似如下画面:

上图的意思是, 你可以通过 1 或 2 的目录之 inode 指定的 block 找到两个不同的文件名, 而不管使用哪个文件名均可以指到 real 那个 inode 去读取到最终数据! 那这样有什么好处呢?最大的好处就是“安全”! 如同上图中, 如果你将任何一个“文件名”删除, 其实 inode 与 block都还是存在的! 此时你可以通过另一个“文件名”来读取到正确的文件数据喔! 此外, 不论你使用哪个“文件名”来编辑, 最终的结果都会写入到相同的 inode 与 block 中, 因此均能进行数据的修改哩!

一般来说, 使用 hard link 设置链接文件时, 磁盘的空间与 inode 的数目都不会改变! 我们还是由图 7.2.1 来看, 由图中可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据而已, 既不会增加 inode 也不会耗用 block 数量哩!

hard link 的制作中, 其实还是可能会改变系统的 block 的, 那就是当你新增这笔数据却刚好将目录的 block 填满时, 就可能会新加一个 block 来记录文件名关连性, 而导致磁盘空间的变化! 不过, 一般 hard link 所用掉的关连数据量很小, 所以通常不会改变 inode 与磁盘空间的大小喔!

其实我们也能够知道, 事实上 hard link 应该仅能在单一文件系统中进行的, 应该是不能够跨文件系统才对! 因为图 7.2.1 就是在同一个 filesystem 上嘛! 所以 hard link 是有限制的:

  • 不能跨 Filesystem;
  • 不能 link 目录。

不能跨 Filesystem 还好理解, 那不能 hard link 到目录又是怎么回事呢? 这是因为如果使用hard link 链接到目录时, 链接的数据需要连同被链接目录下面的所有数据都创建链接, 举例来说, 如果你要将 /etc 使用实体链接创建一个 /etc_hd 的目录时, 那么在 /etc_hd 下面的所有文件名同时都与 /etc 下面的文件名要创建 hard link 的, 而不是仅链接到 /etc_hd 与 /etc 而已。 并且, 未来如果需要在 /etc_hd 下面创建新文件时, 连带的, /etc 下面的数据又得要创建一次 hard link , 因此造成环境相当大的复杂度。 所以啰, 目前 hard link 对于目录暂时还是不支持的啊!

Symbolic Link ( 符号链接, 亦即是捷径)

相对于 hard link , Symbolic link 可就好理解多了, 基本上, Symbolic link 就是在创建一个独立的文件, 而这个文件会让数据的读取指向他 link 的那个文件的文件名! 由于只是利用文件来做为指向的动作, 所以, 当来源文件被删除之后, symbolic link 的文件会“开不了”, 会一直说“无法打开某文件! ”。 实际上就是找不到原始“文件名”而已啦!

举例来说, 我们先创建一个符号链接文件链接到 /etc/crontab 去看看:

由上表的结果我们可以知道两个文件指向不同的 inode 号码, 当然就是两个独立的文件存在! 而且链接文件的重要内容就是他会写上目标文件的“文件名”, 你可以发现为什么上表中链接文件的大小为 12 Bytes 呢? 因为箭头( -->) 右边的文件名“/etc/crontab”总共有 12 个英文, 每个英文占用 1 个 Bytes , 所以文件大小就是 12Bytes了!

由 1 号 inode 读取到链接文件的内容仅有文件名, 根据文件名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。 你可以发现的是, 如果目标文件( /etc/crontab) 被删除了, 那么整个环节就会无法继续进行下去, 所以就会发生无法通过链接文件读取的问题了!这里还是得特别留意, 这个 Symbolic Link 与 Windows 的捷径可以给他划上等号, 由Symbolic link 所创建的文件为一个独立的新的文件, 所以会占用掉 inode 与 block 喔!

由上面的说明来看, 似乎 hard link 比较安全, 因为即使某一个目录下的关连数据被杀掉了,也没有关系, 只要有任何一个目录下存在着关连数据, 那么该文件就不会不见! 举上面的例子来说, 我的 /etc/crontab 与 /root/crontab 指向同一个文件, 如果我删除了 /etc/crontab 这个文件, 该删除的动作其实只是将 /etc 目录下关于 crontab 的关连数据拿掉而已, crontab 所在的 inode 与 block 其实都没有被变动喔!
不过由于 Hard Link 的限制太多了, 包括无法做“目录”的 link , 所以在用途上面是比较受限的! 反而是 Symbolic Link 的使用方面较广喔! 好了, 说的天花乱坠, 看你也差不多快要昏倒了! 没关系, 实作一下就知道怎么回事了! 要制作链接文件就必须要使用 ln 这个指令呢!

使用 ln 如果不加任何参数的话, 那么就是 Hard Link 啰! 如同范例二的情况, 增
加了 hard link 之后, 可以发现使用 ls -l 时, 显示的 link 那一栏属性增加了! 而如果这个时候砍掉 passwd 会发生什么事情呢? passwd-hd 的内容还是会跟原来 passwd 相同, 但是passwd-so 就会找不到该文件啦!

而如果 ln 使用 -s 的参数时, 就做成差不多是 Windows 下面的“捷径”的意思。 当你修改 Linux下的 symbolic link 文件时, 则更动的其实是“原始文件”, 所以不论你的这个原始文件被链接到哪里去, 只要你修改了链接文件, 原始文件就跟着变啰! 以上面为例, 由于你使用 -s 的参数创建一个名为 passwd-so 的文件, 则你修改 passwd-so 时, 其内容与 passwd 完全相同,并且, 当你按下储存之后, 被改变的将是 passwd 这个文件!

此外, 如果你做了下面这样的链接

ln -s /bin/root/bin

那么如果你进入 /root/bin 这个目录下, “请注意呦! 该目录其实是 /bin 这个目录, 因为你做了链接文件了! ”所以, 如果你进入 /root/bin 这个刚刚创建的链接目录, 并且将其中的数据杀掉时, 嗯! /bin 里面的数据就通通不见了! 这点请千万注意! 所以赶紧利用“rm /root/bin ” 将这个链接文件删除吧!

基本上, Symbolic link 的用途比较广, 所以您要特别留意 symbolic link 的用法呢! 未来一定还会常常用到的啦!

关于目录的link数量

或许您已经发现了, 那就是, 当我们以 hard link 进行“文件的链接”时, 可以发现, 在 ls -l 所显示的第二字段会增加一才对, 那么请教, 如果创建目录时, 他默认的 link 数量会是多少?让我们来想一想, 一个“空目录”里面至少会存在些什么? 呵呵! 就是存在 . 与 .. 这两个目录啊! 那么, 当我们创建一个新目录名称为 /tmp/testing 时, 基本上会有三个东西, 那就是:

/tmp/testing

/tmp/testing/.

/tmp/testing/..

而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的! 都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录, 所以说, 当我们创建一个新的目录时, “新的目录的 link 数为 2 , 而上层目录的 link 数则会增加 1 ” 不信的话, 我们来作个测试看看

瞧! 原本的所谓上层目录 /tmp 的 link 数量由 14 增加为 15 , 至于新目录 /tmp/testing 则为 2, 这样可以理解目录的 link 数量的意义了吗?

相关文章:

鸟哥的Linux私房菜读书笔记:文件系统的简单操作

磁盘与目录的容量 现在我们知道磁盘的整体数据实在superblock区块中,但是每个个别文件的容量则在inode当中记载的. 那在命令行下面该如何显示处这几个数据呢? df:列出文件系统的整体磁盘书用量du:评估文件系统的磁盘使用量(常用在推估目录所占容量)df先来说明一下范例一所输…...

论如何用python自动下载爱的妹子视频~嘿嘿嘿~

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 现在好看的妹子真的太多啦~ 如何一次性把这些好看的视频全保存下来捏? 开发环境: 版 本: python 3.8 编辑器: pycharm 2022.3.2 专业版 requests >>> pip install request…...

传奇GOM引擎配置PAK密码补丁教程

因为我很少接触GOM引擎,所有很晚才知道PAK密码的事情,以前经常在群里或者QQ上有人问站长,说补丁有PAK密码怎么办,我起初不在意,限制发现是一个大问题,好吧,今天借助这篇文章,分享一下…...

邀您参赛!DCIC 2023「科技金融欺诈风险识别」算法赛正在报名中

近年来,跨境赌博、电信网络诈骗、黑产等外部欺诈违法犯罪形势日益严峻,呈现线上化、产业化、团伙化等特征,国家、监管机构及银行自身都高度重视反欺诈治理工作,坚决守护人民群众的财产安全。 为进一步打击外部欺诈违法犯罪行为&am…...

ElasticSearch-学习笔记04【Java客户端操作索引库】

Java后端-学习路线-笔记汇总表【黑马程序员】ElasticSearch-学习笔记01【ElasticSearch基本介绍】【day01】ElasticSearch-学习笔记02【ElasticSearch索引库维护】ElasticSearch-学习笔记03【ElasticSearch集群】ElasticSearch-学习笔记04【Java客户端操作索引库】【day02】Ela…...

低代码开发平台|制造管理-工艺工序搭建指南

1、简介1.1、案例简介本文将介绍,如何搭建制造管理-工艺工序。1.2、应用场景先填充工序信息,再设置工艺路线对应的工序;工序信息及工艺路线列表报表展示的是所有工序、工艺路线信息,可进行新增对应数据的操作。2、设置方法2.1、表…...

Window 安装 Docker

1.开启Hyper-v 2.确定后重启 3.双击安装包进行安装 4.安装完后系统重启 5.打开Docker软件提示:按下图操作后重启Docker 6.设置docker镜像仓库 { “experimental”: false, “features”: { “buildkit”: true }, “registry-mirrors”: [ “https://docker.mirr…...

最近很火的一部电视(狂飙)像安欣和高启强这样类型的人,谁更合适做软件测试工程师

狂飙》央视收视率狂飙。央视发布《狂飙》收视成绩,全剧平均收视1.54%,平均收视份额6.99%,单集最高收视率2.20%,单集最高收视份额10.69%;晚间电视剧类节目第一。可以说还部剧为今年开了个好头,一开年就引爆收…...

LSTM已死,Transformer当立(LSTM is dead. Long Live Transformers! ):上

回想一下在Seq2seq模型中,如何使用Attention。这里简要回顾一下【1】介绍的方法2(并以此为基础展开对Transformer的讨论)。 下图中包含一个encoder(左)和一个decoder(右)。对于decoder来说,给定一个输入,得到输出,如何进一步得到context vector 呢? 我们需要根据和…...

今天面试招了个18K的人,从腾讯出来的果然都有两把刷子···

公司前段时间缺人,也面了不少测试,前面一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在15-20k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试中,不…...

洛谷 P5764 [CQOI2005]新年好

P5764 [CQOI2005]新年好 题目描述 重庆城里有 nnn 个车站,mmm 条双向公路连接其中的某些车站。每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。在一条路径上…...

【自然语言处理】主题建模:BERTopic(实战篇)

主题建模:BERTopic(实战篇)BERTopic 是基于深度学习的一种主题建模方法。201820182018 年底,Devlinetal.Devlin\ et\ al.Devlin et al. 提出了 Bidirectional Encoder Representations from Transformers (BERT)[1]^{[1]}[1]。BER…...

k8s学习笔记

目录 一、安装前准备 二、安装 1、安装kubelet、kubeadm、kubectl 2、使用kubeadm引导集群 1、下载各个机器需要的镜像 2、初始化主节点 3、加入node节点 3、部署dashboard 1、主节点安装 2、设置访问端口 3、创建访问账号 4、令牌访问获取token 三、实战 1、资源创…...

web自动化测试入门篇05——元素定位的配置管理

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…...

C语言预处理

文章目录 目录 文章目录 前言 一、程序编译的过程 二、编译阶段 1.预处理(*.i) 2.编译(*.s) 3.汇编(*.o) 4.链接 总结 前言 提示:使用vs code(gcc编译器)与vs2022来演示c语言的预处理 提示:以下是本篇文章正文内容,下面…...

git报错大全,你将要踩的坑我都帮你踩了系列

使用git push -u origin master报下面的错: 使用git push -u origin master报下面的错: Updates were rejected because the remote contains work that you do not have locally,This is usually caused by another repository pushing to …...

LabVIEW中使用.NET方法时出现错误1316

LabVIEW中使用.NET方法时出现错误1316为什么不能调用带有泛型参数的方法?LabVIEW不支持哪些.NET功能?为什么会收到以下错误:发生此错误的原因是正在调用LabVIEW中不支持的.NET功能。有关解决方法,请参阅“其他信息”部分。可以在下…...

HTTP2.0 相比 HTTP1.0、HTTP1.1 有哪些重大改进?值得升级更换吗?

目录 HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比 HTTP发展历史 HTTP2解决的问题 HTTP1.0 HTTP1.1 HTTP2.0...

九、Linux文件 - fopen函数和fclose函数讲解

目录 1.fopen函数 2.fclose函数 3.fopen函数和fclose实战 1.fopen函数 fopen fwrite fread fclose ...属于标准C库 include <stdio.h> standard io lib open close write read 属于Linux系统调用 可移植型&#xff1a;fopen > open&#xff08;open函数只在嵌入…...

轨迹预测算法vectorNet调研报告

前言 传统的行为预测方法是规则的&#xff0c;基于道路结构的约束生成多个行为假设。最近&#xff0c;很多基于学习的预测方法被提出。他们提出了对于不同行为假设的进行概率解释的好处&#xff0c;但是需要重构一个新的表示来编码地图和轨迹信息。有趣的是&#xff0c;虽然高精…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...