使用命令行远程网络唤起主机

在 Linux 下可以通过 etherwake 命令来网络唤醒设备。

sudo apt install etherwake

检查主机是否支持网络远程唤醒

首先检查 BIOS 中设置,Wake on LAN 是否开启。一般在 BIOS > Power Management > “Wake On LAN” 这个选项下。然后重启进入系统,用如下命令查看网卡 eth0 是否开启了 Wake on LAN:

ethtool eth0

输出:

Settings for eth0:
		Supported ports: [ TP ]
		Supported link modes:   10baseT/Half 10baseT/Full
								100baseT/Half 100baseT/Full
								1000baseT/Full
		Supported pause frame use: Symmetric
		Supports auto-negotiation: Yes
		Supported FEC modes: Not reported
		Advertised link modes:  1000baseT/Full
		Advertised pause frame use: Symmetric
		Advertised auto-negotiation: Yes
		Advertised FEC modes: Not reported
		Speed: 1000Mb/s
		Duplex: Full
		Port: Twisted Pair
		PHYAD: 1
		Transceiver: internal
		Auto-negotiation: on
		MDI-X: off (auto)
		Supports Wake-on: pumbg
		Wake-on: g
		Current message level: 0x00000007 (7)
							   drv probe link
		Link detected: yes

结果中可以一眼就看到:

Supports Wake-on: pumbg
Wake-on: g

如果没有看到这个字样,或者是 off 状态,需要手动启动一下:

ethtool -s eth0 wol g

说明:

  • -s NIC, 我这里的 eth0 是网络接口的设备名,根据不同的设备填写不同,可以通过 ifconfig 来查看
  • wol g 表示设置 Wake-on-LAN 选项使用 MagicPacket.

使用命令远程唤醒

在 Linux 下执行如下命令唤醒设备:

sudo apt install wakeonlan
wakeonlan MAC_ADDRESS

或者

etherwake MAC_ADDRESS

可以通过 ping 命令和 arp 命令来获取局域网中的设备 MAC 地址:

ping -c 4 SERVER_IP && arp -n

reference


2020-03-29 cli , wake-on-lan , linux , etherwake , ethernet , network

Cloud-init 初始化虚拟机配置

在安装 Proxmox 后在它的文档中了解到了 cloud-init。所以就来梳理一下。

cloud-init 是什么

cloud-init 运行在 Guest machine 中,并在初始化时将一些自定义的配置应用到 Guest machine 中的应用程序。 cloud-init 最早由 Ubuntu 的开发商 Canonical 开发,现在已经支持绝大多数 Linux 发行版和 FreeBSD 系统。而目前大部分的公有云都在用 cloud-init 初始化系统配置,cloud-init 也支持部分私有云 (KVM, OpenStack, LXD 等等) 1,已经成为了事实上的标准。

当我们在 AWS,或者 Google Cloud 这些公有云中申请计算资源的时候,云服务的提供商总是会叫我们选择一个系统镜像,然后做一些基础设置 (Hostname, SSH key 等等),然后在此基础上进行系统创建。cloud-init 正是在这个背景下诞生,自动化将用户数据初始化到系统实例中。

cloud-init 的主旨是定义一些独立于操作系统的配置,比如 hostname, networking configuration 等等。

特性:

  • 设置默认的 locale
  • 设置 hostname
  • 生成并设置 SSH 私钥
  • 设置临时的挂载点

Boot Stages

cloud-init 对系统的初始化分为这几个阶段

  • Generator
  • Local
  • Network
  • Config
  • Final

Generator

当系统启动的时候,generator 会检查 cloud-init.target 是否需要启动。默认情况下,generator 会启动 cloud-init. 但是如下情况 cloud-init 不会在开机运行:

  • /etc/cloud/cloud-init.disabled 文件存在时
  • 当内核命令发现文件 /proc/cmdline 包含 cloud-init=disabled 时,当在容器中运行时,内核命令可能会被忽略,但是 cloud-init 会读取 KERNEL_CMDLINE 这个环境变量

Local

Local 阶段会在挂载根分区 / 时,立即执行

cloud-init-local.service

Local 阶段的目的是:

  • 查找 local data source
  • 将网络配置应用到本地

大多数情况下,这个阶段就只会做这些事情。它会在 datasource 中查找,并应用网络配置。网络配置可能从这些地方来:

  • datasource: 云端通过 metadata 提供
  • fallback: 通过 dhcp on eth0,在虚拟机内自行通过 DHCP 获取 IP
  • none: 网络配置可以通过 /etc/cloud/cloud.cfg 中配置 network: {config: disabled} 来禁用

