OpenMediaVault 初始化设置

OpenMediaVault,是一个开源的基于 Debian Linux 的下一代网络附加存储 (NAS) 解决方案。

关于 NAS 系统的选择可以参考这篇文章.

默认用户名和密码

OpenMediaVault 安装后的 Web UI,默认的用户名和密码是:

admin
openmediavault

登陆后进行修改。

ssh 登录

Web UI 的用户名是 admin,但是 SSH 的用户名是 root

安装必要的 package

apt install dnsutils htop

镜像源

如果安装的时候没有选择国内的镜像源,可以手动进行修改:

vi /etc/apt/sources.list

然后使用如下配置:

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-fre

omv-extras

OMV Extras 是一系列的扩展插件,开启后有不少的功能增强。

安装:

wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash

来自:

修改终端 locale

sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales

然后选择

  • en_US.UTF-8 UTF-8
  • zh_CN.UTF-8 UTF-8

这样以后终端就可以显示中文了,同样的道理如果是其他语言找对应的选上即可。

docker mirror

Docker 的安装可以在 OpenMediaVault 的 Web UI 上完成,在安装 OMV Extras 后可以直接启用。国内网络环境不好的情况下,一定先替换上面的源再安装。

编辑 vi /etc/docker/daemon.json:

注意这里微软提供的 Docker 镜像已经限制只能 Azure 的机器使用了,如果使用 azk8s 会返回 403 错误:

Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"

自行替换成 aliyun 或者其他国内厂提供的 registry-mirrors 吧!

{
	"registry-mirrors": [
		"https://registry.azk8s.cn",
		"https://reg-mirror.qiniu.com"
	],
  "data-root": "/var/lib/docker"
}

重启:

/etc/init.d/docker restart

开启 sharedfolders

我全新安装的 OpenMediaVault 5.3.4 中,创建共享文件夹,系统不会自动在 sharedfolders 中创建文件夹,查了一下,发现是 OpenMediaVault 在 5.3.3-1 版本中将 sharedfolders 功能给禁用了,官方的说明 是可能造成不稳定。不过可以通过如下方法手工开启:

Disable the '/sharedfolder/<xyz>' feature by default on new
installations because it makes too much problems.
It can be enabled by setting the environment variable to
'OMV_SHAREDFOLDERS_DIR_ENABLED="YES"'. Finally run the command
'omv-salt stage run prepare' to apply the modified default values
and 'omv-salt deploy run systemd' to create the unit files.

但是我尝试一下之后发现创建共享文件后,sharedfolder 中依然没有,那我就只能手动 ln 了。(注意这里的地址需要换成你自己系统的地址)

ln -s /srv/dev-disk-by-label-storage/appdata /sharedfolders/appdata
ln -s /srv/dev-disk-by-label-storage/ruTorrent/ /sharedfolders/ruTorrent

Transmission

拉取镜像:

docker pull linuxserver/transmission

创建:

docker run -d \
  --name=transmission \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Asia/Shanghai \
  -e USER=user \
  -e PASS=password \
  -e TRANSMISSION_WEB_HOME=/transmission-web-control/ \
  -p 9091:9091 \
  -p 51413:51413 \
  -p 51413:51413/udp \
  -v <path to data>:/config \
  -v <path to downloads>:/downloads \
  -v <path to watch folder>:/watch \
  --restart unless-stopped \
  linuxserver/transmission

ruTorrent

Pull 镜像:

docker pull linuxserver/rutorrent

创建:

docker run -d \
  --name=rutorrent \
  -e PUID=1000 \
  -e PGID=100 \
  -p 8080:80 \
  -p 5000:5000 \
  -p 51415:51413 \
  -p 6881:6881/udp \
  -v /sharedfolders/ruTorrent-config:/config \
  -v /sharedfolders/ruTorrent:/downloads \
  --restart unless-stopped \
  linuxserver/rutorrent

然后根据 这里 的说明改一下主题。

syncthing

docker run -d \
  --name=syncthing \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/London \
  -e UMASK_SET=<022> \
  -p 8384:8384 \
  -p 22000:22000 \
  -p 21027:21027/udp \
  -v </path/to/appdata/config>:/config \
  -v </path/to/data1>:/data1 \
  -v </path/to/data2>:/data2 \
  --restart unless-stopped \
  linuxserver/syncthing

Plex

docker pull linuxserver/plex

安装:

docker run -d \
  --name=plex \
  --net=host \
  -e PUID=1000 \
  -e PGID=1000 \
  -e VERSION=docker \
  -e PLEX_CLAIM= `#optional` \
  -v /path/to/library:/config \
  -v /path/to/tvseries:/tv \
  -v /path/to/movies:/movies \
  --restart unless-stopped \
  ghcr.io/linuxserver/plex

AdGuard Home

在 OpenMediaVault 上安装 AdGuard Home 的时候需要注意,OpenMediaVault 自身的 systemd-resolved 进程监听了 53 端口,和 AdGuard Home 产生了冲突。这个时候需要禁用系统 resolved 的 53 端口监听。

可以使用如下命令修改,也可以手动修改这两行:

sudo sed -i "s/^#Cache=yes/Cache=no/g" /etc/systemd/resolved.conf
sudo sed -i "s/^#DNSStubListener=yes/DNSStubListener=no/g" /etc/systemd/resolved.conf

然后重启进程 systemctl restart systemd-resolved

netstat 来查看 53 端口的占用情况。这个时候再用 Docker 启动 AdGuard Home:

