ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

RH134归档与远程传输实战:tar、rsync与备份脚本避坑指南

2026/9/26 4:46:48 拓冰建站 浏览量
RH134归档与远程传输实战:tar、rsync与备份脚本避坑指南 备考RH134的时候第4章归档和传输文件是最容易让人轻敌的一章。看起来就是tar、scp、rsync几个命令好像用过一两次就会了但真正进了EX200考场或者日后做生产环境的迁移备份才发现细节多得能写一篇长文。这章知识点横跨打包压缩和远程传输两大块几乎每个场景都会用到系统备份、日志归档、批量分发配置、服务器迁移全离不开这章的本事。这篇文章我会从RH134的考点定位讲起把tar的底层逻辑、压缩算法选型、远程传输工具拆开揉碎最后再给一份可以抄作业的备份脚本和避坑清单。无论你是正在备考EX200的学员还是日常要跟Linux文件搬运打交道的运维这篇文章都能省下你翻文档和踩坑的时间。1. 备考RH134时这章为什么最容易在细节上翻车RH134是红帽系统管理进阶课程对应EX200认证考试。相比RH124的入门打基础RH134开始真正进入系统管理员日常存储分区、逻辑卷、网络配置、SELinux策略、系统引导、虚拟化以及第4章要讲的归档与远程文件传输。很多备考的人会觉得前面几章更硬核归档传输不过是敲几个命令考前瞟一眼就完事了结果往往在这里丢分。1.1 这章在考试和实战里的真实占比EX200的考试环境是标准化的虚拟机考试中不会出现大段现实里那种几十TB数据的传输场景但它会非常刁钻地考察你对细节的掌握程度。我印象比较深的是两类常见出题形式给你一组配置文件或目录要求打包成带时间戳或固定命名的归档文件放到指定路径并校验内容完整。要求你从另一台机器比如考试环境里的server传输指定文件到本机或者把本机的日志目录同步到远程目录同时保留权限属主和时间戳。这类题不是考你会不会敲tar -czvf而是考你能不能一次做对。比如归档时要求排除某个子目录或者解包时不污染当前目录结构甚至要求把归档解到特定目录。这些就是第4章真正的考点分布。1.2 学这章需要提前具备的基础动手做实验之前你先确认自己已经熟练掌握了这几个前导知识点文件权限、属主属组、软硬链接和扩展属性RH124的内容。标准输入输出重定向和管道后面会用它做流式归档。基本的SSH登录和无密码登录配置因为scp、rsync、sftp全部要基于SSH通道工作。如果你对这些还不熟建议先翻回去补一补否则下面的实战操作会卡在权限不足连接超时这些莫名其妙的问题上。2. tar的底层逻辑从磁带存档到现代容器镜像的打包内核很多人把tar直接当压缩命令来用这是最深的误解。tar的全名是Tape Archive出身年代可以追溯到Unix早期磁带存储的时代。它的本职工作是把一堆文件拼成一个流——不做压缩只负责打包。压缩是后来才通过外部工具接进来的。理解了这一层你才能明白为什么tar和gzip能分开用也才能看懂tar -czvf里那个z是什么时候加上去的。2.1 tar格式的两条主线tar发展到现在主要有两条格式线老式v7/ustar格式兼容性最广但支持不了很长的文件名、大文件单文件超8GB会出问题、也没有扩展属性的位置。GNU格式和POSIX.1-1988的pax格式现代Linux发行版默认用的是GNU tar支持长文件名、大文件、ACL、SELinux上下文、xattr等。RHEL 9/10自带的GNU tar默认处理格式已经能覆盖绝大多数场景。你不需要记太多格式演变但至少要明白同一套tar命令在不同的Unix发行版之间解包结果可能有细微差异。比如在AIX上打的包拿到Linux上解偶尔会碰到格式警告。实际工作中跨平台传包时建议都用pax格式命令是tar --formatpax -cf ...。2.2 三个核心操作创建、解包、列出tar的命令方式不是tar --create --file这种长选项吗对长选项也有但RHEL考试和运维老手几乎清一色用短选项组合。核心就是三件事# 创建归档打包 tar -czvf backup.tar.gz /var/log # 列出归档内容查包 tar -tzvf backup.tar.gz # 解包 tar -xzvf backup.tar.gz -C /opt/restore每个短选项都值得过一遍脑子而不是无脑敲-ccreate创建归档。-xextract解包。-tlist列出归档里的文件清单。-vverbose显示处理过程方便你看有没有漏文件。-f指定归档文件名。注意-f后面必须紧跟文件名而且习惯上放在选项串的末尾防止把文件名当成选项参数。-z调用gzip压缩/解压。-j调用bzip2。-J调用xz。-C指定操作的目标目录比如解包到/opt/restore。一个很容易考到的点是tar -xf在解包时会把归档里的路径结构原样还原到当前工作目录下。如果你站在家目录执行tar -xf /tmp/logs.tar.gz而归档里的路径是var/log/messages那么它会在当前目录下创建一个var目录再把路径套进去。想规避这种污染就一定要用-C指定一个空的/专门的解包目录。2.3 查包和找文件不只是tar -t考试里常考tar -t的实战价值打开一个未知tar包之前先列出内容别盲审。这个过程我在生产上已经养成了习惯tar -tzvf apps.tar.gz | head -20这样先看两件事一是路径开头有没有/二是文件类型是否正常。如果归档里存在绝对路径以/开头解包时tar默认会剥掉开头的斜杠防止覆盖宿主机根目录的文件。这个设计很重要但它不是万能的后面踩坑清单里我再细讲。另外tar支持在列目录时做通配符匹配。比如只想知道归档里有没有.conf文件不用把所有内容都列出来tar -tf apps.tar.gz --wildcards *.conf--wildcards选项非常推荐尤其在归档内容上千个文件的场景下比tar -tf | grep高效得多还不用额外管道。2.4 保留文件属性解包权限、属主与SELinux上下文RH134考试特别爱考保留元数据这类点。你解包之后如果文件权限变了后面启动服务或读日志就会碰上权限问题。解决方式分两类-p--preserve-permissions解包时保留权限位。如果以root用户执行属主属组默认也会保留。现代RHEL还要注意SELinux上下文tar需要--selinux选项才会保留SELinux上下文标签否则解出来的文件可能带有错误的上下文导致服务无法读写。在RHEL 9/10上我更推荐直接这样组合tar --selinux --acls --xattrs -xzf backup.tar.gz -C /opt/restore--acls保留POSIX ACL--xattrs保留扩展属性。备份恢复场景里这仨一个都不能少漏一个就会造出看起来文件都在但服务起不来的隐形坑。3. 压缩搭档怎么选不只gzip还要看得懂压缩率与速度的取舍tar本身不压缩所以它要和外部压缩程序配合。RHEL里最常见的搭档是gzip、bzip2、xz近几年zstd也悄悄有了存在感。考试不会要求你比谁更快但会在题目中暗示尽量压缩到最小或速度优先这时候你得会选。3.1 一起看一组实测对比我拿一套包含日志、配置、二进制程序混合的目录做了个小实验大小约1.2GB在一台4核8G的RHEL 9虚拟机上分别用不同算法打了一遍结果大概是这样具体数值略有浮动但趋势稳定算法压缩后体积耗时对应tar选项不压缩1.2GB3秒-cfgzip默认档310MB约25秒-czfbzip2288MB约90秒-cjfxz默认档272MB约4分半-cJfzstd默认档315MB约8秒--zstd -cf这里有个非常反直觉的点xz压缩率最高但时间成本高得吓人。日常运维里我不建议一上来就用xz除非是冷数据归档归档后基本不再读取想尽量省磁盘。而zstd在速度上的优势极其明显压缩率还接近gzipRHEL 9的tar已经支持--zstd如果环境允许备份临时数据用它非常舒服。3.2 直接压缩已打包的文件另一种合法姿势tar在创建归档时可以直接调用压缩程序也就是刚才那组选项。但你也可以先打包再压缩走两步# 先打包 tar -cvf logs.tar /var/log # 再压缩 gzip logs.tar # 得到 logs.tar.gz这一步在日常操作中不是多此一举它可以让你在压缩之前做一次校验或者单独用更小的压缩级别。解压时对应又有gunzip logs.tar.gz tar -xvf logs.tar考试里有可能故意给你一个.tar.gz文件要求在不额外解压的情况下直接查看归档内容。记住tar -tzf和tar -xzf都能直接识别gzip压缩不需要先gunzip。tar程序是通过文件名后缀和文件魔数自动识别的-z选项只是显式告诉它用gzip流处理。3.3 怎么判断一个归档用的是哪种压缩拿到远程传过来的归档不知道压缩算法别瞎试先用file命令判明file backup.unknown # 输出会显示: gzip compressed data / XZ compressed data ...RHEL自带的file工具靠文件头部魔数识别压缩类型准确率非常高。识别完之后再决定tar -xzf还是tar -xJf。这个习惯能帮你节省大量尝试时间我见过不少人对着一个xz压缩包反复用tar -xzf然后报not in gzip format纯粹是没先看一眼。4. 传输文件的四件套scp、sftp、rsync、curl的分工与配合归档做完下一步就是传输。RH134第4章后半部分的重点是各类远程文件传输手段。这些工具底层全是SSH加密隧道所以前提都是你在两台机器之间配好了SSH访问。4.1 scp最直白的加密复制scp简单得不像一个远程工具跟本地cp几乎一个习惯只是多了userhost:path的写法。# 推本地推送到远程 scp backup.tar.gz root192.168.1.10:/data/backup/ # 拉远程拉取到本地 scp root192.168.1.10:/data/backup.tar.gz . # 递归复制整个目录 scp -r root192.168.1.10:/etc/nginx/ ./nginx-conf/三个常被忽略的选项-P大写指定远端SSH端口。默认22如果是自定义端口必须加。注意它跟tar的-f一样容易跟小写-p搞混。-p小写保留文件修改时间和访问时间。说实话scp在默认情况下不推荐用于精确的备份传输因为它对元数据保留能力很弱。-l限制带宽单位是Kbit/s。生产环境往生产机传大文件时很有用防止把业务带宽占满。scp的最大局限是没法做增量重复传同一批文件时它会重新全量拷贝。如果你只是传一两个文件scp够用一旦文件多了、体积大了、还要周期同步就该rsync上场。4.2 sftp交互式文件传输的隐藏优势很多备考RH134的人会把sftp忽略掉因为 scp 看起来更正统。但sftp有一个scp替代不了的优势交互式浏览远端目录。在不知道远端确切文件名的情况下sftp能直接ls、cd、put、get跟逛本地目录一样。sftp root192.168.1.10 # 进入后就是类FTP交互 ls cd /var/log get messages put backup.tar.gz exit批量下载可以用mget批量上传用mput。它和FTP的另一个区别是全程走SSH加密不需要额外开放21端口。RHEL 9/10上OpenSSH服务默认已经启用了sftp子系统不用额外配置就能用。4.3 rsync增量同步的核心引擎如果你只能在这章里掌握一个工具我会建议你死磕避坑rsync。它解决的问题是当源和目标大部分内容一致时只传输差异部分而不是全量覆盖。这个能力来自rsync的块校验算法它会把文件切成块计算每块的校验值和目标端已有内容比对只传不重合的块。最基本的用法rsync -av /source/dir/ root192.168.1.10:/dest/dir/-a是归档模式它展开后相当于-rlptgoD即递归、保留软链接、保留权限、保留时间戳、保留属主属组、保留设备文件一句话把文件整个性格一起带过去。你再用-vverbose看到底传了哪些文件。要说清楚一个最常见的坑就是源路径结尾的斜杠。命令里写rsync -av /src/data root192.168.1.10:/dest/和rsync -av /src/data/ root192.168.1.10:/dest/区别在于第一行会把/src/data目录本身复制到/dest/data第二行会复制/src/data里的内容到/dest/下。一个斜杠之差目标目录结构会完全不同。我的建议是统一养成习惯同步目录内容就用尾部带斜杠的写法同步目录整体就不带斜杠写注释标明意图避免误判。还有两个生产环境必用的选项--delete删除目标端存在但源端已经不存在的文件让目标完全镜像源。慎用建议先加-ndry-run跑一遍看预览再实际执行。-n试运行不真实传输只打印将要执行的操作。在任何危险操作前先来一遍是我强烈推荐的习惯。4.4 curl和普通文件下载场景RHEL 9/10自带curl命令它也能用于文件下载尤其是从HTTP/FTP服务器拉取归档。考纲里不一定单独考它但日常运维里你从镜像站下载RPM或从FTP拿包时总会用到。# 下载并保留远端文件名 curl -O https://example.com/file.tar.gz # 下载并重命名 curl -o backup.tar.gz https://example.com/file.tar.gz # 从FTP下载 curl -O ftp://192.168.1.10/pub/file.tar.gz配合-u user:pass可以处理带认证的FTP/HTTP下载。注意区分curl的-o指定本地文件名rsync的-o是保留属主。工具之间选项含义都不一样脑子别乱。5. 实操踩坑清单归档恢复位置、管道妙用和备份脚本模板前面把原理讲得差不多了这节我直接端出平时踩坑攒下的经验都是命令文档里翻不出来的细节。5.1 解包时路径污染与绝对路径的应对前面提到过tar解包默认剥掉路径开头的/防止覆盖。但有三种情况你会栽进去归档里的路径包含../比如打包时不小心把文件搞成了../../etc/passwd这类相对路径。现代GNU tar解包时会拒绝包含..的路径条目但保险起见打包前先tar -tf扫一眼内容。目标目录已经有同名文件解包直接覆盖不会提示。想避免要么提前备份目标目录里的同名文件要么解到一个全新目录再做核对。用通配符解包时匹配到意外文件。比如你想只解出jar包命令是tar -xf archive.tar.gz --wildcards *.jar结果把配置里的.jar.backup也解出来了。我建议匹配范围写精确一点解包后立即ls验证。生产上我养成的流程是任何归档解包前先建一个干净的恢复目录比如/restore/2025-06-xx用-C指过去再结合--strip-components选项控制是否剥离路径层数。--strip-components1的意思是去掉第一层目录名这在解开别人传来的带有顶层目录的归档时特别好用。5.2 tar加管道不落盘完成目录级复制tar不只是打包文件成 .tar.gz它还能作为一个流直接灌进另一个tar实现跨目录、跨文件系统的无临时文件拷贝tar -cf - /var/lib/mysql | tar -xf - -C /backup/mysql-copy这里-f -的意思是归档写到标准输出第二个tar -xf -从标准输入读取归档流。整个过程不产生中间文件对高IO敏感场景很友好也顺带复习了命令行重定向和管道这两个RH124老知识点。考试如果出复制目录并完整保留权限这个答案会非常加分。用这种方式拷贝目录比cp -a多了一层管道看起来绕但在跨文件系统复制时它能预计到更多元数据信息尤其是在保留SELinux上下文时cp做不到而tar管道可以。RHEL 9/10上要保留SELinux上下文加选项即可tar --selinux -cf - /etc | tar --selinux -xf - -C /opt/etc-backup5.3 一份可以直接拿去用的每日备份脚本模板我在很多生产机器上部署过类似的备份策略这里给出一份适合RHEL 9/10的简化模板逻辑是打包关键目录、再用rsync推到备份服务器、最后保留最近N份本地归档。#!/bin/bash # daily-backup.sh - RHEL 9/10日志目录备份脚本 BACKUP_DIR/srv/backup HOSTNAME$(hostname -s) DATE$(date %F) KEEP_DAYS7 # 1. 创建归目 mkdir -p ${BACKUP_DIR} # 2. 用tar打包压缩排除临时文件 tar --selinux --acls --xattrs -czf ${BACKUP_DIR}/${HOSTNAME}-${DATE}.tar.gz \ --exclude/var/log/audit/*.tmp \ /var/log # 3. 本地保留7天其余删除 find ${BACKUP_DIR} -name *.tar.gz -mtime ${KEEP_DAYS} -delete # 4. 通过rsync推送到备份服务器注意尾部斜杠 rsync -av --delete -e ssh ${BACKUP_DIR}/ backup192.168.1.10:/data/backup/几点说明第2步用--exclude排除临时文件打包日志时这能显著减小体积。第3步的find -mtime 7是删除超过7天的文件-delete直删要小心路径别写错。更稳的是先find ... -mtime 7 -print看一眼再删。第4步的-e ssh显式指定传输用SSH通道如果你的rsync要指定端口写成-e ssh -p 2222。5.4 从考试角度总结几个最容易犯的组合错误几个我见惯了、自己也中过的坑单独列一份快速自查表场景错误示例正确做法传输时保留时间戳scp -r dirscp用-p最稳是rsync-a查看xz压缩归档tar -tzf file.tar.xztar -tJf file.tar.xz或直接tar -tf新版会自动识别解到指定目录先进目录再tar -xf ../../file.tar.gz直接用-C /指定目录同步目录内容rsync -av /src data/ host:/dst源路径尾部加/确认意图考试环境里时间是有限的练习时就把这些变成肌肉记忆比什么都强。最后再分享一个小技巧归档传输这一章最容易被新手忽略的其实是校验这一步。传大文件或者做完备份之后花一分钟做个校验能省掉后面一整天的排查时间。我的习惯是归档生成后立刻算一个SHA256摘要传输到目标机后再算一遍做对比sha256sum backup.tar.gz backup.tar.gz.sha256 # 传完之后 sha256sum -c backup.tar.gz.sha256输出OK就说明文件在传输中没有损坏。RHEL 9/10上这两个命令都是自带可用的无需额外安装。把这个习惯跟tar、rsync配合起来你会发现自己备份和迁移的成功率会明显上一个台阶这也是我在实际维护几十台服务器之后最想让你提前知道的一件事。