完整了解tar的使用及其有意思的花活

常用参数主要的操作模式(只能用一个)-c/--create 创建 tar 文件--delete 从 tar 文件中删除某个文件-r/--append 往 tar 文件尾部追加文件-u/--update 更新 tar 文件中的文件-t/--list 查看 tar 文件中的文件-x/--extract/

常用参数

主要的操作模式(只能用一个)

  • -c/--create 创建 tar 文件
  • --delete 从 tar 文件中删除某个文件
  • -r/--append 往 tar 文件尾部追加文件
  • -u/--update 更新 tar 文件中的文件
  • -t/--list 查看 tar 文件中的文件
  • -x/--extract/--get 从 tar 文件解压文件

解压缩选项

  • -z/--gzip/--gunzip/--ungzip 过滤gzip方式压缩的文件(.tar.gz/.tgz)
  • -j/--bzip2 过滤bzip2方式压缩的文件(.tar.bz2)
  • -J/--xz 过滤xz方式压缩的文件(.tar.xz/.txz)
  • -Z/--compress/--uncompress 过滤compress方式压缩的文件

其他选项

-f/--file=ARCHIVE 操作的 tar 文件路径,此参数后必须跟文件路径名

  • -f - 操作对象在标准输入/输出

-C/--directory 操作目录/解压后文件放置的目录

-v:显示所有过程

-O:将文件解开后,将内容打印到标准输出

TLDR

创建 tar 文件

# 创建 tar 包
tar cvf xx.tar /tmp/1.txt /tmp/2.txt
# 创建使用 gzip/uncompress/bzip2/xz 压缩过 tar 包
tar czvf xx.tar.gz /tmp/1.txt /tmp/2.txt
tar cZvf xx.tar.Z /tmp/1.txt /tmp/2.txt
tar cjvf xx.tar.bz2 /tmp/1.txt /tmp/2.txt
tar cJvf xx.tar.xz /tmp/1.txt /tmp/2.txt

粗略测试下压缩的效果和压缩的时间,tar.Z 的没创建成功,每种不同的压缩方式运行的时间也不尽相同

粗略结论:gzip/bz2 压缩是比较折中的选项,压缩后的大小还行,时间也能接受
# 压缩所用的时间排序 xz > bz2 > gz > none
$ time tar cf hi.tar file1 file2 dir1
tar cf hi.tar file1 file2 dir1  0.01s user 0.25s system 95% cpu 0.277 total

$ time tar czf hi.tar.gz file1 file2 dir1
tar czf hi.tar.gz file1 file2 dir1  5.66s user 0.39s system 103% cpu 5.867 total

$ time tar cJf hi.tar.xz file1 file2 dir1
tar cJf hi.tar.xz file1 file2 dir1  62.73s user 1.15s system 100% cpu 1:03.42 total

$ time tar cjf hi.tar.bz2 file1 file2 dir1
tar cjf hi.tar.bz2 file1 file2 dir1  15.90s user 0.35s system 99% cpu 16.277 total

# 压缩后的大小排序 none > gz > bz2 > xz
$ ls -lh hi.tar hi.tar.bz2 hi.tar.gz hi.tar.xz
-rw-rw-r-- 1 ubuntu ubuntu 196M Jan  5 14:14 hi.tar
-rw-rw-r-- 1 ubuntu ubuntu 105M Jan  5 14:13 hi.tar.bz2
-rw-rw-r-- 1 ubuntu ubuntu 109M Jan  5 14:14 hi.tar.gz
-rw-rw-r-- 1 ubuntu ubuntu  99M Jan  5 14:12 hi.tar.xz

解压 tar 文件

# 一拳超人
tar xvf xx.tar/xx.tar.gz/xx.tar.xz/xx.tar.bz2/xx.tar.Z
# 或者画蛇添足
tar xvf xx.tar
tar xzvf xx.tar.gz
tar xZvf xx.tar.Z
tar xjvf xx.tar.bz2
tar xJvf xx.tar.xz