docker run --name adguardhome -v /my/own/workdir:/opt/adguardhome/work -v /my/own/confdir:/opt/adguardhome/conf -p 53:53/tcp -p 53:53/udp -p 67:67/udp -p 68:68/tcp -p 68:68/udp -p 8080:80/tcp -p 443:443/tcp -p 853:853/tcp -p 3000:3000/tcp -d adguard/adguardhome

2020-03-22 openmediavault , nas , operating-system , os , system , linux , open-source

Proxmox 安装和设置

接触虚拟化的过程中慢慢的了解到了 [[Proxmox VE]],在此之前是看到很多人在用 [[ESXi]],一款 VMware 的商业化产品,个人授权是免费的,不过 Proxmox VE 是一个基于 Debian 的开源虚拟化系统,对于我这样的初学者,学习过程要比产品的稳定性来的重要,所以对我个人而言 Proxmox 是一个不错的选择。

Proxmox VE 全称是 Proxmox Virtual Environment 是一个开源的虚拟化解决方案,基于 QEMU/KVM 和 LXC。

Proxmox Virtual Environment is an open source server virtualization management solution based on QEMU/KVM and LXC. You can manage virtual machines, containers, highly available clusters, storage and networks with an integrated, easy-to-use web interface or via CLI. Proxmox VE code is licensed under the GNU Affero General Public License, version 3.

Proxmox VE,是一个开源的服务器虚拟化环境 Linux 发行版。Proxmox VE 基于 Debian,使用基于 Ubuntu 的定制内核,包含安装程序、网页控制台和命令行工具,并且向第三方工具提供了 REST API,在 Affero 通用公共许可证第三版下发行。

Proxmox VE 支持两类虚拟化技术:基于容器的 LXC(自 4.0 版开始,3.4 版及以前使用 OpenVZ 技术) 和硬件抽象层全虚拟化 KVM。

Proxmox 支持的虚拟化:

  • 基于内核的 [[KVM]] (Kernel-based Virtual Machine)
  • 基于容器的虚拟化技术 [[LXC]](Linux Containers)

准备工作

安装 Proxmox VE 之前有几件必须的东西需要准备:

  • Proxmox VE ISO 镜像,[[balenaEtcher]] 安装程序
  • 一个空 U 盘,容量不用太大,也不能小到 Proxmox ISO 文件都放不下
  • 主机 (64 位 CPU,至少 1G 内存,支持 KVM 的主板egrep '(vmx|svm)' /proc/cpuinfo),键盘和显示器(安装过程中需要,安装后就不用了)

安装

和安装其他 Linux 系统一样,先用 Etcher 将 Proxmox VE ISO 写入 U 盘。或者使用 dd 命令:

# dd bs=1M conv=fdatasync if=./proxmox-ve_*.iso of=/dev/XYZ

一定要注意 of 后别写错设备。如果不知道 dd 命令如何使用千万别复制粘贴上面命令。

将 U 盘插入主机,启动硬件,在 BIOS 中选择 U 盘启动,或者使用 F12 或者 F2,或者 DELETE 等等按键选择 U 盘启动。然后在 Proxmox 安装程序中下一步下一步既可,注意安装时输入的局域网 IP 地址,后面需要用该 IP 或者 (hostname) 来访问 Proxmox 的 Web 管理界面。

使用

安装完成后,重启系统,进入 Proxmox VE,等待屏幕显示黑色登录等待命令,可以使用局域网中其他电脑登录:

https://ip:8006

这里有两点需要注意,一定要用 https 访问,我用 http 访问是没有回应的,还重装了一遍,还以为有硬件故障检查了半天,甚至 root 登录进去重启了各种服务,最后发现必须要使用 https 登录;第二点就是输入安装时设置的 IP 地址,加上 8006 端口进行访问。

设置 host

PVE 官方要求设置 /etc/hosts 防止出现问题,可以手动执行 hostnamectl set-hostname pve 将本机 hostname 设置为 pve

127.0.0.1 localhost.localdomain localhost
your.ip pve.domain.com pve

设置更新源

Proxmox 源自于 Debian,所以 Proxmox 也可以用 apt 的包管理。但是 Proxmox 维护了一套自己的软件源,如果没有订阅企业授权,在 apt update 的时候会报错。所以需要注释掉企业的 source list:

vi /etc/apt/sources.list.d/pve-enterprise.list
然后用 # 注释掉其中的地址
# deb https://enterprise.proxmox.com/debian/pve buster pve-enterprise

然后添加非订阅的源,修改 vi /etc/apt/sources.list: 1

# PVE pve-no-subscription repository provided by proxmox.com,
# NOT recommended for production use
deb http://download.proxmox.com/debian/pve buster pve-no-subscription

或者直接创建一个新文件:

echo 'deb http://download.proxmox.com/debian/pve buster pve-no-subscription' >> /etc/apt/sources.list.d/pve-no-subscription.list

国内的 Proxmox VE 软件源镜像:2

deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian buster pve-no-subscription

设置 Debian 国内镜像

Proxmox VE 基于 Debian 的软件源都可以替换成国内的镜像:3

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free

然后更新 apt update,然后升级 apt upgrade

使用 sudo

生产环境中如果不想一直使用 root 账户来管理后台,可以参考官网 用户管理一章节的内容来添加账户,并分配给不同的角色。这一步可以先跳过,等后面部署真正用起来后再配置就行。

安装 sudo

apt install sudo

然后编辑 visudo:

einverne    ALL=(ALL:ALL) NOPASSWD:ALL

BBR

目前的 Proxmox VE 版本的 linux 内核版本比较新,已经包含了 bbr 模块了。

如果没有包含可以使用如下方法:

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
# 验证
lsmod | grep bbr

配置