如果是该实例的第一次启动,那么被选中的网络配置会被应用,所有老旧的配置都会会清除。

该阶段需要阻止网络服务启动以及老的配置被应用,这可能带来一些负面的影响,比如 DHCP 服务挂起,或者已经广播了老的 hostname,这可能导致系统进入一个奇怪的状态需要重启网络设备。

cloud-init 然后再继续启动系统,将网络配置应用后启动。

Network

在 local 阶段后,网络服务启动后,启动

cloud-init.service

该阶段需要所有的网络配置已经被应用,并且网络在线,然后才会应用所有的 user-data

  • 递归检索任何 #include 或者 #include-once 包括 http
  • 解压缩任何压缩的内容
  • 运行任何找到的 part-handler

该阶段运行 disk_setmounts 模块,可能会分区并格式化任何配置挂载点(比如 /etc/fstab中)的磁盘。这个模块不能再早运行,因为有可能有些信息来源于网络,只有等网络信息获取到后才能执行。比如用户可能在网络资源中提供了挂载点配置信息。

在一些云服务中,比如 Azure,这个阶段会创建可以被挂载的文件系统。

part-handler 也会在这个阶段运行,包括 cloud-config bootcmd

Config

在网络启动后运行:

cloud-config.service

这个阶段只会运行 config 模块,不会对其他阶段产生影响的模块在这里运行。

Final

启动的最后阶段运行:

cloud-final.service

用户登录系统后习惯于运行的脚本在这个阶段运行,包括:

  • 包安装
  • 配置管理的插件 (puppet, chef, salt-minion)
  • 用户脚本(包括 runcmd)

配置文件地址

cloud-init 配置文件在:

