Linux下实用的大文件传输及压缩指南

分享和讨论Linux相关的资讯与内容
头像
BobMaster
锋芒初露
锋芒初露
帖子: 1207
注册时间: 2020年 12月 7日 08:05
来自: 神秘的东方
我的状态: 🎯
为圈友点赞: 349 次
被赞次数: 189 次
联系:

Linux下实用的大文件传输及压缩指南

帖子 BobMaster »

前言

你是否遇到过使用scp/rsync/ftps等依赖SSH的软件下载或上传速度较慢的情况,而使用基于http协议或者其它协议的软件速度比较快。这里我以这样一个例子来分享我一般是怎么解决的: 你有很多文件需要从服务器上下载,但一个一个下载会很慢。

演示环境: Ubuntu 20.04.3 LTS
CPU架构: x86_64

搭建http上传及下载服务

这里可以不开放上传的功能,看个人实际需求。
使用到的项目 miniserve: https://github.com/svenstaro/miniserve
下载地址: https://github.com/svenstaro/miniserve/ ... linux-musl

为什么这里选musl而不是带gnu的二进制可执行文件 原因是ubuntu 20.04.3 的glibc 版本不符合该软件的最低要求,因此采用musl c函数库编译的二进制可执行文件
软件使用方法,这里我直接把项目里的介绍拷贝过来

代码: 全选

For when you really just want to serve some files over HTTP right now!

Usage: miniserve [OPTIONS] [PATH]

Arguments:
  [PATH]
          Which path to serve

          [env: MINISERVE_PATH=]