解压 tar 文件中的某一个文件

tar -xf archive.tar.xz file1 dir2

解压其他压缩文件

# 解压 rar, 可能需要先安装 sudo apt install -y unrar
unrar e file.rar
# 解压 zip
unzip file.zip
# 解压 gzip
gzip/gunzip -d file.gz
# 解压 bzip2
bzip2/bunzip2 -d file.bz2
# 解压 Z
uncompress -d file.Z
# 解压 xz
xz -d file.xz

查看 tar 包内容,加 v 可以看到权限、用户等详细信息。

tar tvf source.tar

添加新文件(压缩后的不能追加)

tar rvf target.tar appended-file.txt

整花活

从 Pod 中拷贝数据时,可能会用到 kubectl cp,但是执行这个命令,在目标容器中必须存在 tar 命令,也就是它依赖于 tar 命令来实现拷贝功能。有几个比较有意思的命令:

  1. 本地 -> Pod
tar cf - /tmp/foo | kubectl exec -i -n <some-namespace> <some-pod> -- tar xf - -C /tmp/bar
  1. Pod -> 本地
kubectl exec -n <some-namespace> <some-pod> -- tar cf - /tmp/foo | tar xf - -C /tmp/bar

通过标准输入/输出来传递要拷贝的文件/目录,这花活整得挺秀。尝试着整了一些其他类似的花活:

# 想直接输出到 terminal,失败了
$ tar cjf - a.txt b.txt
tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now

# 创建压缩的 tar 包
tar cjf - a.txt b.txt > hi.tar.bz2

# 输出压缩后的 tar 包内容
tar cjf - a.txt b.txt | cat

# 创建后查看内容(太搞笑了)
$ tar cjf - a.txt b.txt | tar tjvf -
-rw-rw-r-- ubuntu/ubuntu  1174 2022-12-13 14:09 a.txt
-rwxrwxr-x ubuntu/ubuntu  2623 2022-12-22 09:46 b.txt

还找到一个下载 kernel 代码时的用法,优雅~

curl https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.3.tar.xz | tar xJf -

Read more

容器镜像(4):镜像的常用工具箱

容器镜像(4):镜像的常用工具箱

前几篇在讲多架构镜像时已经用过 skopeo 和 crane 做镜像复制,这篇系统整理这两个工具的完整能力,同时介绍几个日常操作镜像时同样好用的工具。 一、skopeo:不依赖 Daemon 的镜像瑞士军刀 skopeo 的核心价值是绕过 Docker daemon,直接与 Registry API 交互。上一篇用它做镜像复制和离线传输,但它的能力远不止于此。 1.1 安装 # Ubuntu / Debian sudo apt install -y skopeo skopeo --version # skopeo version 1.15.1 1.2 inspect:免拉取检查镜像元数据 docker inspect 需要先把镜像拉到本地,skopeo inspect 直接向 Registry

容器镜像(3):多架构镜像构建

容器镜像(3):多架构镜像构建

一、什么是多架构镜像 1.1 OCI Image Index 上一篇介绍了单平台镜像的结构:一个 Manifest 指向 Config 和若干 Layer blob。多架构镜像在此之上多了一层——OCI Image Index(也叫 Manifest List),是一个轻量的索引文件,把多个单平台 Manifest 组织在一起: $ docker manifest inspect golang:1.22-alpine { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests&

容器镜像(2):containerd 视角下的镜像

容器镜像(2):containerd 视角下的镜像

一、为什么需要了解 containerd 如果你只用 docker run 跑容器,从来不关心底层,那可以不了解 containerd。但如果你在用 Kubernetes,或者想真正理解"容器运行时"是什么,containerd 是绕不开的。 事实上,当你执行 docker run 的时候,containerd 早就在后台悄悄工作了——Docker 从 1.11 版本开始,就把核心运行时剥离出来交给 containerd 负责。 1.1 Docker 的架构演变 早期的 Docker(1.10 及之前)是一个"大一统"的单体程序:一个 dockerd