/etc/cloud/cloud.cfg
/etc/cloud/cloud.cfg.d/*.cfg

cloud-init 在配置文件 /etc/cloud/cloud.cfg 中定义了各个阶段需要执行的任务,任务以 module 形式组织。 cloud.cfg 中指定了 set_hostname 这个 module, 则表示 cloud-init 会执行设置 hostname 的任务,但是具体设置的内容由 metadata 指定。

cloud-init 的日志在:

/var/log/cloud-init-output.log: 每一个阶段的输出
/var/log/cloud-init.log: 每一个操作更详细的调试日志
/run/cloud-init: contains logs about how cloud-init decided to enable or disable itself, as well as what platforms/datasources were detected. These logs are most useful when trying to determine what cloud-init ran or did not run.

数据存放在:

/var/lib/cloud

reference


2020-03-28 proxmox , virtual , virtual-machine , cloud-init , ubuntu , linux , openstack

BitTorrent 协议中的 BenCode 编码

在了解 BitTorrent 协议的时候,想着 .torrent 文件是如何生成的,所以就找了几个 CLI,比如 transmission-climktorrent这两个开源的制作 torrent 文件的开源项目,发现他们就是按照一种约定的格式来生成文件。而这个约定的结构中就少不了现在要谈的 BenCode 编码。

What is BenCode

BenCode 是用于编码 torrent 文件的一种编码格式。BenCode 支持四种数据类型:

  • 字符串
  • 整数
  • 数组
  • 字典

需要注意的是 BenCode 只用 ASCII 字符进行编码,如果是非 ASCII 码,BenCode 会用一种编码方式将其转换成 ASCII 码。

字符串

在编码字符串时 BenCode 选择将字符长度编码在其中:

<Length>:<Content>

比如 6:string 就表示 string 本身。

整数

整数编码时在前后加 ie,比如:

i123e

表示整数 123 . 这种方式也可以表示负数:i-1e.

数组

列表前后用 le 标识。列表中的元素可以是 BenCode 支持的任何一种类型。比如要编码字符串 content 和数字 42:

l7:contenti42ee

注意这里每个类型的边界都有定义清楚。字符串可以用长度来限定边界,但是整数一定需要 ie 来限定边界。

字典

字典类型可以保存一对一的关系,在 BenCode 中 KEY 必须为字符串类型,而 VALUE 可以是 BenCode 支持的任意一种类型。字典编码时用 de 限定范围。

另外需要注意,字典中 KEY 和 VALUE 必须相邻,字典依照 KEY 的字母序排序。

比如要定义 “name” -> “Ein Verne”, “age” -> 18, “interests” -> [“book”, “movie”]

首先要到 KEY 进行排序 “age”, “interests”, “name”

3:age9:Ein Verne
9:interestsi18e
4:namel4:book5:moviee

然后把上面的 KEY VALUE 连接起来,并在前后加上字典的 de 限定。

d3:age9:Ein Verne9:interestsi18e4:namel4:book5:movieee

torrent 文件

在了解了 BenCode 的编码后,用纯文本文件打开 .torrent 文件就能知道一二了。本质上 torrent 文件就是一个用 BenCode 编码的纯文本文件,torrent 在 BitTorrent 协议中又被称为 metainfo。

metainfo 是一个 BenCode 编码的字典:

announce
	tracker 的地址
info
	字典,单文件和多文件略有不同

torrent 文件中的所有字符串必须是 UTF-8 编码的。

单文件

我在本地新建了一个 README.md 文件,然后用如下命令创建一个 torrent 文件 “test.torrent”.

mktorrent -a http://announce.url -c "This is comments" -l 18 -o "test.torrent" -p -v README.md

然后查看 test.torrent 内容:

d8:announce19:http://announce.url7:comment16:This is comments10:created by13:mktorrent 1.013:creation datei1585360743e4:infod6:lengthi5e4:name9:README.md12:piece lengthi262144e6:pieces20:h7@xxxxxlxx]7:privatei1eee

拆解这个编码,先分段开。

d
 8:announce -> 19:http://announce.url
 7:comment -> 16:This is comments
 10:created by -> 13:mktorrent 1.0
 13:creation date -> i1585360743e
 4:info
  d
   6:length -> i5e
   4:name -> 9:README.md
   12:piece length -> i262144e
   6:pieces -> 20:h7@xxxxxxxxx
   7:private -> i1e
  e
e

拆解后可以看到 info 字典中有这么几项:

  • length 指的是整个文件的大小
  • name 下载的文件名
  • piece length 整数,BitTorrent 文件块大小
  • pieces 字符串,连续存放所有块的 SHA1 值,每一个块的 SHA1 值长度都是 20,这里因为文件本身比较小所以只有一块
  • private 整数,标记 torrent 是否私有

注:pieces 中有些特殊字符,在文章中用其他字符替换了。

多文件

多文件时 info 字典中会有一个 files 列表,这个列表由字典组成,每一个字典中是文件的内容,包括文件名和文件长度。

比如对当前文件夹下 README.mdREADME1.md 两个文件制作 torrent.

mktorrent -a http://announce.url -c "This is comments" -l 18 -o "test.torrent" -p -v .

得到的 torrent 文件:

d8:announce19:http://announce.url7:comment16:This is comments10:created by13:mktorrent 1.013:creation datei1585361538e4:infod5:filesld6:lengthi5e4:pathl9:README.mdeed6:lengthi0e4:pathl10:README1.mdeee4:name1:.12:piece lengthi262144e6:pieces20:rhr7r@rorrrlrrrrrrrr7:privatei1eee

拆解一下:

d
 8:announce -> 19:http://announce.url
 7:comment -> 16:This is comments
 10:created by -> 13:mktorrent 1.0
 13:creation date -> i1585361538e
 4:info ->
  d
   5:files -> l
               d
			    6:length -> i5e
			    4:path -> l 9:README.md e
			   e
			   d
			    6:length -> i0e
			    4:path -> l 10:README1.md e
			   e
			  e
   4:name -> 1:.
   12:piece length -> i262144e
   6:pieces -> 20:rhrxxxxxxxxrrrrrr
   7:private -> i1e
  e
e

多文件时 info 字典中的内容稍微多一些。

  • files 是多个文件的信息,其中包括了文件长度和路径。

reference


2020-03-28 bittorrent , bencode , encode , encoding

Proxmox 设定直通硬盘

之前的文章讲了 Proxmox 的安装,以及在此基础上又安装了 OpenMediaVault,现在我的机器上一共三块硬盘,120 G SSD 安装了系统,并作为默认的 lvm,放一些 ISO,以及存放一些系统盘,另外的 1T 准备做 Proxmox 相关的数据盘,而剩下的一块 4T 盘想要直通给 OpenMediaVault 做数据盘。所以就产生了这样的一个需求。

首先在设定之前,需要知道 Linux 下的硬盘都会以文件方式存放在 /dev/disk/by-id/ 目录下。

查看硬件设备

安装:

apt install lshw

查看:

lshw -class disk -class storage

在输出的一串中,找到想要直通的硬盘 Serial,这一步一般也可以通过 Proxmox 后台 Disk 来查看到。比如我的情况是第一块硬盘 /dev/sda 然后假设 Serial 是 WFN1XXXX.

那么过滤出该硬盘:

ls -al /dev/disk/by-id |grep WFN1XXXX

然后添加到具体 ID 的 KVM 虚拟机。

qm set 100 -scsi2 /dev/disk/by-id/ata-ST4000DM004-2CV104_WFN1XXXX

这里 100 是我的 OpenMediaVault 虚拟机的 ID,后面是硬盘的位置。这里的参数 -scsi2 表示的是使用 SCSI 的第二块硬盘,如果你要加多块硬盘,数字 2 需要往后加 -scsi3 这样。

检查是否配置成功

在上面添加到虚拟机之后,可以在 Proxmox 界面中查看,或者用命令:

grep "WFN" /etc/pve/qemu-server/100.conf

理论上应该输出 scsi2 然后后面是硬盘的位置及编号。

然后就能在 OpenMediaVault 中识别出该硬盘了。

SCSI vs VIRTIO

上面 qm 命令中用了 -scsi2 这里指的是磁盘总线类型 (scsi) 和编号 (2),目前磁盘总线类型大致上有这么几种:

  • IDE - Slow Write in the Guest System
  • SCSI - Faster Write(as IDE) in Guest System
  • VIRTIO - Fastest Write (more that SCSI and IDE) in the Guest System, but only with extra Drivers (In Guest)

reference


2020-03-22 proxmox , virtual , linux , debian

OpenMediaVault 设置

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

镜像源

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

omv-extras

安装:

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

docker mirror

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

{
	"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

ruTorrent

Pull 镜像:

docker pull dockerhub.azk8s.cn/linuxserver/ruTorrent

创建:

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

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


2020-03-22

Proxmox 安装和设置

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

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 之前有几件必需品:

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

安装

和安装其他 Linux 系统一样,先用 Etcher 将 Proxmox 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,等待屏幕显示黑色登录等待命令,可以使用局域网中其他电脑登录:

https://ip:8006

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

设置更新源

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 镜像:2

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

设置 Debian 国内镜像

Proxmox 基于 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) ALL

配置

经过上面的配置 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

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

General

PVE 使用数字来标识虚拟机,Name 字段起一个标志性的名字。

OS

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

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

System

默认即可。

Hard Disk

设置硬盘大小, 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

从命令行制作 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

mktorrent

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

sudo apt install mktorrent

或者使用源码编译安装:

git clone git@github.com: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: esmil@users.sourceforge.net

举个例子:

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 的文件目录或者文件

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 来源来发布文件。

reference


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

rTorrent 和 ruTorrent 使用

就和之前文章写的那样 , rTorrent 是一个 C++ 编写的 BitTorrent 客户端,ruTorrent 是它的其中一个 Web 界面,其他的还有 Flood 等等。

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

Docker

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

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


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

常见主板命名规则

最近因为想要组装 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 工作站 高端型号

2020-03-08 主板 , 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 , 命令行

电子书

最近文章

  • 使用命令行远程网络唤起主机 在 Linux 下可以通过 etherwake 命令来网络唤醒设备。
  • Cloud-init 初始化虚拟机配置 在安装 Proxmox 后在它的文档中了解到了 cloud-init。所以就来梳理一下。
  • BitTorrent 协议中的 BenCode 编码 在了解 BitTorrent 协议的时候,想着 .torrent 文件是如何生成的,所以就找了几个 CLI,比如 transmission-cli 和 mktorrent这两个开源的制作 torrent 文件的开源项目,发现他们就是按照一种约定的格式来生成文件。而这个约定的结构中就少不了现在要谈的 BenCode 编码。
  • Proxmox 设定直通硬盘 之前的文章讲了 Proxmox 的安装,以及在此基础上又安装了 OpenMediaVault,现在我的机器上一共三块硬盘,120 G SSD 安装了系统,并作为默认的 lvm,放一些 ISO,以及存放一些系统盘,另外的 1T 准备做 Proxmox 相关的数据盘,而剩下的一块 4T 盘想要直通给 OpenMediaVault 做数据盘。所以就产生了这样的一个需求。
  • OpenMediaVault 设置 OpenMediaVault,是一个开源的基于 Debian Linux 的下一代网络附加存储 (NAS) 解决方案。