经过上面的配置 Proxmox 已经处于一个可用的状态。

通过 ISO 镜像安装 Proxmox 后 Proxmox 会自动创建一个 pve 的 Volume Group,并在其上面创建 root, data 和 swap 三个逻辑卷。

默认情况下 Proxmox 会自动创建 local(pve) 和 local-lvm(pve) 这两个 Storage,分别用来存放镜像和磁盘:

  • local 是 Directory 类型,用来存放 VZDump backup file, ISO Images, Container template
  • local-lvm 是 LVM-Thin 类型,用来存放 Disk image, Container

上面两个存储是在 Proxmox 安装后自动创建的,使用 fdisk -l 来看,我的 Proxmox 是安装在了 /dev/sdc 这款 120G 的 SSD 上。

Storage

Proxmox 支持两类文件存储类型:

  • 本地 (ZFS, LVM, Linux 支持的任何文件系统)
  • 网络存储 (NFS, CIFS, iSCSI)

本地的存储类型肯定是最稳定的,但问题也就是空间大小有限制。但假如在万兆局域网中,网络传输造成的瓶颈就不存在了,那么可以创建网络存储,挂载其他设备,比如 NAS 上的文件系统。

建立 Directory

在 GUI 界面中 Disks -> Directory 新建,要注意这里只有没有任何数据,没有任何分区的硬盘才能在菜单中显示,然后看到创建的执行日志:

# /sbin/sgdisk -n1 -t1:8300 /dev/sda
The operation has completed successfully.
# /sbin/mkfs -t ext4 /dev/sda1
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 976754385 4k blocks and 244195328 inodes
Filesystem UUID: rrrrr317-3e7f-4352-bda6-xxxxccde13fb
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
	102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables:     0/29809 done
Writing inode tables:     0/29809 done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information:     0/29809 done

# /sbin/blkid /dev/sda1 -o export
Created symlink /etc/systemd/system/multi-user.target.wants/mnt-pve-sda.mount -> /etc/systemd/system/mnt-pve-sda.mount.
TASK OK

可以看到我创建的 Directory 在 /dev/sda 这款硬盘上,首先 Proxmox 用 sgdisk 创建了一个分区 sda1,然后格式化了该分区为 ext4(这是我在 UI 界面中选择的),最后创建了一个挂载点,Proxmox 中是用 systemd 来管理的,具体可看到硬盘被挂载在了 /mnt/pve/sda 这个地方。

设置 ISO Directory

点击左侧边栏 DataCenter 下默认的 pve 节点,然后在右侧找到 Disks -> Directory ,新建 Directory。

这个时候需要注意,只有当硬盘没有任何数据的时候,才会在这里的菜单中显示。我在安装的时候是用的一块已经划分了分区的 1T 硬盘,所以需要 ssh 到后台,用 fdisk /dev/sda 来将分区删掉才能显示。

设置虚拟机的目录 Volume Group

和 ISO 目录一样,ISO 目录用来存放 ISO 镜像,虚拟机目录则是真正划分给虚拟机用的分区。在 Disks 中选中 LVM,创建 Volume Group。

Benchmark

在安装成功的 Proxmox 系统中可以执行 pveperf 来检查一下 CPU 和其他硬件的性能。

创建 VM 以 OpenMediaVault 为例

右上角创建 Virtual Machine,这里以安装 OpenMediaVault 来举例子。在 OpenMediaVault 下载好镜像 ISO,并上传到 Proxmox 中 local(pve) 中。

General

创建虚拟机的第一步就是给虚拟机起一个名字。PVE 使用数字来标识虚拟机,Name 字段起一个标志性的名字。

OS

在操作系统页面中,在 Storage 中选择刚刚建立的 ISO storage 目录,然后选择刚刚上传的 OpenMediaVault ISO 文件。

默认 Guest OS 会自动识别出对应的版本,下一步即可。

System

默认即可。

Hard Disk

设置硬盘大小,这一块硬盘会划分给 OpenMediaVault 系统,因为 OpenMediaVault 安装后占用体积也非常小,划分 16G 磁盘空间就已经足够。

CPU

设置虚拟机可以使用的 CPU 核心数。

Type 选择 Host,可以提供最好的性能。

Memory

设置内存,OpenMediaVault 内存占用也非常少,动态的设定一个 1G 到 4G 的动态范围。

高级设置中可以设置动态的内存使用范围。

Network

默认

点击既可创建成功。

其他

安装及使用过程中的一些疑问和操作。

如何移除 Storage

在界面中通过如下来移除一个存储:

Datacenter -> Storage -> Remove 选中的内容。

不过需要注意的是如果 GUI 移除了 Storage 定义, mount 文件并不会被删除,如果想要删除 mount 文件,只能通过 SSH 登录后台进行。Proxmox 中每一个 mount 都是由 systemd 管理,可以看到类似如下这样的文件。

假如新建了一个 testxfs 的存储,想要删掉:

cat /etc/systemd/system/mnt-pve-testxfs.mount
[Install]
WantedBy=multi-user.target

[Mount]
Options=defaults
Type=xfs
What=/dev/disk/by-uuid/xxxx6149-ce8f-4e36-94c4-xxxxxxj33e72
Where=/mnt/pve/testxfs

[Unit]
Description=Mount storage 'testxfs' under /mnt/pve

如果想要彻底删除的话,用 rm 把这个文件也删除。4

systemctl disable mnt-pve-testdir.mount
umount /mnt/pve/testdir
rm /etc/systemd/system/mnt-pve-testdir.mount

如何选择存储磁盘格式