Options:
  -v, --verbose
          Be verbose, includes emitting access logs

          [env: MINISERVE_VERBOSE=]

      --index <INDEX>
          The name of a directory index file to serve, like "index.html"

          Normally, when miniserve serves a directory, it creates a listing for that directory. However, if a directory
          contains this file, miniserve will serve that file instead.

          [env: MINISERVE_INDEX=]

      --spa
          Activate SPA (Single Page Application) mode

          This will cause the file given by --index to be served for all non-existing file paths. In effect, this will serve
          the index file whenever a 404 would otherwise occur in order to allow the SPA router to handle the request instead.

          [env: MINISERVE_SPA=]

      --pretty-urls
          Activate Pretty URLs mode

          This will cause the server to serve the equivalent `.html` file indicated by the path.

          `/about` will try to find `about.html` and serve it.

          [env: MINISERVE_PRETTY_URLS=]

  -p, --port <PORT>
          Port to use

          [env: MINISERVE_PORT=]
          [default: 8080]

  -i, --interfaces <INTERFACES>
          Interface to listen on

          [env: MINISERVE_INTERFACE=]

  -a, --auth <AUTH>
          Set authentication

          Currently supported formats:
          username:password, username:sha256:hash, username:sha512:hash
          (e.g. joe:123, joe:sha256:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3)

          [env: MINISERVE_AUTH=]

      --auth-file <AUTH_FILE>
          Read authentication values from a file

          Example file content:

          joe:123
          bob:sha256:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
          bill:

          [env: MINISERVE_AUTH_FILE=]

      --route-prefix <ROUTE_PREFIX>
          Use a specific route prefix

          [env: MINISERVE_ROUTE_PREFIX=]

      --random-route
          Generate a random 6-hexdigit route

          [env: MINISERVE_RANDOM_ROUTE=]

  -P, --no-symlinks
          Hide symlinks in listing and prevent them from being followed

          [env: MINISERVE_NO_SYMLINKS=]

  -H, --hidden
          Show hidden files

          [env: MINISERVE_HIDDEN=]

  -S, --default-sorting-method <DEFAULT_SORTING_METHOD>
          Default sorting method for file list

          [env: MINISERVE_DEFAULT_SORTING_METHOD=]
          [default: name]

          Possible values:
          - name: Sort by name
          - size: Sort by size
          - date: Sort by last modification date (natural sort: follows alphanumerical order)

  -O, --default-sorting-order <DEFAULT_SORTING_ORDER>
          Default sorting order for file list

          [env: MINISERVE_DEFAULT_SORTING_ORDER=]
          [default: desc]

          Possible values:
          - asc:  Ascending order
          - desc: Descending order

  -c, --color-scheme <COLOR_SCHEME>
          Default color scheme

          [env: MINISERVE_COLOR_SCHEME=]
          [default: squirrel]
          [possible values: squirrel, archlinux, zenburn, monokai]

  -d, --color-scheme-dark <COLOR_SCHEME_DARK>
          Default color scheme

          [env: MINISERVE_COLOR_SCHEME_DARK=]
          [default: archlinux]
          [possible values: squirrel, archlinux, zenburn, monokai]

  -q, --qrcode
          Enable QR code display

          [env: MINISERVE_QRCODE=]

  -u, --upload-files [<ALLOWED_UPLOAD_DIR>]
          Enable file uploading (and optionally specify for which directory)

          [env: MINISERVE_ALLOWED_UPLOAD_DIR=]

  -U, --mkdir
          Enable creating directories

          [env: MINISERVE_MKDIR_ENABLED=]

  -m, --media-type <MEDIA_TYPE>
          Specify uploadable media types

          [env: MINISERVE_MEDIA_TYPE=]
          [possible values: image, audio, video]

  -M, --raw-media-type <MEDIA_TYPE_RAW>
          Directly specify the uploadable media type expression

          [env: MINISERVE_RAW_MEDIA_TYPE=]

  -o, --overwrite-files
          Enable overriding existing files during file upload

          [env: OVERWRITE_FILES=]

  -r, --enable-tar
          Enable uncompressed tar archive generation

          [env: MINISERVE_ENABLE_TAR=]

  -g, --enable-tar-gz
          Enable gz-compressed tar archive generation

          [env: MINISERVE_ENABLE_TAR_GZ=]

  -z, --enable-zip
          Enable zip archive generation

          WARNING: Zipping large directories can result in out-of-memory exception because zip generation is done in memory
          and cannot be sent on the fly

          [env: MINISERVE_ENABLE_ZIP=]

  -C, --compress-response
          Compress response

          WARNING: Enabling this option may slow down transfers due to CPU overhead, so it is disabled by default.

          Only enable this option if you know that your users have slow connections or if you want to minimize your server's bandwidth usage.

          [env: MINISERVE_COMPRESS_RESPONSE=]

  -D, --dirs-first
          List directories first

          [env: MINISERVE_DIRS_FIRST=]

  -t, --title <TITLE>
          Shown instead of host in page title and heading

          [env: MINISERVE_TITLE=]

      --header <HEADER>
          Set custom header for responses

          [env: MINISERVE_HEADER=]

  -l, --show-symlink-info
          Visualize symlinks in directory listing

          [env: MINISERVE_SHOW_SYMLINK_INFO=]

  -F, --hide-version-footer
          Hide version footer

          [env: MINISERVE_HIDE_VERSION_FOOTER=]

      --hide-theme-selector
          Hide theme selector

          [env: MINISERVE_HIDE_THEME_SELECTOR=]

  -W, --show-wget-footer
          If enabled, display a wget command to recursively download the current directory

          [env: MINISERVE_SHOW_WGET_FOOTER=]

      --print-completions <shell>
          Generate completion file for a shell

          [possible values: bash, elvish, fish, powershell, zsh]

      --print-manpage
          Generate man page

      --tls-cert <TLS_CERT>
          TLS certificate to use

          [env: MINISERVE_TLS_CERT=]

      --tls-key <TLS_KEY>
          TLS private key to use

          [env: MINISERVE_TLS_KEY=]

      --readme
          Enable README.md rendering in directories

          [env: MINISERVE_README=]

  -I, --disable-indexing
          Disable indexing

          This will prevent directory listings from being generated and return an error instead.

          [env: MINISERVE_DISABLE_INDEXING=]

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version
这里我直接贴我比较喜欢用的配置,假设我现在的工作路径为 /home/bobmaster/Downloads
miniserve二进制可执行文件就在该路径下,我想要分享的路径为/home/bobmaster/Downloads/mysharing
我一般会这么运行 miniserve,首先用 screen 创建一个名为miniserve的任务窗口(当然你也可以改为其它名称,这里是没有要求的)避免SSH中断后导致程序退出

