在 Ubuntu 18.04 网络配置中,某一次升级之后就发现网络配置中心里面少了有线网络配置。
为了恢复有线网络配置,需要手动修改 NetworkManager 的配置文件。
首先查看 interfaces 文件中内容。
❯ sudo cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
确保该配置文件正确。
然后修改 NetworkManager.conf 文件
sudo vi /etc/NetworkManager/NetworkManager.conf
将文件中的 :
managed=false
修改为
managed=true
然后修改 10-globally-managed-devices.conf
配置文件,添加有线设备:
sudo vi /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
修改为:
[keyfile]
unmanaged-devices=*,except:type:ethernet,except:type:wifi,except:type:wwan
注意其中的 except: type: ethernet
这一部分。
最后重启 NetworkManager
sudo service network-manager restart
最后就能够在网络配置中心中手动配置有线网络连接。
在之前看 Perfect Media Server 的时候看到作者有推荐一本叫做 《Infrastructure as Code》, O’REILLY 出品,作者描述了一个使用文本文件来定义基础设施的框架。在没有了解到这个概念之前我只是简单了解过 [[Ansible]] 这个代码即配置的应用,也就是定义了软件的配置,而 [[Terraform]] 则更像是用纯文本(代码)定义了硬件配置。
这句话让我茅塞顿开:
Infrastructure as Code
在过去很长的一段时间里面,我都保存我使用的 docker-compose
配置文件,这样使得我无论拿到哪一台机器都可以快速的恢复之前的服务,这都依赖于这些年 Docker 的兴起。
Infrastructure as Code - Ansible Terraform https://t.co/RlqVlXGUCk
— Ein Verne (@einverne) October 22, 2021
管理配置文件的方式就和代码开发一样,像 Ansible 和 Terraform 这样的工具可以将对基础设施的配置完全配置化。使用 Terraform 来创建基础设施,而使用 Ansible 来配置。想象一下如果有一台全新的 Ubuntu,可以通过一行配置,在几分钟之内就可以恢复到一个可用的环境,这远比维护很多 bash 脚本来的方便。
[[Terraform]] 是一个安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。Terraform 由 HashiCorp 创立并开源,Terraform 提倡「基础架构即代码」的哲学。它的口号是「Write,Plan,and Create Infrastructure as Code」。
Terraform 是一种声明式编码工具,让开发人员通过 HCL(HashiCorp 配置语言)来描述运行应用程序的最终状态环境。
Terraform is a tool to express the nuts of bolts of infrastructure as code. Think VMs, load balancers, storage, DNS, etc defined as code and stored in versioned source control.
在没有 Terraform 之前,运维人员需要手动定位对基础硬件进行管理,在有了 Terraform 之后运维人员也可以通过文本来定义硬件资源的分配,并让 Terraform 去管理资源的分配问题。
Terraform 特点:
Ubuntu:
sudo apt install terraform
Ubuntu 下安装:
sudo wget https://releases.hashicorp.com/terraform/0.12.18/terraform_0.12.18_linux_amd64.zip
sudo unzip terraform_0.12.18_linux_amd64.zip
sudo mv terraform /usr/local/bin/
macOS:
brew install terraform
安装完成后命令是 terraform
。常用的是 terraform init, terraform plan, terraform apply
更多安装方式可以参考官网
Terraform 的配置文件以 .tf
为后缀,配置文件有两种格式:
.tf.json
结尾.tf
结尾配置文档
Terraform 配置,将按照字母顺序加载指定目录中的配置文件。
配置举例:
provider "aws" {
region = "us-east-1"
access_key = "your-access-key-here"
secret_key = "your-secret-key-here"
}
resource "aws_s3_bucket" "b" {
bucket = "my-tf-test-bucket"
acl = "private"
tags = {
Name = "My bucket"
Environment = "Dev"
}
}
provider
部分指定了使用什么 provider,通过指定 access_key 和 secret_key 来访问资源。
aws_s3_bucket
表示的是配置 S3 Bucket 资源,更多的资源配置方式可以参考这里
如果指定的 my-tf-test-bucket
不存在的话,terraform apply
会创建。
在执行 apply
等命令之前需要先初始化工作目录:
terraform init
执行后,会在当前目录中生成 .terraform
目录,并按照 *.tf
文件中的配置下载插件。
可以使用 terraform plan
命令预览执行计划。
执行 terraform apply
会根据配置应用,并生效。
Terraform 执行时会读取所有 *.tf
命令
provider.tf -- provider 配置
terraform.tfvars -- 配置 provider 要用到的变量
varable.tf -- 通用变量
resource.tf -- 资源定义
data.tf -- 包文件定义
output.tf -- 输出
Terraform 配置语法称为 HashiCorp 配置语言,简称 HCL。 语法说明可以参考如下: https://www.terraform.io/docs/configuration/syntax.html
示例:
# An AMI
variable "ami" {
description = "the AMI to use"
}
/* A multi
line comment. */
resource "aws_instance" "web" {
ami = "${var.ami}"
count = 2
source_dest_check = false
connection {
user = "root"
}
}
http://hashivim.github.io/vim-terraform/
可以安装 hashivim/vim-terraform 插件,在 Vim 中实现 HCL 语法加亮。写好的 *.tf
文件后可以调用 terraform fmt 对配置文件进行格式化。
之前购买的 So you Start(OVH 旗下品牌) 的独服,配置有 4 块 2T 的硬盘,但是 So you Start 后台默认的 RAID 级别是 RAID1,这样使得可用的空间只有 8T 中的 2T,25% 的使用率,虽然硬盘安全性级别比较高(允许多块硬盘损坏的情况下依然不丢数据),但是空间可用率太低了,所以折中一下可以使用 RAID-10(允许一块硬盘损坏而不丢失数据),这里就记录一下如何把 So you Start 的独服从 RAID-1 级别在线调整成 RAID-10。正常情况下 OVH 旗下的主机品牌,包括 OHV,So you Start, Kimsufi 都可以适用本教程,其他独服的操作也类似。
主要分成后面几个步骤(具体的操作步骤和演示可以参考后文):
mdadm /dev/md1 --fail /dev/sdc1
mdadm /dev/md1 --remove /dev/sdc1
wipefs -a /dev/sdc1
mdadm --grow /dev/md1 --raid-devices=2
first think about a partitioning scheme. usually there is no need to absolutely put everything on a single large partition. proxmox for instance puts disk images and whatnot into /var/lib/vz which then is an ideal mount point for a split partition.
首先在 So you Start 后台管理面板中使用 Reinstall 重新安装系统。
/
然后留一定空间给 swap
。比如我的机器是 32G 的,可以给 16G swap,然后剩余的空间都划给 /
。如果熟悉 Linux 的分区,并且想要自己定义剩下的空间给 RAID-x,或 ZFS,或 LVM,可以划分一个比如 2G 给 /boot
分区,然后划分240G 给 /
然后 16G 给 swap
,之后可以把 /
从 RAID1 调整为 RAID10安装完成进入系统:
debian@pve:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
重新调整 RAID 级别。需要特别感谢 LET 上面的 Falzo 根据他所提供的详细步骤我才完成了 RAID1 到 RAID10 的在线调整。
大致的步骤需要先将 RAID1 调整为 RAID0,然后在调整为 RAID10.
首先来查看一下默认的 RAID 信息:
root@pve:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda2[0] sdc2[1] sdd2[3] sdb2[2]
511868928 blocks super 1.2 [4/4] [UUUU]
bitmap: 2/4 pages [8KB], 65536KB chunk
unused devices: <none>
可以看到有一个 md2 RAID,使用了 raid1,有四个分区分别是 sda2, sdc2, sdd2, sdb2 组合而成。
查看硬盘信息(模糊掉敏感的一些标识信息):
root@pve:~# fdisk -l
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: HGST HUS7-----AL
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B411C4C1-EA13-42F1-86D8-DC-------115
Device Start End Sectors Size Type
/dev/sdb1 2048 1048575 1046528 511M EFI System
/dev/sdb2 1048576 1025048575 1024000000 488.3G Linux RAID
/dev/sdb3 1025048576 1058603007 33554432 16G Linux filesystem
Disk /dev/sdc: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: HGST HUS7-----AL
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: DA108B72-B409-4F9E-8FF1-0D---------8
Device Start End Sectors Size Type
/dev/sdc1 2048 1048575 1046528 511M EFI System
/dev/sdc2 1048576 1025048575 1024000000 488.3G Linux RAID
/dev/sdc3 1025048576 1058603007 33554432 16G Linux filesystem
Disk /dev/sdd: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: HGST HUS-----0AL
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: DC27A340-79CB-437E-952F-97A-------A8
Device Start End Sectors Size Type
/dev/sdd1 2048 1048575 1046528 511M EFI System
/dev/sdd2 1048576 1025048575 1024000000 488.3G Linux RAID
/dev/sdd3 1025048576 1058603007 33554432 16G Linux filesystem
Disk /dev/sda: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: HGST HU------0AL
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 76C633FE-ACC3-40FA-A111-2C--------C8
Device Start End Sectors Size Type
/dev/sda1 2048 1048575 1046528 511M EFI System
/dev/sda2 1048576 1025048575 1024000000 488.3G Linux RAID
/dev/sda3 1025048576 1058603007 33554432 16G Linux filesystem
/dev/sda4 3907025072 3907029134 4063 2M Linux filesystem
Disk /dev/md2: 488.2 GiB, 524153782272 bytes, 1023737856 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
然后可以通过 mdadm 命令 reshape RAID1,这一步可以直接在线执行,完全不需要 [[IPMI]] 等等额外的工具。
在线将 RAID1 转变成 RAID10 的步骤可以参考这篇文章 作者写的非常清楚。[[Converting RAID1 to RAID10 online]]
具体的步骤可以查看如下:
root@pve:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda2[0] sdc2[1] sdd2[3] sdb2[2]
511868928 blocks super 1.2 [4/4] [UUUU]
bitmap: 2/4 pages [8KB], 65536KB chunk
unused devices: <none>
root@pve:~# mdadm /dev/md2 --fail /dev/sdc2
mdadm: set /dev/sdc2 faulty in /dev/md2
root@pve:~# mdadm /dev/md2 --remove /dev/sdc2
mdadm: hot removed /dev/sdc2 from /dev/md2
root@pve:~# wipefs -a /dev/sdc2
/dev/sdc2: 4 bytes were erased at offset 0x00001000 (linux_raid_member): fc 4e 2b a9
root@pve:~# mdadm /dev/md2 --fail /dev/sdd2
mdadm: set /dev/sdd2 faulty in /dev/md2
root@pve:~# mdadm /dev/md2 --remove /dev/sdd2
mdadm: hot removed /dev/sdd2 from /dev/md2
root@pve:~# wipefs -a /dev/sdd2
/dev/sdd2: 4 bytes were erased at offset 0x00001000 (linux_raid_member): fc 4e 2b a9
root@pve:~# mdadm --grow /dev/md2 --raid-devices=2
raid_disks for /dev/md2 set to 2
root@pve:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda2[0] sdb2[2]
511868928 blocks super 1.2 [2/2] [UU]
bitmap: 3/4 pages [12KB], 65536KB chunk
unused devices: <none>
root@pve:~# mdadm --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid1
Array Size : 511868928 (488.16 GiB 524.15 GB)
Used Dev Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Thu Oct 21 13:33:45 2021
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : bitmap
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 158
Number Major Minor RaidDevice State
0 8 2 0 active sync /dev/sda2
2 8 18 1 active sync /dev/sdb2
root@pve:~# sudo mdadm --grow /dev/md2 --level=0 --backup-file=/home/backup-md2
mdadm: level of /dev/md2 changed to raid0
root@pve:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid0 sdb2[2]
511868928 blocks super 1.2 64k chunks
unused devices: <none>
root@pve:~# mdadm --misc --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid0
Array Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 1
Total Devices : 1
Persistence : Superblock is persistent
Update Time : Thu Oct 21 13:40:10 2021
State : clean
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
Chunk Size : 64K
Consistency Policy : none
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 163
Number Major Minor RaidDevice State
2 8 18 0 active sync /dev/sdb2
root@pve:~# mdadm --grow /dev/md2 --level=10 --backup-file=/home/backup-md2 --raid-devices=4 --add /dev/sda2 /dev/sdc2 /dev/sdd2
mdadm: level of /dev/md2 changed to raid10
mdadm: added /dev/sda2
mdadm: added /dev/sdc2
mdadm: added /dev/sdd2
raid_disks for /dev/md2 set to 5
root@pve:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid10 sdd2[5] sdc2[4](S) sda2[3](S) sdb2[2]
511868928 blocks super 1.2 2 near-copies [2/1] [U_]
[>....................] recovery = 0.5% (2835392/511868928) finish=50.8min speed=166787K/sec
unused devices: <none>
root@pve:~# mdadm --misc --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid10
Array Size : 511868928 (488.16 GiB 524.15 GB)
Used Dev Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 2
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Oct 21 13:42:49 2021
State : active, degraded, recovering
Active Devices : 1
Working Devices : 4
Failed Devices : 0
Spare Devices : 3
Layout : near=2
Chunk Size : 64K
Consistency Policy : resync
Rebuild Status : 1% complete
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 221
Number Major Minor RaidDevice State
2 8 18 0 active sync set-A /dev/sdb2
5 8 50 1 spare rebuilding /dev/sdd2
3 8 2 - spare /dev/sda2
4 8 34 - spare /dev/sdc2
root@pve:~# mdadm --misc --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid10
Array Size : 511868928 (488.16 GiB 524.15 GB)
Used Dev Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 2
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Oct 21 13:47:58 2021
State : active, degraded, recovering
Active Devices : 1
Working Devices : 4
Failed Devices : 0
Spare Devices : 3
Layout : near=2
Chunk Size : 64K
Consistency Policy : resync
Rebuild Status : 11% complete
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 554
Number Major Minor RaidDevice State
2 8 18 0 active sync set-A /dev/sdb2
5 8 50 1 spare rebuilding /dev/sdd2
3 8 2 - spare /dev/sda2
4 8 34 - spare /dev/sdc2
root@pve:~# mdadm --misc --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid10
Array Size : 511868928 (488.16 GiB 524.15 GB)
Used Dev Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 2
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Oct 21 13:48:29 2021
State : clean, degraded, recovering
Active Devices : 1
Working Devices : 4
Failed Devices : 0
Spare Devices : 3
Layout : near=2
Chunk Size : 64K
Consistency Policy : resync
Rebuild Status : 12% complete
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 588
Number Major Minor RaidDevice State
2 8 18 0 active sync set-A /dev/sdb2
5 8 50 1 spare rebuilding /dev/sdd2
3 8 2 - spare /dev/sda2
4 8 34 - spare /dev/sdc2
root@pve:~# mdadm --grow /dev/md2 --raid-devices=4
root@pve:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid10 sdd2[5] sdc2[4] sda2[3] sdb2[2]
511868928 blocks super 1.2 64K chunks 2 near-copies [4/3] [U_UU]
[>....................] reshape = 0.2% (1387520/511868928) finish=67.4min speed=126138K/sec
unused devices: <none>
root@pve:~# mdadm --misc --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid10
Array Size : 511868928 (488.16 GiB 524.15 GB)
Used Dev Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Oct 21 13:50:47 2021
State : clean, degraded, reshaping
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 64K
Consistency Policy : resync
Reshape Status : 1% complete
Delta Devices : 2, (2->4)
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 725
Number Major Minor RaidDevice State
2 8 18 0 active sync set-A /dev/sdb2
5 8 50 1 spare rebuilding /dev/sdd2
4 8 34 2 active sync set-A /dev/sdc2
3 8 2 3 active sync set-B /dev/sda2
root@pve:~# mdadm --misc --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid10
Array Size : 511868928 (488.16 GiB 524.15 GB)
Used Dev Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Oct 21 13:51:59 2021
State : active, degraded, reshaping
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 64K
Consistency Policy : resync
Reshape Status : 3% complete
Delta Devices : 2, (2->4)
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 769
Number Major Minor RaidDevice State
2 8 18 0 active sync set-A /dev/sdb2
5 8 50 1 spare rebuilding /dev/sdd2
4 8 34 2 active sync set-A /dev/sdc2
3 8 2 3 active sync set-B /dev/sda2
root@pve:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid10 sdd2[5] sdc2[4] sda2[3] sdb2[2]
511868928 blocks super 1.2 64K chunks 2 near-copies [4/3] [U_UU]
[====>................] reshape = 21.8% (111798784/511868928) finish=59.6min speed=111736K/sec
unused devices: <none>
root@pve:~# mdadm --misc --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid10
Array Size : 511868928 (488.16 GiB 524.15 GB)
Used Dev Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Oct 21 14:05:44 2021
State : active, degraded, reshaping
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 64K
Consistency Policy : resync
Reshape Status : 22% complete
Delta Devices : 2, (2->4)
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 1345
Number Major Minor RaidDevice State
2 8 18 0 active sync set-A /dev/sdb2
5 8 50 1 spare rebuilding /dev/sdd2
4 8 34 2 active sync set-A /dev/sdc2
3 8 2 3 active sync set-B /dev/sda2
root@pve:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 16G 0 16G 0% /dev
tmpfs 3.2G 8.9M 3.2G 1% /run
/dev/md2 481G 1.5G 455G 1% /
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sdd1 511M 3.3M 508M 1% /boot/efi
tmpfs 3.2G 0 3.2G 0% /run/user/1000
root@pve:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk
├─sda1 8:1 0 511M 0 part
├─sda2 8:2 0 488.3G 0 part
│ └─md2 9:2 0 488.2G 0 raid10 /
├─sda3 8:3 0 16G 0 part [SWAP]
└─sda4 8:4 0 2M 0 part
sdb 8:16 0 1.8T 0 disk
├─sdb1 8:17 0 511M 0 part
├─sdb2 8:18 0 488.3G 0 part
│ └─md2 9:2 0 488.2G 0 raid10 /
└─sdb3 8:19 0 16G 0 part [SWAP]
sdc 8:32 0 1.8T 0 disk
├─sdc1 8:33 0 511M 0 part
├─sdc2 8:34 0 488.3G 0 part
│ └─md2 9:2 0 488.2G 0 raid10 /
└─sdc3 8:35 0 16G 0 part [SWAP]
sdd 8:48 0 1.8T 0 disk
├─sdd1 8:49 0 511M 0 part /boot/efi
├─sdd2 8:50 0 488.3G 0 part
│ └─md2 9:2 0 488.2G 0 raid10 /
└─sdd3 8:51 0 16G 0 part [SWAP]
root@pve:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid10 sdd2[5] sdc2[4] sda2[3] sdb2[2]
511868928 blocks super 1.2 64K chunks 2 near-copies [4/3] [U_UU]
[======>..............] reshape = 32.9% (168472448/511868928) finish=49.0min speed=116718K/sec
unused devices: <none>
等待很长一段时间之后 RAID10 完成:
root@pve:~# mdadm --misc --detail /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Thu Oct 21 12:58:06 2021
Raid Level : raid10
Array Size : 1023737856 (976.31 GiB 1048.31 GB)
Used Dev Size : 511868928 (488.16 GiB 524.15 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Oct 22 01:39:27 2021
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 64K
Consistency Policy : resync
Name : md2
UUID : 0686b64f:07957a70:4e937aa2:23716f6e
Events : 6536
Number Major Minor RaidDevice State
2 8 18 0 active sync set-A /dev/sdb2
5 8 50 1 active sync set-B /dev/sdd2
4 8 34 2 active sync set-A /dev/sdc2
3 8 2 3 active sync set-B /dev/sda2
完成 RAID10 的调整之后,如果磁盘还有剩余的空间,可以再分区,之后使用 ZFS,raidz 可以自己选择。
然后可以更具官方的教程,直接在 Debian 的基础之上安装 Proxmox VE。之后需要移除掉 cloud-init 否则网络配置会产生问题。
[[so-you-start]] 的独服有4块 2T 的硬盘,本来想配置一个 Soft RAID-10,但折腾了一个礼拜,重装了无数遍系统,配置了很多次,从 Ubuntu,Proxmox VE,Debian 都尝试了一遍,最终放弃了,想着充分利用其空间,使用 Proxmox VE,备份好数据,不用 RAID 了,毕竟如果使用默认的 RAID-1,我只能利用8T空间中的 2T 不到,而使用 RAID-10 也只能利用不到 4T 左右空间。至于使用单盘,所有的数据备份,和数据安全性的工作就完全依靠自己的备份去完成了。但是好处是可利用的空间大了。
参考之前的文章Proxmox VE 硬盘直通,将 Proxmox VE 安装后剩下的三块硬盘直通给 Ubuntu。
root@pve:/var/lib/vz/dump# qm set 101 -scsi1 /dev/disk/by-id/ata-HGST_HUS726020ALA610_K5HWJ6NG
update VM 101: -scsi1 /dev/disk/by-id/ata-HGST_HUS726020ALA610_K5HWJ6NG
root@pve:/var/lib/vz/dump# qm set 101 -scsi2 /dev/disk/by-id/ata-HGST_HUS726020ALA610_K5J0ZUWA
update VM 101: -scsi2 /dev/disk/by-id/ata-HGST_HUS726020ALA610_K5J0ZUWA
root@pve:/var/lib/vz/dump# qm set 101 -scsi3 /dev/disk/by-id/ata-HGST_HUS726020ALA610_K5HW9RJG
update VM 101: -scsi3 /dev/disk/by-id/ata-HGST_HUS726020ALA610_K5HW9RJG
在 Ubuntu 虚拟机就可以看到:
einverne@sysubuntu:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 61.9M 1 loop /snap/core20/1169
loop1 7:1 0 55.4M 1 loop /snap/core18/2128
loop2 7:2 0 70.3M 1 loop /snap/lxd/21029
loop3 7:3 0 67.3M 1 loop /snap/lxd/21545
loop5 7:5 0 32.4M 1 loop /snap/snapd/13270
loop6 7:6 0 32.5M 1 loop /snap/snapd/13640
sda 8:0 0 64G 0 disk
├─sda1 8:1 0 1M 0 part
└─sda2 8:2 0 64G 0 part /
sdb 8:16 0 1.8T 0 disk
sdc 8:32 0 1.8T 0 disk
sdd 8:48 0 1.8T 0 disk
sr0 11:0 1 1024M 0 rom
然后使用 fdisk 或 parted 给硬盘进行分区,格式化之后,挂载到 /mnt
:
root@sysubuntu:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 394M 1.1M 393M 1% /run
/dev/sda2 63G 10G 50G 17% /
tmpfs 2.0G 468K 2.0G 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/loop0 62M 62M 0 100% /snap/core20/1169
/dev/loop2 71M 71M 0 100% /snap/lxd/21029
/dev/loop1 56M 56M 0 100% /snap/core18/2128
/dev/loop3 68M 68M 0 100% /snap/lxd/21545
/dev/loop5 33M 33M 0 100% /snap/snapd/13270
/dev/loop6 33M 33M 0 100% /snap/snapd/13640
tmpfs 394M 0 394M 0% /run/user/1000
/dev/sdb1 1.8T 77M 1.7T 1% /mnt/sdb1
/dev/sdc1 1.8T 77M 1.7T 1% /mnt/sdc1
/dev/sdd1 1.8T 77M 1.7T 1% /mnt/sdd1
在官方发布页面 下载最新的安装包:
wget https://github.com/trapexit/mergerfs/releases/download/2.32.6/mergerfs_2.32.6.ubuntu-bionic_amd64.deb
sudo dpkg -i mergerfs_2.32.6.ubuntu-bionic_amd64.deb
MergerFS 可以将一组硬盘(JBOD)组合形成一个硬盘,类似于 RAID,但完全不同。
root@sysubuntu:~# mkdir -p /mnt/storage
root@sysubuntu:~# mergerfs -o defaults,allow_other,use_ino,category.create=mfs,minfreespace=100G,ignorepponrename=true,fsname=mergerFS /mnt/sdb1:/mnt/sdc1/:/mnt/sdd1/ /mnt/storage/
root@sysubuntu:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 394M 1.1M 393M 1% /run
/dev/sda2 63G 10G 50G 17% /
tmpfs 2.0G 468K 2.0G 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/loop0 62M 62M 0 100% /snap/core20/1169
/dev/loop2 71M 71M 0 100% /snap/lxd/21029
/dev/loop1 56M 56M 0 100% /snap/core18/2128
/dev/loop3 68M 68M 0 100% /snap/lxd/21545
/dev/loop5 33M 33M 0 100% /snap/snapd/13270
/dev/loop6 33M 33M 0 100% /snap/snapd/13640
tmpfs 394M 0 394M 0% /run/user/1000
/dev/sdb1 1.8T 77M 1.7T 1% /mnt/sdb1
/dev/sdc1 1.8T 77M 1.7T 1% /mnt/sdc1
/dev/sdd1 1.8T 77M 1.7T 1% /mnt/sdd1
mergerFS 5.4T 229M 5.1T 1% /mnt/storage
参数说明:
defaults
: 开启以下 FUSE 参数以提升性能:atomic_o_trunc, auto_cache, big_writes, default_permissions, splice_move, splice_read, splice_write;allow_other
: 允许挂载者以外的用户访问。需要编辑 /etc/fuse.conf。use_ino
: 使用 mergerfs 而不是 libfuse 提供的 inode,使硬链接的文件 inode 一致;category.create=mfs
: Spreads files out across your drives based on available space;minfreespace=100G
: 最小剩余空间 100G,当写文件时,跳过剩余空间低于 100G 的文件系统ignorepponrename=true
: 重命名时保持原来的存储路径最后编辑 /etc/fstab
来在启动时自动挂载。
使用 lsblk -f
查看:
root@sysubuntu:~# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
loop0 squashfs 0 100% /snap/core20/1169
loop1 squashfs 0 100% /snap/core18/2128
loop2 squashfs 0 100% /snap/lxd/21029
loop3 squashfs 0 100% /snap/lxd/21545
loop5 squashfs 0 100% /snap/snapd/13270
loop6 squashfs 0 100% /snap/snapd/13640
sda
├─sda1
└─sda2 ext4 8ecce3ba-cd9f-494a-966a-d90fc31cd0fc 49.6G 16% /
sdb
└─sdb1 ext4 50292f2c-0f85-4871-9c41-148038b31e24 1.7T 0% /mnt/sdb1
sdc
└─sdc1 ext4 1de9b276-5a5d-41ac-989a-12bdc9ef4d0b 1.7T 0% /mnt/sdc1
sdd
└─sdd1 ext4 420d99a9-de31-4df4-af93-6863f3284f3d 1.7T 0% /mnt/sdd1
sr0
然后在 /etc/fstab
中配置:
/dev/disk/by-uuid/50292f2c-0f85-4871-9c41-148038b31e24 /mnt/sdb1 ext4 defaults 0 0
/dev/disk/by-uuid/1de9b276-5a5d-41ac-989a-12bdc9ef4d0b /mnt/sdc1 ext4 defaults 0 0
/dev/disk/by-uuid/420d99a9-de31-4df4-af93-6863f3284f3d /mnt/sdd1 ext4 defaults 0 0
/mnt/sdb1:/mnt/sdc1/:/mnt/sdd1 /mnt/storage fuse.mergerfs defaults,allow_other,use_ino,category.create=mfs,minfreespace=100G,fsname=mergerfs 0 0
这样重启也会自动进行挂载。
如果要在 mergerfs 上使用 rtorrent 需要注意使用如下配置:
allow_other,use_ino,cache.files=partial,dropcacheonclose=true,category.create=mfs
早之前写过一篇文章,当时我直接使用命令行的方式使用 clash,但用过一段时间之后发现 Clash For Windows 支持了 Linux,所以切换到 Clash For Windows,用 UI 界面方便随时切换。
不要看这个 Clash For Windows 的名字有点歧义,实际上是全平台的,不是 Windows 专属的。Clash For Windows 在下文中会简称 CFW。
Clash for Windows 的优点:
更加详细的使用指南可以参考这个文档
可以在 GitHub 下载(项目已被删除),也可以使用镜像地址下载。
下载完成后是一个压缩包,解压,并执行其中的 cfw
即可。
添加快捷方式,因为我使用 Cinnamon 是基于 Gnome ,所以可以执行如下命令添加一个快捷方式:
gnome-desktop-item-edit ~/.local/share/applications --create-new
在弹出的窗口中,填写 Name 和 Command
说明:
Dashboard:
Clash For Windows 页面:
在 Profile 页面上可以添加订阅地址,订阅地址可以在这里 获取。
[[so-you-start]] 的独立服务器本来安装了 Ubuntu 20.04,后来想想为了充分利用 CPU 和内存,不如安装一个 [[Proxmox VE]] 然后在其基础之上再安装 Ubuntu 或者其他的系统测试。So you Start 通过后台安装 Proxmox 的过程比较简单,我直接使用了后台的 Proxmox VE 6 模板安装了 Proxmox。
So you Start 其他独立服务器提供商通常只会提供一个公网 IP,其他的 failover IP 可能需要购买(So you Start 可以使用 1.5$ 购买一个),如果不想多花这个购买 IP 的钱,可以配置 Proxmox VE 的虚拟机走 NAT,共用宿主机 Proxmox VE 的 IP,做一下端口转发。实际在一些 VPS 提供商那边也能看到 [[NAT VPS]],这类型的 VPS 就是共用同一个 IP 的 VPS,这一类的 VPS 通常比较便宜,但是可用的端口数量有限。
完成下文的配置之后大致的网络拓扑图是这样的:
在继续下文之前有一些前提知识需要了解,否则会理解起来有些困难。
Linux Bridge 一般翻译成网桥,相当于一个软件实现的交换机。
如果要配置成 NAT 网络,Proxmox VE 上所有的虚拟机共享一个网桥 vmbr1,通过 vmbr1 访问外部网络。
理论上 Proxmox VE 支持 4094 个网桥。默认情况下 Proxmox VE 会创建一个 vmbr0 的网桥,并和检测到的第一块网卡(eno3)桥接。可以查看网口的配置文件 /etc/network/interfaces
对应的信息:
root@pve:~# cat /etc/network/interfaces
# network interface settings; autogenerated
# Please do NOT modify this file directly, unless you know what
# you're doing.
#
# If you want to manage parts of the network configuration manually,
# please utilize the 'source' or 'source-directory' directives to do
# so.
# PVE will preserve these directives, but will NOT read its network
# configuration from sourced files, so do not attempt to move any of
# the PVE managed interfaces into external files!
auto lo
iface lo inet loopback
iface eno3 inet manual
iface eno4 inet manual
auto vmbr0
iface vmbr0 inet dhcp
bridge-ports eno3
bridge-stp off
bridge-fd 0
[[NAT]] 全称是 Network Address Translation,在计算机网络中是网络地址转换的含义,也被叫做网络掩蔽,这是一种在 IP 数据包通过路由器或防火墙时重写来源 IP 地址或目的 IP 地址的技术。
在我们的 Proxmox VE 只有一个公网 IP 的情况下,如果要让多个虚拟机共享同一个 IP 地址对外提供服务,就需要用到 NAT 技术,让请求访问到宿主机的时候,转发到对应的虚拟机。
所有的虚拟机使用内部私有 IP 地址,并通过 Proxmox VE 的公网 IP 访问外部网络。我们会使用 iptables 来改写虚拟机和外部通信的数据包:
[[NDP]] 全称是 Neighbor Discovery Protocol,简称 NDP,类似 IPv4 中的 ARP 协议。
上面的配置也提到了默认情况下 Proxmox VE 会创建一个 vmbr0 桥接找到的网卡。
首先查看一下网络接口:
root@pve:~# ip -f inet a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 51.xx.xx.xx/24 brd 51.xx.xx.xxx scope global dynamic vmbr0
valid_lft 81976sec preferred_lft 81976sec
Proxmox VE 上使用 NAT 创建虚拟机的原理是,创建一个 Linux Bridge 并创建一个子网,然后将所有虚拟机包括宿主机都连接到这个子网内,再开启 [[iptables]] 的 NAT 功能。
在安装网桥之前,首先安装:
apt install ifupdown2
然后登录 Proxmox VE 后台,创建 Linux Bridge,点击 PVE,然后选择 System -> Networks,然后点击创建。
填写 IP 和子网掩码,IP 地址填写个局域网的网段地址就行。其他项目不用填也不用改,保持默认(不用 IPv6 的情况下)。
上面的配置创建了一个新的 vmbr1
网桥分配了一个子网 10.0.0.1/24
,宿主机(网关)在子网的 IP 是 10.0.0.1。
创建完成之后,查看 /etc/network/interfaces
,然后在对应的 vmbr1 后面修改成相应的配置(注意 vmbr1 下面的配置):
auto lo
iface lo inet loopback
iface eno3 inet manual
iface eno4 inet manual
auto vmbr0
iface vmbr0 inet dhcp
bridge-ports eno3
bridge-stp off
bridge-fd 0
auto vmbr1
iface vmbr1 inet static
address 10.0.0.1/24
gateway 1.2.3.254 # 独立服务器IP前三个数加上 254
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.0.0.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/24' -o vmbr0 -j MASQUERADE
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2022 -j DNAT --to 10.0.0.102:22
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2022 -j DNAT --to 10.0.0.102:22
说明:
ip_forward
一行表示开启 IPv4 转发,这个是内核参数,将 Linux 当作路由器用的参数。一般来说,一个路由器至少要有两个网络接口,一个 WAN,一个 LAN,为了让 LAN 和 WAN 流量相同,需要内核上的路由post-up
和 post-down
分别表示网卡启用和禁用之后,执行后面的命令iptables
行表示,开启防火墙转发,-A
表示添加规则,配置一条 NAT 规则,源地址为 10.0.0.0/24
的流量,转发到 vmbr0
接口。-D
删除这条规则最后 2 行是把虚拟机 10.0.0.102 上的 22 端口 NAT 到宿主机的 2022 端口,这样使得外部的网络可以通过 Proxmox VE 宿主机的 2022 端口访问虚拟机的 22 端口,可以直接使用上面的配置,或者手动执行下面的命令:
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2022 -j DNAT --to 10.0.0.102:22
最后两行配置在网络配置中是为了让系统重启之后配置依然生效。否则 iptables 的转发就可能丢失。
启用网桥:
sudo ifup vmbr1
显示信息:
ip address show dev vmbr1
查看 iptables 配置是否生效:
iptables -L -t nat
结果:
root@pve:~# ip address show dev vmbr1
9: vmbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 62:32:cf:9d:5d:f9 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 scope global vmbr1
valid_lft forever preferred_lft forever
inet6 fe80::6032:cfff:fe9d:5df9/64 scope link
valid_lft forever preferred_lft forever
重启网络:
sudo systemctl restart networking
systemctl status networking.service
通过上面的方式创建了 vmbr1
的网桥之后,再创建新的虚拟机就可以使用这个新的子网。因为这里没有配置 DHCP,所以虚拟机需要设定静态 IP 地址。
在我的真实操作中,我发现无论我怎么重启 systemctl restart networking
都无法使得 Proxmox VE 的网络配置生效,最后不得不重启服务器才可以。
在创建虚拟机的时候,记得在网络配置的时候选择 vmbr1
,因为没有配置 DHCP 所以需要用下面的方式手动指定虚拟机的静态 IP 地址。
Ubuntu 从上一个版本开始就使用 netplan 来管理网络配置,所以需要修改 netplan 的配置:
einverne@ubuntu2:~$ cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens18:
addresses:
- 10.0.0.102/24
gateway4: 10.0.0.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
version: 2
注意配置其中的静态地址和网关。
10.0.0.0/24
网段下的地址,比如 10.0.0.102
gateway4
地址配置 vmbr1 网桥的地址修改完成后执行:
netplan apply
之后可以使用如下命令测试连通性:
ping 1.1.1.1
ping google.com
Debian 上的网络配置如下:
einverne@debian:~$ cat /etc/network/interfaces.d/50-cloud-init
auto ens18
iface ens18 inet static
address 10.0.0.100
netmask 255.255.255.0
gateway 10.0.0.1
dns-nameserver 1.1.1.1
dns-nameserver 8.8.8.8
说明:
ens18
是 Debian 虚拟机的网络接口address
填写 10.0.0.0/24
网段的静态地址gateway
填入 vmbr1 的地址然后重启网络:systemctl restart networking
。
在配置的过程中遇到很多问题,可以用一下一些命令熟悉 Linux 下的网络配置。
iptalbes -L -t nat
ip a
ip route show
cat /proc/sys/net/ipv4/ip_forward
qm config <VMID>
在按照上述步骤配置后,登录 VM (Ubuntu 20.04) 内部,只能 Ping 通网关(10.0.0.1) 而无法 ping 通任何外部网络。
再经过一番调查之后发现在上述配置中的 iptables 转发并没有生效,并且重启网络也没有生效,所以我只能重启服务器解决。
在启用 NAT 网络之后,如果要外部网络访问 VM 的端口,则需要开启 iptables 端口转发。
下面一句的含义就是将 Proxmox VE(vmbr0) 的 2022 端口转发到 10.0.0.102 这台虚拟机的 22 端口:
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2022 -j DNAT --to 10.0.0.102:22
这样在外部互联网就可以通过 ssh -p 2022 root@<proxmox ip>
来访问 Proxmox VE 中的虚拟机了。
如果遇到要转发一组端口可以使用:
post-up iptables -t nat -I PREROUTING -p tcp -i vmbr0 --dport 8000:9000 -j DNAT --to 10.0.0.102:8000-9000
post-down iptables -t nat -D PREROUTING -p tcp -i vmbr0 --dport 8000:9000 -j DNAT --to 10.0.0.102:8000-9000
如果已经购买了 Failover IP,或者独立服务器提供了多个可用的 IP,那么也可以参考 这篇文章 配置 Proxmox VE 的虚拟机使用额外的 IP 地址。这样使用一台独立服务器就可以开多个 KVM 的 VPS 了。
很早之前整理过一篇文章介绍了几个之前在 Linux 上用过的用来快速找到重复文件并删除的文章,这么多年过去了,最后发现还是 jdupes 最好用,因为是 c 语言编写,可以在所有平台上面运行,并且速度远远好于其他的命令。
之前的文章对于 jdupes 总结的比较简单,所以这里单独再总结一下 jdupes 常用的几个例子。
查找文件夹下重复的文件,这也是最常见的需求,可以直接
jdupes -r path/to/dir
-r
参数在这里表示 --recurse
递归查找文件夹下所有的子文件夹。
jdupes 在输出重复的内容的同时也提供了方法可以让用户自行选择删除哪个文件,或者自动发现并删除重复的文件。
注意:个人推荐每一次都手动选择需要删除的内容,否则请提前做好备份工作,防止文件丢失
jdupes 提供了 -d
选择,如果使用 -d
选项,jdupes 会弹出提示让用户选择是否删除重复文件:
jdupes -dr path/to/dir
如果确定自己不需要手动选择删除,可以使用 -N
选项,表示 --noprompt
,谨慎使用该选项:
jdupes -r -N path/to/dir
有些时候文件在两个文件夹中,比如 dir1
, dir2
,需要实现的是将 dir2 中和 dir1 中重复的文件删除,而保留 dir1 中的文件,这个时候可以使用 -O
选项。
-O
选择可以让用户控制出现在第一条的文件,以便将其保留。
jdupes -nrdNO dir1 dir2
上面的命令会递归查找 dir1 和 dir2 中的文件,并自动将 dir2 中和 dir1 重复的文件删除。
最近买了一台 [[so-you-start]] 的独立服务器,开始的时候安装了 Ubuntu 没有充分利用独立服务器的优势,所以这两天把系统重新安装成了 [[Proxmox VE]],然后在上面又安装了 Ubuntu 20.04,So you Start 提供了额外 16 个可以以 1.5 美元购买的 [[Failover IPs]],Failover IP 本来是为了可以将服务器迁移到另外的服务器而提供的机制,但在 Proxmox VE 虚拟化技术系统下,可以给虚拟机也分配不同的 IP,这样就实现了从一台服务器虚拟化多个 VPS 的操作。
安装 Proxmox VE 的过程就不多说了,在 So you Start 或者 OVH 后台直接使用模板安装即可,我使用的 6.x 版本,没有升级到最新的 7 版本。
安装完成后使用 Ubuntu Server 的 ISO 镜像完成虚拟机的安装。
首先到 So you Start 后台 IP,然后选择购买的 Failover IP,新增 virtual MAC 地址,然后复制该 MAC 地址备用。
比如:
02:01:00:78:95:aa
新增 MAC 地址可能有一点延迟,等待一小会儿生效即可。
然后需要在 Proxmox VE 虚拟机配置中将上述 MAC 地址配置。如果还没有安装虚拟机,可以参考 Proxmox VE 官网的教程 。
VM 配置前需要是关闭状态。
在 Proxmox VE 中,找到虚拟机的 Hardware
找到 Network Device 选项,默认情况下是一个随机生成的 MAC 地址:
点击 Edit,然后在 MAC address 一栏将上一步的虚拟 MAC 地址填入,并保存。
然后启动 VM,接下来需要配置虚拟机的网络接口。
配置虚拟机网络。
首先查看一下接口:
ip addr
除了一个 lo
应该能看到类似 ens18
这样的接口。
Debian 的网络接口配置在 vi /etc/network/interfaces
:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens18
iface ens18 inet static
address 192.0.2.1
netmask 255.255.255.0
gateway 203.0.113.254
dns-nameservers 208.67.222.222 208.67.220.220
说明:
192.0.2.1
修改为自己的 Failover IP203.0.113.254
前 3 个字节的数字,修改成独立服务器 IP 地址的前三个字节 IP 地址,最后添加 254,比如独立服务器的 IP 是 1.2.3.4
,那么使用 1.2.3.254
作为网关然后使得接口生效:
ip link set ens18 up
最后重启 networking:
systemctl restart networking
然后可以测试连通性:
ping 8.8.8.8
能够 ping,表示已经可以联网。
ping google.com
然后看一下 DNS 解析,如果域名无法解析,我这边情况是少了 /etc/resolv.conf
,手工创建文件并写入:
nameserver 8.8.8.8
即可。
Ubuntu 从 17 版本开始就使用 Netplan 来管理网络配置,所以和 Debian 有一些区别。
修改 netplan 配置文件,根据不同的系统可能配置文件路径不一样,请注意一下:
vi /etc/netplan/01-netcfg.yaml
vi /etc/netplan/00-installer-config.yaml
然后使用:
# This is the network config written by 'subiquity'
network:
version: 2
renderer: networkd
ethernets:
ens18:
dhcp4: no
dhcp6: no
addresses:
- 192.0.2.1/32 # 这里填写 failover ip(vMAC 地址需要提前配好)
- 1111:2222:3333:6666::2/64 # 如果有 IPv6 地址也可以配上,an ipv6 from your server allocation
gateway4: 1.2.3.254
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
routes:
- to: 1.2.3.254/32
via: 0.0.0.0
scope: link
和上面的配置类似,对应替换即可。
然后使之生效:
sudo netplan apply
注意在配置 Ubuntu 22.04 的时候 Netplan 可能会有一 WARNING:
gateway4
has been deprecated, use default routes instead. See the ‘Default routes’ section of the documentation for more details.
简单的查了一下 Netplan 的配置格式发生了改变。如果不修改理论上也没有关系,不过为了之后兼容,可以改用 Netplan 最新的配置。1
很早以前就在用 binux 大佬的 qiandao.today,但后来不知道是用的人多了,还是大佬不怎么维护了,所以后来渐渐地就会登录不上,或者签到失败。干脆直接自己部署一个自己使用。
qiandao 项目是一个使用 Python 编写的自动化签到框架。最早由 Binux 开发,现在项目转到了组织中由 a76yyyy 维护。qiandao 是一个 HTTP 请求定时任务自动执行框架,基于 HAR 和 Tornado 服务。
docker-compose
配置见 GitHub,克隆项目,直接 docker-compose up -d
,搭配 Nginx Proxy Manager 即可。
我自己搭建的服务如果有兴趣可以加入讨论群组 向我索要地址。
[[HAR]] 是 HTTP Archive format 的缩写,即 HTTP 存档格式,一种 JSON 格式的存档格式,用于记录浏览器和网站的交互过程。文件扩展名通常是 .har。签到项目提供了一个基于 Web 页面的 HAR 编辑器,可以通过浏览器录制,然后上传到网站中编辑的方式来快速制作符合自己需求的 HAR 文件。
HAR 文件包含有关网页或应用程序加载过程中所执行的 HTTP 请求和响应的信息。 HAR 文件通常是由浏览器开发工具或类似的工具生成的,可以在许多浏览器中使用。可以使用这些工具来查看网站或应用程序的加载情况,并分析其中的性能问题。
在 Google Chrome 中,可以打开开发人员工具(通常可以通过按 F12 键或在浏览器菜单中选择“更多工具”>“开发人员工具”来访问)。然后,在左侧的菜单中选择“网络”,然后在页面加载过程中会显示所有 HTTP 请求的列表。可以使用“导出为 HAR”按钮将这些请求保存到一个 HAR 文件中。
在制作模板时,需要将请求中的 Cookie 替换为双花括号,并且保存,那么通过这个模板创建签到时就会有 Cookie 字段定义。
api | 地址 | 参数 | 参数是否必须 | 说明 | 用例 |
---|---|---|---|---|---|
时间戳 | http://localhost/util/timestamp | ts | 否 | 默认返回当前时间戳和时间,如果参数带时间戳,返回所对应北京时间 | http://localhost/util/timestamp http://localhost/util/timestamp?ts=1586921249 |
Unicode 转中文 | http://localhost/util/unicode | content | 是 | 要转码的内容 | http://localhost/util/unicode?content=今日签到:1\u5929\u5ef6\u4fdd |
Url 转中文 | http://localhost/util/urldecode | content | 是 | 要转码的内容 | http://localhost/util/urldecode?content=签到成功!每日签到获得%2C |
正则表达式 | http://localhost/util/regex | data,p | 是 | data:原始数据 p:正则表达式 | http://localhost/util/regex?data=origin_data&p=regex |
字符串替换 | http://localhost/util/string/replace | p,s,t | 是 | p:正则表达式 s:要替换的字符串 t:要替换的内容 | http://localhost/util/string/replace?p=regex&t=text_to_replace&s=text |
我自己的新建的签到网站,虽然目前只有我一个人用,但是我自己也创建了不少好用的模板,尤其是 PT 站点签到的模板,如果有朋友有需要可以加入 Telegram Group ,然后大家在群里一起讨论怎么充分利用签到程序。
前两天用隐身窗口打开自己的博客的时候突然发现 Disqus 评论框上一大片广告,没想到现在 Disqus 已经这样了,并且之前还暴露出过隐私问题。所以就想着什么时候替换掉它。
虽然之前也调研过静态博客的评论系统,但说实话那个时候还没有让我有替换掉 Disqus 的动力,毕竟有一些评论系统是基于 GitHub issue 的,也有一些现在来看比 Disqus 存活的时间都要短,连官网都不存在了。
整理一下 Disqus 目前让我不舒服的一些地方:
替换了 Disqus 至少可以提升一下访问速度,访客也不会被广告追踪。
所以接下来就研究了一下 Disqus 的代替品,我大致把他们分成了一下几个部分:
综合比较下来因为已经排除了第一、二两类,在自建的服务中 Isso 和 Remark42 看着非常轻便,即使自建,使用 Docker 也非常快。并且 Remark42 更加强大一些,所以就选 Remark42 了。
Remark42 是使用 Go 编写,并且提供了 Docker 部署方式,一个 docker-compose 文件搞定:
version: "3"
services:
remark42:
image: umputun/remark42:latest
container_name: "remark42"
restart: always
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"
environment:
- REMARK_URL=${URL}
- SITE=${SITE}
- SECRET=${SECRET}
- STORE_TYPE=bolt
- STORE_BOLT_PATH=/srv/var/db
- BACKUP_PATH=/srv/var/backup
- CACHE_TYPE=mem
- DEBUG=true
- AUTH_TELEGRAM=${AUTH_TELEGRAM}
- TELEGRAM_TOKEN=${TELEGRAM_TOKEN}
- AUTH_ANON=true
- ADMIN_PASSWD=${ADMIN_PASSWD}
- VIRTUAL_HOST=${YOUR_DOMAIN}
- VIRTUAL_PORT=8080
- LETSENCRYPT_HOST=${YOUR_DOMAIN}
- LETSENCRYPT_EMAIL=${YOUR_EMAIL}
volumes:
- ${STORAGE_PATH}:/srv/var
networks:
default:
external:
name: nginx-proxy
我使用 nginx-proxy 做域名转发,以及 SSL 证书自动生成。
Disqus 提供导出评论到一个压缩包的工具,可以在 Disqus Admin > Setup > Export 找到 1。
docker exec -it remark42 import -p disqus -f /srv/var/xxxx-2021-10-08T12_57_49.488908-all.xml -s site_id
通过以上命令导入。