在创建磁盘的时候可以选择 Directory, ZFS, LVM, LVM-Thin 等等。

Proxmox Storage types

Directory

Directory 是最常见的文件格式,Proxmox 包括了 ext4,xfs 。更多的文件格式可以参考我之前的文章

Proxmox VE can use local directories or locally mounted shares for storage. A directory is a file level storage, so you can store any content type like virtual disk images, containers, templates, ISO images or backup files.

Directory 可以存储任何的类型。

LVM 和 LVM-Thin

LVM 是 Logical Volume Manager(逻辑卷管理)的简写,是 Linux 环境下对磁盘分区进行管理的一种机制

在 Proxmox 中 只有 LVM 有 Snapshot 快照功能,而 LVM-Thin 是没有的。相反如果建立了 LVM 分区,那么整个分区只能给虚拟机或者容器使用,其他文档是无法放进去的,LVM-Thin 则没有这个限制。5

ERROR 挂载 NFS

在我想挂载 NAS 上 NFS 时,Proxmox 给了这错误,至今无解,不清楚是 NFS 版本不兼容的原因还是其他。

create storage failed: error with cfs lock ‘file-storage_cfg’: storage ‘Network-Proxmox’ is not online (500)

虚拟化技术

简单总结。

OpenVZ

OpenVZ 基于 Linux 内核的操作系统级虚拟化技术。OpenVZ 允许物理服务器同时运行多个操作系统。目前正逐渐被 KVM 代替。

KVM

[[KVM]] 全称是 Kernel-based Virtual Machine,基于内核的虚拟机,

Xen

Xen 是开放源代码虚拟机监视器,由 XenProject 开发,经过十几年时间的发展,目前正逐渐被 KVM 代替。

LXC

[[LXC]] 名字来自于 Linux Containers 缩写,是操作系统级的虚拟化,LXC 是 Linux 内核容器功能的一个用户空间接口。

其他虚拟化系统

VMware ESXi

VMware ESXi 可以直接存取控制底层资源,有效的利用硬件。ESXi 是 VMware 推出的虚拟化系统,对个人的授权是免费的。

Hyper-V

Hyper-V 是以 Hypervisor 为基础的虚拟化技术。适用于 x64 位的 Windows 系统。

Further

  • Proxmox 提供的官方文档
  • Proxmox 官方 Wiki

reference


2020-03-21 proxmox , pve , virtual , virtual-machine

使用 mktorrent 从命令行制作 torrent

一个 torrent 文件,本质上就是按照 BitTorrent 协议制作的一个包含一系列 meta 信息的文本文件,torrent 文件主要包含两部分重要信息,Tracker 信息和文件 meta 元信息。

  • Tracker,就是 BitTorrent 协议中的中心 Trakcer 服务器
  • 文件元信息则是根据目标文件分块,然后索引,Hash 的信息

在制作 torrent 文件时,会根据 BitTorrent 协议对目标文件进行分片,piece length 来表示一个分片,或者一块的大小,通常是 2 的 n 次方,根据目标文件的大小可以选择性的使用不同的 piece length。

  • 2^18, 256 KB,通常用在目标文件在 512 MiB 以下
  • 2^19, 512 KB,通常用在目标文件在 512 MiB - 1024 MiB
  • 2^20, 1024 KB,通常用在目标文件在 1 GB - 2GB
  • 2^21, 2048 KB,通常用在目标文件在 2 GB - 4GB
  • 2^22, 4096 KB,通常用在目标文件在 4 GB - 8GB
  • 2^23, 8192 KB,通常用在目标文件在 8 GB - 16GB
  • 2^24, 16384 KB,通常用在目标文件在 16 GB - 512GB,通常这是日常使用应该用的最大的块大小

通常情况下根据目标文件的大小选择合适的 piece length,如果分片太小就可能造成 torrent 文件过大。选择合适的分片大小,一方面可以减小 torrent 需要保存的元信息,另一方面也减少了对分片的校验耗时,下载时对分片的确认也可以加快。

transmission-cli

如果使用 Transmission 那么 transmission-create 已经充分够用。

如果要使用 transmission-create 需要安装:

sudo apt install transmission-cli

创建一个 torrent:

transmission-create -o path/to/example.torrent --tracker tracker_announce_url --piecesize 2048 path/to/file_or_directory

创建一个私有 Torrent:

transmission-create -p -o path/to/example.torrent --tracker tracker_announce_url --piecesize 2048 path/to/file_or_directory

说明:

  • -p: 私有种子,不使用 DHT
  • -o: 生成 torrent 文件路径
  • -t: tracker 地址
  • -s: 每个文件块大小(kb 单位,普通设置 2048即可)
  • -c: 备注,评论

创建一个带 comment 的 torrent:

transmission-create -o path/to/example.torrent --tracker tracker_url1 -c comment path/to/file_or_directory

mktorrent

或者使用 mktorrent 命令也能够快速的制作 torrent 文件

sudo apt install mktorrent

或者使用源码编译安装:

git clone [email protected]:Rudde/mktorrent.git
cd mktorrent
sudo make
sudo make install

默认会安装到 /usr/local/bin/mktorrent .

使用

查看 man mktorrent 手册,非常容易理解。

mktorrent 1.0 (c) 2007, 2009 Emil Renner Berthing

Usage: mktorrent [OPTIONS] <target directory or filename>

Options:
-a, --announce=<url>[,<url>]* : specify the full announce URLs
                                at least one is required
                                additional -a adds backup trackers
-c, --comment=<comment>       : add a comment to the metainfo
-d, --no-date                 : don't write the creation date
-h, --help                    : show this help screen
-l, --piece-length=<n>        : set the piece length to 2^n bytes,
                                default is 18, that is 2^18 = 256kb