代码: 全选

screen -S miniserve
接着使用下面的命令运行 miniserve (如果没有可执行权限,请自行 chmod +x)

代码: 全选

./miniserve -p 10086 -a bobmaster:bobmaster -q -u -D /home/bobmaster/Downloads/mysharing
参数解释:
-p {端口}
-a 用户名:密码
-q 开启二维码分享
-u 开启上传
-D 把文件夹排在最上面
最后一个参数是你要分享的文件夹路径

你会得到类似这样的响应,然后根据内网还是外网访问即可。(如果你不希望将程序直接暴露至外网,可以使用 -i 127.0.0.1 参数)
图片
然后我们按 Ctrl+A+D键将窗口切换至后台
screen简要使用指南 善用Tab键补全!!!
新建窗口: screen -S 窗口名称
列出有多少个窗口: screen -ls
切换至特定窗口: screen -r 窗口名称
终止当前窗口: exit
杀掉某个窗口: screen kill 窗口名称
Ctrl+A+D键 可以将当前激活的窗口转至后台(detach)模式,哪怕SSH关闭了程序照样不会中断,类似功能的还有 tmux 以及 nohup

压缩指南

我们经常会遇到一核有难多核围观的情况,Linux下常用的tar,zip等命令只能使用单个核心,这不利于我们提高压缩的速度,尤其是数据量很大的时候。

好在7z压缩文件可以直接使用所有核心,那还等什么,就决定是你了。
7z 命令介绍: https://linux.die.net/man/1/7z
Debian/Ubuntu可以使用apt安装

代码: 全选

sudo apt install p7zip-full
我们使用下面的命令压缩文件

代码: 全选

7z a 压缩包名称.7z 被压缩的文件夹
参数解释:
a代表添加到压缩包,也就是创建压缩包的命令
-t7z 表示创建7z格式,如果需要创建zip压缩包改为-tzip即可,省略默认为7z格式
倒数第二个参数是压缩包名称
最后一个参数是被压缩文件或文件夹的路径

PS: 这里我们不在乎7z导致的Linux用户组元数据丢失,相比zip等格式7z压缩率更高,传输更节省带宽

压缩好后,将压缩包 move 到我们前面 miniserve 共享的文件夹下即可。

总结

这篇文章介绍了如何应对scp/ftps等依赖SSH隧道的工具传输速度较慢的问题,虽然没有直接解决这些工具的问题,但我们换了一种思路,采用http协议共享文件,7z压缩文件,实现了同样的效果。
上次由 BobMaster 在 2024年 2月 29日 12:21,总共编辑 1 次。
BobMaster 的这篇帖子被以下2个圈友点了赞:
Gnonymous, ejsoon
人生如音乐,欢乐且自由
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

很實用的技巧,其它設備(如手機)在訪問這個內網網址時,是用瀏覽器訪問的嗎?那是否會出現一個上傳/下載的頁面?
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
BobMaster
锋芒初露
锋芒初露
帖子: 1207
注册时间: 2020年 12月 7日 08:05
来自: 神秘的东方
我的状态: 🎯
为圈友点赞: 349 次
被赞次数: 189 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 BobMaster »

ejsoon 写了: 2024年 2月 29日 09:10 很實用的技巧,其它設備(如手機)在訪問這個內網網址時,是用瀏覽器訪問的嗎?那是否會出現一個上傳/下載的頁面?
是用浏览器访问。上传和下载界面是不冲突的,比如你要上传东西,浏览器新开一个页面专门用于上传即可。
人生如音乐,欢乐且自由
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

@BobMaster

其實我覺的7z的使用可以另開一篇,同時,如果是大文件的話,我一般會傾向於分割,比如36M一個7z.001文件。
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

經試用,發現開啟服務之後無法訪問。

換了幾次端口都沒用。

或許是防火牆的問題?
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

果然是防火牆的問題!

如果之前開啟了防火牆,則需要添加開放端口,在Ubuntu裏的命令是:

代码: 全选

sudo ufw allow 端口
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

非常好用!

電腦-手機設備之間互傳文件的首選工具,跨平臺,免安裝。


此前我都主要是用手機開ftp服務,電腦連上,再上傳及下載。

往前,我曾經用22端口,通過sftp,用手機直訪電腦。但是這種方法,不是每次都能連上,還經常斷線,或者傳到一半中止。到後來換了系統ubuntu22.02,就再也無法這樣連了。


現在有了這個,用電腦直接開http服務,躺床上玩手機也能操作電腦文件,確實好玩。
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

補充下,gnu在ubuntu22.04仍然不能運行,或許到24.04才可以?
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

@BobMaster
那麼有沒有像miniserve這樣開ftp服務的軟體?
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
BobMaster
锋芒初露
锋芒初露
帖子: 1207
注册时间: 2020年 12月 7日 08:05
来自: 神秘的东方
我的状态: 🎯
为圈友点赞: 349 次
被赞次数: 189 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 BobMaster »

ejsoon 写了: 2024年 2月 29日 21:28 @BobMaster
那麼有沒有像miniserve這樣開ftp服務的軟體?
我不用ftp,所以没有关注过,等以后看到了再说吧~
人生如音乐,欢乐且自由
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

BobMaster 写了: 2024年 3月 1日 12:37
ejsoon 写了: 2024年 2月 29日 21:28 @BobMaster
那麼有沒有像miniserve這樣開ftp服務的軟體?
我不用ftp,所以没有关注过,等以后看到了再说吧~
好的。

我之前研究了很久,本來linux開個ftp服務和賬號應該是很簡單的,但是始終沒搞出來。

ftp能傳文件夾,以及新建或刪除文件(夾),比http更好用。這個miniserve只能上傳/下載單個文件,多個文件就要用7z壓縮了。
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
BobMaster
锋芒初露
锋芒初露
帖子: 1207
注册时间: 2020年 12月 7日 08:05
来自: 神秘的东方
我的状态: 🎯
为圈友点赞: 349 次
被赞次数: 189 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 BobMaster »

ejsoon 写了: 2024年 3月 1日 14:27
BobMaster 写了: 2024年 3月 1日 12:37
ejsoon 写了: 2024年 2月 29日 21:28 @BobMaster
那麼有沒有像miniserve這樣開ftp服務的軟體?
我不用ftp,所以没有关注过,等以后看到了再说吧~
好的。

我之前研究了很久,本來linux開個ftp服務和賬號應該是很簡單的,但是始終沒搞出來。

ftp能傳文件夾,以及新建或刪除文件(夾),比http更好用。這個miniserve只能上傳/下載單個文件,多個文件就要用7z壓縮了。
网上一搜不是一大把教程么~
https://ubuntu.com/server/docs/service-ftp
人生如音乐,欢乐且自由
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

BobMaster 写了: 2024年 3月 1日 18:25
ejsoon 写了: 2024年 3月 1日 14:27
BobMaster 写了: 2024年 3月 1日 12:37
ejsoon 写了: 2024年 2月 29日 21:28 @BobMaster
那麼有沒有像miniserve這樣開ftp服務的軟體?
我不用ftp,所以没有关注过,等以后看到了再说吧~
好的。

我之前研究了很久,本來linux開個ftp服務和賬號應該是很簡單的,但是始終沒搞出來。

ftp能傳文件夾,以及新建或刪除文件(夾),比http更好用。這個miniserve只能上傳/下載單個文件,多個文件就要用7z壓縮了。
网上一搜不是一大把教程么~
https://ubuntu.com/server/docs/service-ftp
我應該有跟這些教程走過,但是最後都不行…

準備在裝上Ubuntu24.04之後再試一次。
https://ejsoon.win/
天蒼人頡:發掘好玩事物
头像
ejsoon
圈圈精英
圈圈精英
帖子: 2254
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 99 次
被赞次数: 99 次
联系:

Re: Linux下实用的大文件传输及压缩指南

帖子 ejsoon »

https://ejsoon.win/
天蒼人頡:發掘好玩事物
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 7 访客