ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

tar.gz解压与源码编译安装实战:从命令到踩坑全流程

tar.gz解压与源码编译安装实战:从命令到踩坑全流程 简介这是一份面向 ROS 与嵌入式开发者的完整示例包围绕 HC-SR04 超声波传感器距离采集、ROS 节点处理与 STM32 串口控制展开。包内整合了 ROS 工作空间源码、STM32 固件以及串口通信实现可用于学习如何将传感器数据通过 /distance 话题发布并经由串口向 STM32 下发控制指令驱动 LED 等外设。资源共含 58 个文件以 cc/h 源码、sample 示例、配置文件、XML/VC 工程文件为主整体仅 1.63MB结构紧凑。已有 394 人学习下载适合正在搭建 ROS 与单片机联动实验环境、需要参考完整通信链路设计的中高级开发者。通过阅读源码可以掌握 ROS 节点编写、串口协议解析、超声波测距逻辑以及嵌入式端固件配合方法对构建避障或自动控制机器人有直接借鉴价值。 前几天同事丢给我一个supersonic.tar.gz一句话都没交代。文件不大安安静静躺在共享目录里后缀是经典的 tar.gz。在 Linux 环境下混久了的人应该都有过这种经历tar.gz 包就像快递盒里面可能是源码、可能是编译好的二进制、也可能是随手打包的配置文件。怎么安全高效地拆开它、用起来是最基础也最见功力的一环。这篇文章就以 supersonic.tar.gz 这个具体的包为例把 tar.gz 的解压命令、源码编译安装、以及我在实际操作里踩过的坑完整走一遍希望能给刚接触 Linux 的同学一些参考也帮老手复习一下容易忽略的细节。1. 拿到 supersonic.tar.gz先别急着敲 tar -xzf1.1 用 file 命令确认包裹真实身份很多人拿到 tar.gz 就直接tar -xzf一把梭我不建议这么做。第一步花两秒钟跑一下file命令能省掉后面一堆莫名其妙的报错file supersonic.tar.gz正常输出长这样supersonic.tar.gz: gzip compressed data, from Unix, original size modulo 2^32 41943040file命令读的是文件头部的魔数magic number它不会真的去解压只是根据二进制特征判断文件类型。这一步最大的价值在于排除假包——我收到过名字叫 xxx.tar.gz、实际是个 zip 压缩包的文件也遇到过后缀是 .tar.gz、内容却是纯文本的情况。如果你不看类型直接拿 tar 去解会吐出一堆 gzip: stdin: not in gzip format 之类的错误新手很容易被绕进去以为是命令敲错了其实是文件本身的问题。顺带说一句如果你的系统输出的是 HTML document text 或者 ASCII text那这个包基本可以断定是从网页误存下来的别浪费时间了。1.2 先看清单再动手tar -tzf 是安全第一步确认完这是个正经的 gzip 压缩流之后我会再列一下包内容tar -tzvf supersonic.tar.gz这里-t表示 list只列清单不解压-z表示 gzip 格式-v输出详细信息-f指定文件名。列出来之后主要看四件事有没有一个顶层目录。规范的开源项目包通常都带一个顶层目录比如supersonic/或者supersonic-1.0.0/所有文件都挂在这个目录下面。如果没有顶层目录、一堆文件散落在包根路径下解压的时候就会直接糊到当前目录里把已有的文件搅得乱七八糟。路径里有没有../或者以/开头的绝对路径。这是恶意压缩包的经典手段利用解压路径穿越path traversal去覆盖你系统里的文件属于安全红线。文件权限是否合理。-v输出里能看到每个文件的权限位如果发现某个可执行文件带着 setuid 位权限是-rwsr-xr-x要格外警惕。包的总大小和文件数量。这关系到后面磁盘空间够不够。列清单这一步看着多余实际只要几秒钟却能避免把当前目录搞得一团糟。我见过太多人在自己的 home 目录直接解压一个没有顶层目录的包散出来几十个文件跟原有配置文件混在一起最后只能一个个手工清理。1.3 解压前问自己的三个问题看完清单不要急着解压先回答三个问题解压到哪里我习惯在 /tmp 或者专门的 build 目录下新建一个空目录再解压。如果包里已经有顶层目录就在当前目录解压然后 cd 进去如果包里没有顶层目录就先mkdir supersonic再tar -xzf supersonic.tar.gz -C supersonic/。磁盘空间够不够df -h看一眼目标分区的剩余空间。一个 50MB 的 tar.gz 解压出来变成 500MB 是很常见的事压缩率高的包差距更大。这个包是谁给你的、可不可信内部工具流传的包和网上随手下载的包信任级别完全不一样。内部包我相对放心外部包我严格执行上面的检查流程解压完还会再find一遍确认没有异常文件。这三个问题花不了一分钟但能把后面几小时的麻烦提前干掉。2. tar 和 gzip 其实是两道工序2.1 打包与压缩的诞生背景很多人把 tar.gz 当成一种压缩格式这个理解其实不太准确。tar 和 gzip 是两件完全不同的事只是经常被组合使用。tar 的全称是 tape archive名字已经说明了它的出身——早期 Unix 系统用磁带备份数据磁带是顺序存储设备不适合像磁盘那样按目录随机读写。tar 的作用就是把一堆文件连同它们的路径、权限、属主、时间戳这些元数据按顺序拼成一个连续的字节流。所以 tar 本身一点压缩都不做纯粹是归档。gzip 才是真正负责压缩的那一环它把这个归档流再处理一遍把重复的字节模式替换成更短的标记。把两步分开设计的巧妙之处在于归档格式和压缩算法解耦了。你可以用 tar 归档后用 gzip 压也可以换成 bzip2、xz、zstd甚至完全不压缩。压缩算法更新换代不会影响归档格式本身反过来也一样。2.2 .tar.gz 为什么能统治 Linux 发行版Linux 世界里 .tar.gz 能成为源码发布的绝对主流不是偶然的。最关键的一点是它能完整保留 Unix 文件系统的元数据符号链接、硬链接、权限位、属主和组、mtime 时间戳。这对源码包和二进制发布包来说都是刚需——一个程序装上之后能不能跑、跑起来之后行为正不正常跟文件权限和链接关系紧密相关。相比之下zip 在设计上更自包含目录结构、压缩数据和元数据都塞在一个文件里跨平台使用方便但它对 Unix 权限的支持一直比较弱。zip 格式里虽然有 external attributes 字段可以记权限但不同实现之间处理得参差不齐打包解包来回折腾容易丢东西。源码发布这种场景大家要的是原封不动地还原文件属性tar.gz 显然更合适。还有一个现实因素gzip 出现得早、普及率高GNU tar 对它的支持最成熟压缩速度快算法占用资源少。如今哪怕 xz 的压缩率更好、zstd 的速度更快.tar.gz 作为默认选择的地位依然稳固因为兼容性本身就是最大的优势。2.3 后缀速查别被各种压缩算法绕晕实际使用中你会碰到各种后缀我整理了一个速查表遇到不认识的后缀可以对照着看后缀压缩算法特点适用场景.tar.gz / .tgzgzip速度快压缩率适中日常最常用兼容性最好.tar.bz2bzip2压缩率比 gzip 高速度慢追求更小体积时.tar.xzxz压缩率很高速度最慢大型源码包如 Linux 内核.tar.zstzstd速度快压缩率接近 xz近年的新选择部分发行版在用.tar无只归档不压缩打包但不怕占空间其实现在 GNU tar 已经能够根据文件头自动识别压缩格式所以你直接tar -xf anything.tar.xz也能正确解压。不过我还是会显式写上对应的 flag-z、-j、-J等一方面是让命令行自解释另一方面是在某些老系统或非 GNU 环境下更保险。3. 解压命令的完整打开方式3.1 高频命令全家桶把日常最常用的几个命令集中列一下都带注释方便直接抄# 解压最常用 tar -xzf supersonic.tar.gz # 解压到指定目录 tar -xzf supersonic.tar.gz -C /opt/build # 列包内容不解压 tar -tzf supersonic.tar.gz # 打包压缩 tar -czf supersonic.tar.gz supersonic/ # 查看详细过程 tar -xzvf supersonic.tar.gz每个参数的意义都要心里有数-x是 extract 解压-c是 create 创建归档-z是 gzip 压缩/解压-f指定归档文件名-v打印详细过程-C指定工作目录-t只列清单。这里有个新手最容易踩的坑-f必须写在参数组的最后因为它的后面要紧跟文件名。你写tar -xfz supersonic.tar.gz或者把文件名放到别的位置tar 都会报错。另外我见过不少人用tar -xzf supersonic.tar.gz时省略-zGNU tar 在多数版本下也能自动识别但如果你拿到的是.tar.xz却不加-J老版本可能解不出来。所以我的习惯是文件是什么压缩格式就明文写上对应的 flag不赌自动识别。3.2 只解压部分文件与指定目录有时候你不需要把整个包解开只要里面的某几个文件。tar 支持在命令末尾指定要从包里取出的路径# 只解压 README 和配置文件 tar -xzf supersonic.tar.gz supersonic/README.md supersonic/conf/app.ini # 解压时去掉顶层目录 tar -xzf supersonic.tar.gz --strip-components1 -C /opt/app # 用通配符筛选 tar -xzf supersonic.tar.gz --wildcards supersonic/*.conf--strip-components1这个参数在处理包里带一层顶层目录、但你不想保留这层目录的场景下非常实用。比如我把包解压到 /opt/app 下希望 /opt/app/Makefile 直接存在而不是 /opt/app/supersonic-1.0.0/Makefile加了这个参数就不用解压完再mv一次。--wildcards适合批量提取某种类型的文件。需要注意通配符要加引号否则 shell 会先在当前目录里展开结果可能跟预期完全不同。3.3 从解压到重新打包一条龙操作解压不是终点很多人还需要改动之后重新打包。打包命令和创建归档是一个逻辑# 在 supersonic 目录的上一级执行 tar -czf supersonic.tar.gz supersonic/这里有个经验之谈打包时尽量在目标目录的上一级执行用相对路径去指定要归档的目录不要用绝对路径。因为 tar 会忠实记录你给它的路径如果你tar -czf /tmp/supersonic.tar.gz /home/user/project/supersonic/解开之后也会得到一串/home/user/project/supersonic/嵌套路径别人使用时会非常痛苦。打包完成后建议立刻用tar -tzf复查一遍清单确认没有把临时文件比如.o文件、*.log、.DS_Store打进去。如果发现打多了用tar --delete -f supersonic.tar.gz supersonic/tmp.log可以直接从归档里移除指定文件。4. 从源码包到可执行程序supersonic 的编译安装路线4.1 经典三步走configure、make、make install如果你拿到的 supersonic.tar.gz 是一个源代码包解压后目录里通常会有一个configure脚本或者CMakeLists.txt、Makefile。最常见的 autotools 工程安装动作就是三步./configure --prefix/usr/local make -j$(nproc) sudo make install第一步configure会做大量环境检查编译器是否存在、头文件路径对不对、依赖库版本够不够、当前架构是否支持。它最终会生成一个 Makefile里面写死了编译参数和安装路径。--prefix是这里最值得关心的参数它决定了程序最终装到哪里。默认值是/usr/local表示安装到/usr/local/bin、/usr/local/lib这些目录这是用户自编译软件的惯例位置不会污染系统自带的/usr/bin。如果你不想动系统目录可以改成--prefix/opt/supersonic或者--prefix$HOME/.local。第二步make -j$(nproc)是真正编译的过程。-j参数让 make 并行编译后面的数字是同时运行的编译任务数$(nproc)会自动取 CPU 核心数。对大型项目来说不开并行编译可能要等半小时开了之后可能只要几分钟。如果编译中途报错退出先别急着找编译器的问题——八成是缺依赖这个我在下一节细说。第三步make install把编译好的二进制、库文件、文档复制到 prefix 指定的目录。因为要写入系统目录通常需要 sudo。这里有个细节make install之后的产物很难干净卸载因为 Makefile 里的 install 规则只是把文件复制到各个位置不会记录我复制了哪些文件。所以要么自己留好记录要么用DESTDIR方式暂存打包后面我会讲到。4.2 依赖问题才是大头以 e2fsprogs 1.46.6 为例源码编译里真正让人头疼的从来不是编译本身而是依赖。拿热门搜索里提到的 e2fsprogs 1.46.6 来说这个包是 Linux 文件系统工具集包含 mkfs.ext4、fsck、tune2fs 这一堆跟磁盘打交道的关键命令官方就是发布成 tar.gz 源码包需要手动编译安装。我自己编译 e2fsprogs 时碰到的典型报错是configure阶段卡在某一行检查上提示缺 uuid 库的头文件或者 blkid 库。e2fsprogs 依赖这两样东西来生成文件系统 UUID 和识别块设备系统里只有运行时库没有开发版头文件的话configure 就会失败。解决办法是用发行版包管理器装对应的-dev包# Debian/Ubuntu 系 sudo apt install build-essential pkg-config uuid-dev libblkid-dev # RHEL/Fedora 系 sudo dnf install gcc make pkgconfig libuuid-devel libblkid-devel这里面有一个通用的排查思路configure报错时先看它到底卡在哪个 checking for ... 上面。比如checking for uuid_generate in -luuid... no就说明它找到了库但链接不通过那大概率是uuid-dev没装如果checking for gcc... no那就是最基础的编译工具链都没装。多数情况下缺什么装什么九成的 configure 错误都是这么解决的。如果你拿到的 supersonic 不是 C 项目思路类似Python 项目看requirements.txt或pyproject.tomlNode 项目看package.jsonGo 项目看go.mod。不同生态的依赖管理工具不一样但先读 INSTALL / README再动手这个原则是通用的。很多项目把编译依赖和前置条件写得明明白白只是太多人不看文档直接一头扎进 configure 的报错里。4.3 装完之后的收尾工作make install 做完不代表万事大吉还有三件收尾事经常被忽略。第一如果安装的是动态库.so文件需要刷新动态链接器缓存sudo ldconfig否则程序运行时会出现error while loading shared libraries: libsupersonic.so.1: cannot open shared object file这类报错。第二如果--prefix指定了非标准路径别忘了把prefix/bin加进 PATH。比如你用--prefix/opt/supersonic安装那命令行里直接敲 supersonic 是找不到的得写全路径或者改 PATH。同样如果你把库装到/opt/supersonic/lib这种非标准目录还得在/etc/ld.so.conf.d/下面加一个配置文件把路径写进去然后ldconfig。第三提前想好怎么卸载。make uninstall只有部分项目支持。我比较推荐的替代方案是用DESTDIR做个暂存安装方便之后打包成 deb/rpmmake install DESTDIR/tmp/supersonic-stage这样所有安装文件都被放到/tmp/supersonic-stage/usr/local/...下面你可以在暂存目录里检查文件清单确认没问题之后再复制到真实系统或者用这些文件制作安装包。这个技巧在你需要把软件部署到多台机器上时特别省心。5. 解压和编译路上我踩过的坑5.1 磁盘写满编译到一半死掉最尴尬的翻车现场是编译一个大项目编译了二十分钟然后突然刷屏 No space left on device。原因很简单我当初把源码解压到了 /tmp而 /tmp 所在的分区只有几个 GB编译产生的中间文件瞬间就把空间吃光了。这个教训让我养成了三个习惯。第一解压之前df -h先看一眼目标分区第二编译期间如果提示磁盘满检查一下是不是/tmp太小可以用export TMPDIR/big-partition/tmp把编译临时目录指到大分区上再重新编译第三大型项目的中间文件确实很占空间编译完如果不打算调试就用make clean清掉.o文件或者干脆把整个编译目录删了需要用的时候重新解压编译一遍也没多大事。源码包还在编译环境能复现就不怕折腾。5.2 符号链接和路径穿越的风险我在第一节就强调解压前要列清单主要是出于安全考虑。tar 包里的符号链接有隐蔽的风险一个恶意的包可以在里面放一个名为supersonic/lib的符号链接指向/etc然后放一个supersonic/lib/passwd文件解压时就可能覆盖你系统里的文件。更直接的攻击是利用../路径让文件跳出解压目录写到外面的任意位置。防御手段其实不复杂。首先解压到一个专门的空目录里不要直接在 home 或系统目录解压陌生包其次解压后立刻跑一遍find检查有没有指向外部的链接find supersonic/ -type l -exec ls -l {} \;这条命令把包里的所有符号链接都列出来看看它们指向哪里。如果你的包来源是官方发布渠道一般不会有问题但如果是从不正规渠道拿到的多花这几十秒非常值得。我自己作为打包方也会注意打包时用相对路径不用绝对路径这样解压到任何位置都不会污染环境。5.3 归档与清理的好习惯最后分享几个用得上的实操习惯都是吃过亏之后总结的。下载源码包后第一时间校验完整性。发布方通常会给 sha256 哈希值跑一下sha256sum supersonic.tar.gz对比一下能同时确认文件在传输中没有损坏、也没有被掉包。我见过有人解压到一半报错排查半天才发现是下载不完整白白浪费一下午。原始 tar.gz 包保留一份不要解压之后就删。因为你在源码目录里改来改去总会有改乱的时候这时候tar -xzf重新解压一份比在脏目录里不断 revert 要干净得多。编译产生的中间文件占空间但原始压缩包本身很小留着不亏。把整个编译安装流程脚本化。我一般在项目目录放一个build.sh把./configure --prefix...、make -j$(nproc)、sudo make install按顺序写好。这样下次在另一台机器上部署时直接执行脚本不用重新回忆当时用了哪些参数。依赖安装的命令也写进去一条脚本从零开始把环境搭好这才是源码编译的正确打开方式。说实话tar.gz 这东西我几乎每天都在碰但真正让我把上面这套流程固定下来的是踩了不少坑之后。现在无论收到什么包我都会先file确认、再tar -tzf看清单、然后专门建目录解压这三步加起来不到十秒钟却能把后面几小时的麻烦提前干掉。如果你还停留在拿到包就一条 tar -xzf 硬解的阶段我强烈建议把这十秒钟花上。至于源码编译记住 configure 报错别慌先看它卡在哪个 check 上缺什么装什么写清楚参数、留好原始归档这套组合拳打下来再奇怪的 tar.gz 包到你手里也就是十分钟的事。本文还有配套的精品资源点击获取
返回列表