-n, --name=<name>             : set the name of the torrent
                                default is the basename of the target
-o, --output=<filename>       : set the path and filename of the created file
                                default is <name>.torrent
-p, --private                 : set the private flag
-t, --threads=<n>             : use <n> threads for calculating hashes
                                default is 2
-v, --verbose                 : be verbose
-w, --web-seed=<url>[,<url>]* : add web seed URLs
                                additional -w adds more URLs

Please send bug reports, patches, feature requests, praise and
general gossip about the program to: [email protected]

举个例子:

mktorrent -v -p -d -c "Demo comments" -l 18 -a https://some.website/announce.php -o example.torrent path/to/dir_or_file

解释这个命令的含义一个一个选项看即可:

  • -p 标记 torrent 私有,不启用 DHT 和 Peer Exchange,如果不知道后面两个术语,可以参考我之前的文章
  • -d 不写入创建时间
  • -c 后接简短的描述信息
  • -l 18 表示块大小,18 就是 2^18 bytes, 也就是 256kb 一块。如果不设置 -l 选项,默认也是 -l 18
  • -a 后接 announce URLs
  • -o 后接输出的 torrent 文件
  • 最后就是要制作的 torrent 的文件目录或者文件

mktorrent 在 1.1 版本之后添加了 -s 选项

-s                : add source string embedded in infohash

表示添加额外的信息到 torrent 文件中。

web seed

使用 mktorrent 还可以使用 -w 选项来添加 web seed URLs。

Web seeding was implemented in 2006 as the ability of BitTorrent clients to download torrent pieces from an HTTP source in addition to the swarm. The advantage of this feature is that a website may distribute a torrent for a particular file or batch of files and make those files available for download from that same web server; this can simplify long-term seeding and load balancing through the use of existing, cheap, web hosting setups. In theory, this would make using BitTorrent almost as easy for a web publisher as creating a direct HTTP download. In addition, it would allow the “web seed” to be disabled if the swarm becomes too popular while still allowing the file to be readily available.

简而言之就是 Web seed 可以让 torrent 从 HTTP 来源来发布文件。

最后的最后求一枚 Open.CD 的邀请。

reference


2020-03-19 torrent , bittorrent , linux , command

rTorrent 和 ruTorrent 使用

在之前文章总结的常见的 BitTorrent 客户端 中就曾经提及过 rTorrent, rTorrent 是一个 C++ 编写的 BitTorrent 客户端,ruTorrent 是它的其中一个 Web 界面,其他的还有 Flood 等等。

这篇文章就主要总结一下 rTorrent 和 ruTorrent 的使用和一些我使用的主题和插件。

Docker

2021年8月更新

这些天去看 LinuxServer 突然发现它们不再维护更新 rutorrent 的镜像,可以转用 crazy-max 编译的镜像。

或者直接使用我的 docker-compose.yml。先参考 README 修改对应的配置之后,docker-compose up -d

然后我比较喜欢 MaterialDesign 这个 ruTorrent 的主题,如果要使用可以通过下面方法,因为已经映射到了机器的路径,

~/rtorrent/data/rutorrent/themes

所以,直接在该目录中 clone 项目即可。

git clone git://github.com/phlooo/ruTorrent-MaterialDesign.git MaterialDesign

不过需要注意的是,只有重启了 Container 之后才会生效。

docker-compose restart

然后在设置中就可以切换主题了。

失效方法

linuxserver 提供的 ruTorrent 很好用的。

docker pull linuxserver/rutorrent

如果想在该镜像的基础上增加 MaterialDesign 主题可以:

sudo docker exec -it rutorrent /bin/sh
cd /app/rutorrent/plugins/theme/themes/
git clone git://github.com/phlooo/ruTorrent-MaterialDesign.git MaterialDesign
chown -R abc:users MaterialDesign

最近有时间的话给 linuxserver 提一个 PR,先把 issue 提了

ruTorrent themes

MaterialDesign 是当时用 QNAP 上 rtorrent-Pro默认主题,配色非常舒服就一直用着了。

MaterialDesign

ruTorrent Web UI Material Design

ruTorrent Web UI Material Design Settings 如果还选择其他的主题可以看看这个合集

Plugins

File Manager

ruTorrent 还有一些很好用的第三插件,比如 File Manager,可以直接在网页中对文件进行复制,移动,压缩,重命名等。

对 linuxserver rutorrent 的修改

LinuxServer 的 ruTorrent 镜像提供了最基本的 rtorrent 和 ruTorrent 功能,能用,但是不合心意。本来是提了 issue 和 PR 想把 MaterialDesign 主题提交进去的,后来发现 LinuxServer 本来的目的也并不是大二全,而成提供基础,任何人想要个性化或者扩展功能都可以以他们提供的镜像作为基础来扩展。1

所以我想的是在 LinuxServer 提供的 rutorrent 镜像基础上把我常用的功能给集成进去。

MaterialDesign 主题

autodl-irssi

首先要说一下 Irssi, Irssi 是一个发明于 1999 年的基于文本的聊天应用。

autodl-irssi 是一个可以根据 filters 从 IRC announce channel 中自动下载 torrents 的工具。

autodl-rutorrent 则是在 rutorrent 之上的一个插件,但是配置则沿用了 autodl-irssi。

所有的过滤器都定义在 ~/.autodl/autodl.cfg 中。

filemanager

fileshare

rutorrentMobile

适配移动界面:


2020-03-16 bittorrent , tmux , rtorrent , rutorrent , linux , command-line , command

