[编程技术] 后端面试之Linux-cp和mv命令的区别
作者:CC下载站 日期:2021-12-07 00:00:00 浏览:22 分类:编程开发
背景
如果你突然被面试官问:cp和mv这两个linux的命令有什么区别?
你会不会一脸懵逼,cp不就是复制,mv不就是移动吗,还能有什么区别?
如果你也是这么想,那么这篇文章适合你。
inode
了解文件操作命令例如cp
、mv
、rm
的底层原理时,需要先了解 linux 中文件系统的基本原理。
在linux系统中,文件系统对文件的存储和访问是通过一种被称为inode
即i节点的机制来实现的。
为什么需要inode呢?
文件数据存储在硬盘上,硬盘的最小存储单位叫做"扇区"(512Bytes)。OS读取硬盘的时候,为了提高效率会一次性读取一个"块"(8*扇区=4K)。
所以一个大文件的数据内容在磁盘上可能不是连续空间的,就需要inode来把各个Block
串联起来。
每个文件都对应一个 i 节点,i 节点存储了除文件名
和文件内容
之外的所有信息。
inode(index node)表中包含文件系统所有文件列表,一个节点 (索引节点)是在一个表项,包含有关文件的信息( 元数据 ),包括:文件类型,权限,UID,GID、链接数(指向这个文件名路径名称个数)、该文件的大小和不同的时间戳、指向磁盘上文件的数据块指针、有关文件的其他数据。
了解inode的基本信息之后,我们再看看cp
, mv
有什么区别。
cp
目标文件不存在时
当dest.txt
不存在时,执行cp src.txt dest.txt
。
可以发现dest.txt
和src.txt
的inode不一样,也就是用open()新建一个文件dest.txt
,然后读取src.txt
的数据再写入dest.txt
。
cp前:
- src.txt:
Inode: 34643179
cp后:
- dest.txt:
Inode: 34257722
[root@instance-1 blog]# strace cp source.txt destination.txt 2>&1 | egrep 'source.txt|destination.txt'
execve("/bin/cp", ["cp", "source.txt", "destination.txt"], 0x7ffd8f1f3ea0 /* 23 vars */) = 0
stat("destination.txt", 0x7fff021b0040) = -1 ENOENT (No such file or directory)
stat("source.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
stat("destination.txt", 0x7fff021afda0) = -1 ENOENT (No such file or directory)
open("source.txt", O_RDONLY) = 3
open("destination.txt", O_WRONLY|O_CREAT|O_EXCL, 0644) = 4
目标文件存在时
此时dest.txt
已经存在,再次执行cp src.txt dest.txt
。
可以发现dest.txt
跟上次执行的dest.txt
的inode没有变化,同时看open()的参数也可以看出:先清空了dest.txt
的内容,再把新的内容写入目标文件。没有文件的删除和创建,所以inode没有变化。
cp前:
- src.txt:
Inode: 34643179
- dest.txt:
Inode: 34257722
cp后:
- dest.txt:
Inode: 34257722
[root@instance-1 blog]# strace cp source.txt destination.txt 2>&1 | egrep 'source.txt|destination.txt'
execve("/bin/cp", ["cp", "source.txt", "destination.txt"], 0x7ffd4bfd93e0 /* 23 vars */) = 0
stat("destination.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
stat("source.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
stat("destination.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
open("source.txt", O_RDONLY) = 3
open("destination.txt", O_WRONLY|O_TRUNC) = 4
结论
- cp调用open系统函数,只会复制文件数据,不会复制inode索引节点的元数据。
mv
目标文件不存在时
当目标文件dest.txt
不存在时,执行mv src.txt dest.txt
。
可以发现dest.txt
和src.txt
的inode一样,底层调用了rename(),inode信息与src.txt
的索引节点保持一致。
注:centos 7.5以上的版本,调用renameat2
函数,7.5及以下的函数,依旧调用rename
函数,没有本质的区别。
mv前:
- src.txt:
Inode: 34643179
mv后:
- dest.txt:
Inode: 34643179
[root@instance-1 blog]# strace mv src.txt dest.txt 2>&1 | egrep 'src.txt|dest.txt'
execve("/bin/mv", ["mv", "src.txt", "dest.txt"], 0x7ffd71529810 /* 23 vars */) = 0
stat("dest.txt", 0x7ffdb24b0fe0) = -1 ENOENT (No such file or directory)
lstat("src.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
lstat("dest.txt", 0x7ffdb24b0c90) = -1 ENOENT (No such file or directory)
renameat2(AT_FDCWD, "src.txt", AT_FDCWD, "dest.txt", 0) = 0
目标文件存在时
当目标文件dest.txt
存在时,执行mv src.txt dest.txt
。
可以发现dest.txt
和src.txt
的inode一样(之前的dest.txt
的inode不见了),底层调用了rename(),inode变为src.txt
的索引节点。
mv前:
- src.txt:
Inode: 34643179
- dest.txt:
Inode: 34257722
mv后:
- dest.txt:
Inode: 34643179
[root@instance-1 blog]# strace mv src.txt dest.txt 2>&1 | egrep 'src.txt|dest.txt'
execve("/bin/mv", ["mv", "src.txt", "dest.txt"], 0x7ffeef1ed240 /* 23 vars */) = 0
stat("dest.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
lstat("src.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
lstat("dest.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
renameat2(AT_FDCWD, "src.txt", AT_FDCWD, "dest.txt", 0) = 0
结论
- mv调用rename系统调用,把
src.txt
重命名为目标文件,会将存储于inode索引节点上的文件元信息也移动到新文件中。
rm
在Linux中,要真正删除一个文件,需要满足两个条件:
- 链接数为0
- 没有进程打开该文件
系统调用unlink()是移除目标文件的一个链接。可以发现rm底层调用的其实就是unlink()
[root@instance-1 blog]# strace rm src.txt 2>&1 | egrep 'src.txt'
execve("/bin/rm", ["rm", "src.txt"], 0x7fffbf900e58 /* 23 vars */) = 0
newfstatat(AT_FDCWD, "src.txt", {st_mode=S_IFREG|0644, st_size=13, ...}, AT_SYMLINK_NOFOLLOW) = 0
unlinkat(AT_FDCWD, "src.txt", 0) = 0
unlink系统调用
从文件系统中删除一个名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。
如果文件仍旧是打开的,或者是被进程占用,其内容不会被删除。只有当进程关闭该文件或终止时(这种情况下,内核关闭该进程所打开的全部文件),该文件的内容才会被删除。
所以你可能会遇到,一个进程在读写文件时,你发现磁盘空间不足,使用rm删除文件,却发现磁盘空间却没有释放的情况。
使用lsof | grep deleted
可以查看占用的进程。kill进程之后,文件才能真正的被删除。
结论
- rm调用unlink系统调用,只有当所有的进程都不占用此文件的时候,才会真正的从磁盘删除。
替换可执行程序
不知道你还记不记得你是怎么替换可执行文件的,一般来说:
可当你使用
cp new_backend_server backend_server
的时候,提示Text file busy
。
为什么呢,因为你这个文件正在被使用,当你清空并写入的时候,它能感知到修改,修改文件内容很可能导致程序逻辑错误甚至崩溃。所以禁止你对正在使用的文件执行cp替换。
当你执行:
rm backend_server
mv new_backend_server backend_server
service restart backend_server
就可以成功替换新的文件。
这又是为什么呢,因为当你使用rm&mv
的时候是直接unlink旧的文件,由于文件被进程占用,实际上并没有删除,当你把新的文件mv到当前文件的时候,直接进行rename。并不会影响当前被进程占用的那个文件(新旧的inode不同,只是名字一样)。当你重启的时候,才会释放旧的文件,使用新的文件。
总结
最后总结一下:
- cp调用open系统函数,只会复制文件数据,不会复制inode索引节点的元数据。(不改变inode)
- mv调用rename系统调用,把
src.txt
重命名为目标文件,会将存储于inode索引节点上的文件元信息也移动到新文件中。(改变inode) - rm调用unlink系统调用,只有当所有的进程都不占用此文件的时候,才会真正的从磁盘删除。
<全文完>
猜你还喜欢
- 03-29 [编程相关] Winform窗体圆角以及描边完美解决方案
- 03-29 [前端问题] has been blocked by CORS policy跨域问题解决
- 03-29 [编程相关] GitHub Actions 入门教程
- 03-29 [编程探讨] CSS Grid 网格布局教程
- 10-12 [编程相关] python实现文件夹所有文件编码从GBK转为UTF8
- 10-11 [编程算法] opencv之霍夫变换:圆
- 10-11 [编程算法] OpenCV Camshift算法+目标跟踪源码
- 10-11 [Python] python 创建 Telnet 客户端
- 10-11 [编程相关] Python 基于 Yolov8 + CPU 实现物体检测
- 03-15 [脚本工具] 使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏
- 01-08 [编程技术] 秒杀面试官系列 - Redis zset底层是怎么实现的
- 01-05 [编程技术] 《Redis设计与实现》pdf
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[动画] 迪士尼系列动画139部 国英双语音轨 【蓝光珍藏版440GB】
[电影] 莫妮卡贝鲁奇为艺术献身电影大合集 1080P超清 双语字幕
[电影] DC电影宇宙系列合集18部 4K 高码率 内嵌中英字幕 273G
[音乐] 【坤曲/4坤时】鸡你太美全网最全,385首小黑子战歌,黄昏见证虔诚的信徒,巅峰诞生虚伪的拥护!
[音乐] 用餐背景音乐大合集 [MP3/flac]
[书籍] 彭子益医书合集 [PDF/DOC]
[电影] 《环太平洋两部合集》 4K REMUX原盘 [杜比视界] 国英双语音轨 [内封特效字幕] [133.8G]
[电影] 异人之下 The Traveller 2024✨【影版】【4K正式版/HQ超高码/DDP5.1】✚【1080高码】无水印/无压缩
[动漫] 头文字D 动漫 (1998) S01-S06季 1080P 国粤日音轨 续作 剧场版 电影
[小说] 知轩藏书全站7667册txt小说合集精心校对版
[书籍] 彭子益医书合集 [PDF/DOC]
[游戏] 《黑神话悟空》免安装学习版【全dlc整合完整版】+Steam游戏解锁+游戏修改工具!
[动画] 《名侦探柯南》名侦探柯南百万美元的五菱星 [TC] [MP4]
[电视剧集] [BT下载][黑暗城市- 清扫魔 Dark City: The Cleaner 第一季][全06集][英语无字][MKV][720P/1080P][WEB-RAW]
[涨点姿势] 男性性技宝典:14招实战驭女术——爱抚、按摩、催情、姿势、高潮全攻略
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[短剧] 被下架·禁播的羞羞短剧·午夜短剧合集
[游戏] 黑神话悟空离线完整版+修改器
[影视] 美国内战 4K蓝光原盘下载+高清MKV版/内战/帝国浩劫:美国内战(台)/美帝崩裂(港) 2024 Civil War 63.86G
[影视] 一命 3D 蓝光高清MKV版/切腹 / 切腹:武士之死 / Hara-Kiri: Death of a Samurai / Ichimei 2011 一命 13.6G
[影视] 爱情我你他 蓝光原盘下载+高清MKV版/你、我、他她他 2005 Me and You and Everyone We Know 23.2G
[影视] 穿越美国 蓝光原盘下载+高清MKV版/窈窕老爸 / 寻找他妈…的故事 2005 Transamerica 20.8G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[书籍] 彭子益医书合集 [PDF/DOC]
[资源] 精整2023年知识星球付费文合集136篇【PDF格式】
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
- 最新评论
-
有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢WillKwok 评论于:10-09 感谢分享1234123 评论于:10-07 太好了终于找到了谢谢Tom 评论于:10-07 谢谢分享loonghd 评论于:09-30
- 热门tag