Trello 中使用 butler 进行自动化

Move to Done

Trigger

  • Move to Done

Do


2020-03-12 trello , automation , gtd

番茄工作法

前两天看《软技能》一书作者提到了番茄工作法,回想起上一次接触这个词已经好几年前,虽然日常中也曾经尝试过几次,但都没有坚持下来。看书的过程中我就一直在想没有坚持下来的原因,整理思绪的过程中渐渐的有了一些概念,再结合番茄工作法的基本步骤,我发现遇到了这么几个问题:

  • 目标不够明确,虽然现在我也在用 Trello 做时间管理,但往往发现有些目标无法执行,虽然卡片在那里,但却无法再进一步,又或者是一个非常庞大的目标,比如学习一门语言,行难在可计划的番茄时钟内做到
  • 具体任务不够细分,这一次再读番茄工作法让我印象最深刻的就是番茄工作制定的时间是 25 分钟工作,而这个 25 分钟内只能有一个目标,再接着短暂的休息。我之前一直不太明白为什么是 25 分钟,为什么不是 40 分钟,或者更短,现在我才知道,这个 25 分钟需要和目标结合起来,制定目标的时候就需要知道一个大目标可以细分成多少个小目标,每个小目标能不能在 25 分钟的时间内完成,比如说要写一篇文章,看似可能是一个目标,但实际上应该划分成几个小目标,比如一个 25 分钟时间内收集相关的材料,以及列大纲,再一个 25 分钟的时间内通读相关内容, 最后集中时间来进行书写。而我常常犯下的致命问题就是开头就写,中间穿插着搜索,整理,可能再被其他事情分散注意力,再后就会一直把这个 Task 停留着
  • 而上面这些问题最终导致了我的任务无法被追踪,番茄工作法其中非常重要的一环便是记录你的时间,只有把时间记录下来才能统计,分析,学习,分析其中可能的问题,比如在哪一块耗费了大量的时间,作者举了一个非常简单的例子,他在工作过程中多次发现在遇到 Lambda 表达式时需要现查,在系统性分析后,他集中的花费了几个番茄时钟来学习 Lambda 表达式,之后再遇到的时候便将之前的问题化解了

什么是番茄工作法

番茄工作法是弗朗西斯科·西里洛在 1992 年创立的一个工作方式。Pomodoro 来自于意大利语。

为什么要用番茄工作法

  • 制定时间规划,让时间有迹可循
  • 将复杂问题具体化,细节化
  • 以 25 分钟为短期迭代,建立可持续的计划,休息时安心休息,工作时一心一意

美国一份研究显示,员工在公司,大约 3 分钟被打断一次。研究还表明,在电脑屏幕同时开启的窗口数平均是 8 个,精神病学家爱德华·哈洛威尔创造了名词“注意缺乏特征”(ADT) 来描述这个恶劣的现代生活方式。

并行处理和应对干扰的能力都面临同样的瓶颈:工作记忆的容量有限。每一次干扰都会使我们的大脑工作台上的原始信息丢失。当注意力丢失时,找回它需要付出昂贵的代价。1

番茄计时器的精髓

  • 在一天结束时或者一天早晨,记录,处理和可视化,前一天的时间,以及安排今日。
  • 为每项事情制定时间段,番茄工作法这个时间片段通常是 25 分钟
  • 通过简单易用的工具,专注于真正需要做的事情,番茄工作法只需要一支笔,一个计时器,三张纸(今日待办,活动清单,过程记录)

番茄工作法的几个阶段

  • 计划,从积压的工作中提取最最要的活动,填写到“今日待办”
  • 跟踪,确定今日待办后,执行,每 25 分钟
  • 记录,记录执行过程中,中断的次数
  • 处理,从记录的数据中,提取有效内容,比如处理过程中产生的新想法,或者改善一下减少中断次数
  • 可视化,将记录的信息可视化

减少中断的次数

内部

自己造成的“内部中断”,比如在执行一个番茄时钟时,想要回复邮件,想要上厕所,或者诞生了其他想法。这个时候,不能直接中断,而是应该将新想法或者其他不紧急的事情放到“计划外紧急”中。然后在今日待办当前活动中记录一个撇号,表示一次中断。

如果是因为上厕所而中断的番茄时钟,则需要开启一个新的番茄时钟,来继续。保证番茄时钟的完整性。

外部

别人造成的“外部中断”,应当尽可能的礼貌拒绝。而如果同时面临很多的事情需要立即处理,那么需要立即停止当前的番茄时钟,然后解决当前的事情,之后再开启新的时钟。

  • 告知,“当前正在忙,稍后”
  • 协商,“周五再帮忙处理,可以吗?”
  • 计划,“写下活动,然后为他计划未来的番茄时钟”
  • 答复,按照承诺答复,或者回电

应用的选择

我之前就总结过我选择应用的准则:

  • 跨平台
  • 工具类应用的打开速度
  • 内容类应用的数据可导出,如果不支持导出的话我宁可使用本地代替品

显而易见,选择 Pomodoro 应用的时候必然要考虑到数据的问题。

Pomotodo

KanbanFlow

KanbanFlow = Trello + Pomodoro

将看板和番茄工作法结合。

Pomelloapp

Windows, Mac, Linux

推荐几本书

  • 《软技能》 这是一个程序员写的提升自己的书,和番茄工作法并没有直接相关,但其中表达的思考方式和自我管理的内容值得学习
  • 《番茄工作法图解》书名显而易见

reference

  1. 《泛滥的大脑:信息过载与工作记忆的限度》 


2020-03-09 pomodoro , time-management , todo

常见主板命名规则

最近因为想要组装 NAS,所以简单的了解了一下主板的命名规则。这里将总结一下。

多数厂家遵循一般的规律:

  • 处理器类型
  • 芯片组
  • 芯片类型
  • 基本后缀

芯片组名字由芯片厂商决定,AMD 在发布锐龙后抢了英特尔的命名方式,从低到高端 A320, B350,X370。后来 Intel 推出八代 CPU,只能使用 H310, B360, Z370 方式命名。

芯片的命名也有一定的规律,H 主打低价,B 中档,Z 和 X 系列是高端芯片。Intel 的芯片中如果带 K 的表示能超频,比如 i5-8600K. Z 系列一般可以超频。

芯片组数字 2XX 的支持 7 代 CPU,数字 3XX 支持 8 代 CPU,比如 B360 支持 i3-8100, i5-8500 等等。

华擎

常见的型号比如:

  • A320M-HDV
  • H310M-HDV
  • H310CM
  • B365M-HDV
  • B365M-ITX
  • B365M Phantom Gaming
  • B365M Pro
  • B450

其中 H310M, B356, B450 这些都是芯片组规格,这个名字是由 Intel 来约定的。所以能看到不同厂家会对 H310,或者 B450 都有类似的板子。

比如英特尔八代处理器对应的 B 系列主板是 B360,

后缀规则:

后缀 说明
HDV HDMI+DIV+VGA
ITX 小规格主板 17 * 17cm
ITX/ac 附带 ac 规格无线网卡 ITX 主板

产品系列

华擎 PRO 系列主打性价比,主流型号。

Steel Legend 系列,独立产品线,主打外观及个性化。比如 B450 Steel Legend.

Extreme 中高端电竞,一般后加数字,数字越大越强。

Taichi 定位高端的产品线。

Phantom Gaming 主打家用和电竞。

华硕

列举一下京东上华硕主板的例子:

  • H310M-A
  • B365M-PLUS
  • B360-PLUS
  • B450M-PLUS

说明:

  • A、P、PLUS、AR、K、PRIME 系列是华硕的低端入门型号
  • TUF 特种部队 STRIX 猛禽 中端型号
  • ROG EXTREME WS 工作站 高端型号

主板规格

市面上除了 ITX,还有如下几个常见的主板尺寸:

  • ITX(Mini-ATX,尺寸 17cm * 17cm) 小尺寸
  • M-ATX(Micro-ATX,尺寸 24.4cm * 24.4cm)
  • ATX(尺寸:30.5cm * 24.4cm) 标准尺寸

2020-03-08 主板 , motherboard , computer , asrock , 华擎

命令行的艺术

这些年陆陆续续学习,整理了一些命令,其中也学到了不少,渐渐的才体会到用一行命令带来的效率。于是乎我几乎所有的设备都可以用 SSH 访问,少则有 BusyBox 这些精简的 Unix 工具集,多则就是完整的 Unix 工具集。不说桌面版的 Linux 系统,Android 上可以用 Termux, 路由器上 OpenWrt 自身就带了一些基本的命令,而 NAS 上也可以选择 OpenMediaVault 或者在威联通 上开启 SSH 登录,进入命令行的世界。

以前需要借助 GUI 才能实现的功能后来发现原来命令行是如此简单,比如设备间互联一个 SSH 就能搞定,要传输文件再多一个 scp,或者需要增量备份可以用 rsync,或者如果要找重复的文件,jdupes, rdfind 一系列的命令可以选择,更不用说测网速,测磁盘读写等等了。

The Art lf Command Line

整体性对常见的命令做一些了解,可以参考这个项目:

我之前的文章都是临时想要用到某个功能现查的,浪费了我很多时间,如果早一点看到这一份文档的话就可以省去好多检索的时间。

规划

以后命令总结应该不会再更新了,简单的命令我会提交给 tldr,除非是特别复杂的,有特别多选项的命令,否则就不展开了。

如果以后还会有命令行相关的内容,可能会有这样几类:

  • 像 tmux, sed, awk 这些命令几乎可以用一本书来学习,可能会有一些常用的笔记
  • 命令行合集,比如要实现某个功能有哪些实现方式,比如查找重复的文件,比如查看网速等等

tldr

就像上文所说,简单命令的文章就不再写了,下面就记录下提交到 tldr 的 Pull Request:

更多可以在这里 看到。


2020-03-04 command , command-line , linux , ssh , 命令行

Zeal 离线文档阅读

之前也总结过一篇文章,对比了 Zeal 和 Mac 下的 Dash,不过这么长时间过来,已经熟悉了 Zeal,所以再总结一下 Zeal 的使用技巧。

指定文档搜索

Zeal 最常用的方式就是直接搜索方法名或者类名,但是有的时候本地的文档太多,就会出现很多结果,不同语言,不同内容混在一起。所以在 Zeal 搜索框中可以使用前缀来缩小搜索范围。比如想要搜索 java8 中的 ConcurrentMap 那么就可以输入:

java8: ConcurrentMap

自定义 Docset 路径

默认情况下 Zeal 会使用 ~/.local/share/Zeal/Zeal/docsets 作为 Docset 默认路径,这个路径在 ~/.config/Zeal/Zeal.conf 配置文件中。

  • 可以手动修改上述配置文件
  • 或者在界面中 General 中配置

User generate

用户贡献的 documents.

reference


2020-03-03 zeal , linux , document , offline

TypeScript 初识

最近浏览 GitHub 发现一个有趣的项目 PT Plugin Plus 代码拉下来发现是 TypeScript 语言写的,就顺便了解一下。1 目标很简单,不是为了写 ts 项目,只是为了能看懂项目。

ts in 5 minutes

强类型

在 JavaScript 中,变量是没有类型的,只有运行时赋值了才决定变量的类型(这就是所谓的动态语言),但是 TypeScript 在方法定义的时候可以给参数加上类型校验:

function greeter(person: string) {
    return "Hello, " + person;
}

一旦变量类型不匹配,在编译时就会报错。

Interfaces

TypeScript 使用 interface 来定义对象

	interface Person {
		firstName: string;
		lastName: string;
	}

Classes

ts 支持基于类的面向对象编程,classes 和 interfaces 可以协同工作,

class Student {
    fullName: string;
    constructor(public firstName: string, public middleInitial: string, public lastName: string) {
        this.fullName = firstName + " " + middleInitial + " " + lastName;
    }
}

interface Person {
    firstName: string;
    lastName: string;
}

function greeter(person: Person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}

let user = new Student("Jane", "M.", "User");

document.body.textContent = greeter(user);

TypeScript 中 class 和 interfaces 都可以用来定义对象结构和行为,但是有一些区别:

  • class 可以实例化,创建对象并使用对象的属性和方法,接口只是对对象的结构定义,不能直接实例化对对象
  • class 可以包含属性和方法实现,可以定义构造汉书,访问修饰符;接口智能定义对象结构,不能包含具体实现
  • class 支持继承,多态,通过继承来扩展现有类功能;接口不能继承,但是可以通过多个接口组合来达到类似的效果

handbook

TypeScript

类型

TypeScript 支持 JavaScript 的类型,number, string, structure, boolean 等等,不过 TypeScript 增加了枚举类型。

Boolean

let isDone: boolean = false;

Number

let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;

String

文本是任何一门语言都避免不了的,和 js 一样可以使用双引号和单引号。

let color: string = "blue";
color = 'red';

也可以使用 template strings, 使用反引号 (`) 来框住长文本。

Array

直接声明:

let list: number[] = [1, 2, 3];

或者使用 Array:

let list: Array<number> = [1, 2, 3];

Tuple

元组,用来表达固定长度数组,其他元素不一定类型相同。

定义:

let x: [string, number];

初始化:

x = ["abc", 123];

Enum

枚举类型是 TypeScript 新增加的,用来扩展 number 表达的含义。

enum Color {RED, GREEN, BLUE}
let c: Color = Color.RED;

枚举类型默认从 0 开始,可以手动指定。

enum Color { RED=1, GREEN, BLUE}
enum Color { RED=1, GREEN=2, BLUE=4}

Any

any 类型可以使得开发者可以自行选择使用类型检查,或者不使用。

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean

Void

void 像是 any 类型的反面,void 经常被用来作为方法的 void 返回。

Null and Undefined

在 ts 中,undefined 和 null 都有各自的类型,和 void 一样,null 和 undefined 一般都不自己使用。默认 null 和 undefined 是其他类型的子类型,这意味着可以将 null 和 undefined 赋值给 number.

Never

never 类型表示类型的值永远不会发生。

Object

非原始类型,不是 number, string, boolean, bigint, symbol, null 或者 undefined.

Type assertions

尖括号语法:

let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;

as 语法:

let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

TypeScript 的关键字

let vs var

在 TypeScript 中,varlet 是用于声明变量的关键字,它们有一些重要的区别。

  1. 作用域:使用 var 声明的变量具有函数作用域,而使用 let 声明的变量具有块级作用域。换句话说,var 变量在整个函数内都是可见的,而 let 变量只在声明的块(例如,if 语句块、for 循环块)内可见。
  2. 变量提升:使用 var 声明的变量存在变量提升的特性,即变量可以在声明之前被访问。而 let 声明的变量没有变量提升,必须在声明之后才能访问。
  3. 重复声明:使用 var 可以重复声明同一个变量,而使用 let 在同一个作用域内重复声明同一个变量会导致编译错误。
  4. 全局作用域:在全局作用域中使用 var 声明的变量会成为全局对象(windowglobal)的属性,而使用 let 声明的变量不会成为全局对象的属性。

推荐在 TypeScript 中使用 let 来声明变量,因为它具有更严格的作用域规则,避免了一些潜在的问题。var 主要用于与旧版 JavaScript 代码的兼容性或特定的使用场景。

const

在 TypeScript 中,const 是用于声明常量的关键字。使用 const 声明的变量必须初始化,并且不能再被重新赋值。

使用 const 声明的常量具有以下特点:

  1. 值不能被修改:一旦使用 const 声明了一个变量并赋予初始值,就不能再对其进行重新赋值。尝试重新赋值会导致编译错误。
  2. 块级作用域:与 let 类似,const 也具有块级作用域。它在声明的块(例如,if 语句块、for 循环块)内有效。
  3. 对象属性和数组元素:使用 const 声明的常量可以是对象的属性或数组的元素。虽然不能对整个对象或数组进行重新赋值,但可以修改对象的属性或数组的元素。
const person = {
 name: "John",
 age: 25
};
person.age = 26; // 可以修改对象的属性
const numbers = [1, 2, 3];
numbers.push(4); // 可以修改数组的元素

使用 const 可以提高代码的可读性和可维护性,并且在编译时会进行常量折叠,有助于优化代码执行效率。建议在需要声明不可变的常量时使用 const

reference


2020-03-03 typescript , javascript , web , frontend

电子书

本站提供服务

最近文章

  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。
  • Go 语言编写的网络穿透工具 chisel chisel 是一个在 HTTP 协议上的 TCP/UDP 隧道,使用 Go 语言编写,10.9 K 星星。