王某某的笔记

记录我的编程之路

expect - 自动交互脚本

选项

  • -c:执行脚本前先执行的命令,可多次使用。
  • -d:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
  • -D:启用交换调式器,可设一整数参数。
  • -f:从文件读取命令,仅用于使用#!时。如果文件名为”-“,则从stdin读取(使用”./-“从文件名为-的文件读取)。
  • -i:交互式输入命令,使用”exit”或”EOF”退出输入状态。
  • –:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect –。
  • -v:显示expect版本信息。

expect常用命令

1
2
3
4
5
6
7
8
9
10
spawn               交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间

实践步骤

先安装 expect

1
2
3
4
yum install expect

#查看一下版本
expect -v

编写shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/expect
# 获取第1个参数,从0开始
set username [lindex $argv 0]

# 设置超时
set timeout 5

# spawn是expect内部命令
spawn su - $username

# 判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间(timeout)后返回
# expect "Password:"
# 有时候会提示中文的密码,这里改成通配符,? 表示1个字符 * 表示零个或多个字符

expect "??*"

#此处输入密码,\r回车
send "123456\r"

# 执行完成后保持交互状态,控制权交给控制台(手工操作)。否则会完成后会退出。
interact

已有公网IP
已配置DDNS,IP地址绑定了域名 (阿里云域名)
已经设置了ssl证书 (阿里云免费)

安装

用admin账号登录,安装Photo station套件即可

外网无法访问问题

在外网环境,通过DSM直接跳转到Photo station套件网页版时无法访问,Photo station使用80 或443 端口,需要在路由器上做端口映射。

由于运营商封闭了这两个端口,需要改成别的端口

在路由器上设置端口映射

  • 8066 端口 映射到群晖的 80端口 (示例,http不安全)
  • 44366 端口 映射到群晖的 443端口

外网只支持HTTPS方式,这里我们映射443端口即可

在Photo station 中进行设置

设置 > 常规 > 路由器端口

  • 主机名称或固定IP:这里输入你的域名,如:xxx123.top
  • HTTPS: 44366 (上面映射的外网端口)

点击保存

外网只允许https访问,只要映射https端口即可

效果

外网通过 https://域名:端口 的方式登录DSM,点击Photo station时会自动跳转到 44366端口

如果内网是通过ip地址访问DSM,跳转时则是走的80 或 443 端口


Photo station权限

默认创建 “photo” 共享文件夹 无法在控制面板中设置权限

需要进入photo station 进行权限设置

黑群晖DS918 默认只支持2个网卡,为了验证一些问题,需要让其支持更多的网卡

修改说明

1、 SSH 登录群晖,切换的root用户

1
sudo -i

输入密码

2、修改synoinfo.conf配置文件

1
2
3
4
5
6
7
# vi /etc.defaults/synoinfo.conf 

# 找到
# maxlanport="2" # 这个2就表示支持2个网卡,我们这里改成4

# 保存退出并重启
reboot

黑群晖安装后复制文件速度没有达到预期值

千兆网卡:113MB/s
2.5G网卡:280MB/s

一、服务端配置

群晖下安装Docker套件

在docker中安装iperf3

注册表中搜索,安装星星最多的就行了

镜像下载好了之后点启动

然后选择高级设置:

  • 端口设置:将本地端口配置为5201
  • 环境 -> 执行命令,填写命令-s(设置为服务端)

二、客户端配置

在iperf3官网下载宽带测速软件

https://iperf.fr/iperf-download.php

在命令行中:

1
2
3
4
5
6
7
.\iperf3.exe -c 192.168.1.66

.\iperf3.exe -c 192.168.1.66 -t 300

.\iperf3.exe -c 192.168.1.66 -R -t 300

# -R 以反向模式运行(服务器发送,客户端接收)

参考:
https://kb.synology.cn/zh-cn/DSM/tutorial/What_can_I_do_to_access_mounted_folders_NFS

设置

1、开启服务
控制面板 -> 文件服务 -> SMB/AFP/NFS -> 勾选 启用NFS服务

为保证兼容性,建议勾选‘启用NFS v4.1支持’

2、设置共享文件的NFS权限
控制面板 -> 共享文件夹 -> 选择需要共享的文件 -> 编辑 -> NFS权限 -> 新增

  • 服务器名称或IP地址:*
    • 全部IP可以访问,也可以指定IP段等,如:192.168.31.1/24
  • 权限:可读写
  • Squash:映射所有用户为 admin (下面说明)
  • 安全性:sys

应用 NFS 权限后,您可在 NFS 权限选项卡的左下角找到共享文件夹的装载路径。装载路径应采用以下格式: /[volume name]/[shared folder name]

允许访问所有用户

如果要向所有用户授予相同权限,请设置Squash 选择每个文件/文件夹的NFS规则并选择将所有用户映射到admin 。

当使用此Squash选项设置NFS权限时,所有用户将被视为Synology NAS上的“管理员”并有权访问所有文件/文件夹。
当用户创建文件/文件夹时,文件/文件夹的创建者被列为“admin”。

向不同的用户提供不同的访问权限

如果您要为不同的用户提供不同的访问权限,您必须将所有计算机和Synology NAS加入同一个LDAP服务器。为Synology NAS 1上的每个文件/文件夹设置LDAP帐户权限,以便不同用户(LDAP帐户)可以通过相应权限访问文件/文件夹。然后,参阅本文以为每个文件/文件夹设置NFS规则,并为Squash选择无映射

注:
UID编号为0-125之间,仅供Synology NAS中的本地用户使用。若要设置LDAP UID,请使用大于1025的数字。

访问

参考:
https://kb.synology.cn/zh-cn/DSM/tutorial/How_to_access_files_on_Synology_NAS_within_the_local_network_NFS

安装软件

Ubuntu
1
2
sudo apt update
sudo apt install nfs-common
CentOS/Redhat/Fedora
1
sudo yum install nfs-utils

挂载目录

查看挂载目录

1
2
showmount -e 192.168.31.66

输入挂载命令以在客户端通过 NFS 装载共享文件夹

1
2
3
4
5
6
sudo mount -t nfs [Synology NAS IP address]:[mount path of shared folder] /[mount point on NFS client]


示例:
sudo mount -t nfs 196.168.x.x:/volumeX/test /mnt
mount -t nfs 192.168.31.66:/volume2/video /mnt/video

查看

输入disk free命令以确认您已成功装载共享文件夹。文件系统列中的输出应采用以下格式: [Synology NAS IP address]:[mount path of shared folder]

1
2
3
df -h

192.168.31.66:/volume2/video 3.5T 68G 3.5T 2% /mnt/video

其他

挂载不了时,检查一下命令,地址
ping一下ip
telnet一下端口: telnet 192.168.31.66 2049

参考:https://www.right.com.cn/forum/thread-4060167-1-1.html

方案一

两块硬盘做Raid1

缺点:

  • 果硬盘容量不一样,甚至一块是机械硬盘,另一块是SSD,就不好组Raid1
  • 硬盘完全镜像,很浪费硬盘空间。比如我的家庭照片很重要,下载电影不重要,我只想多个硬盘备份照片,不想备份电影,Raid1无法做到

方案二

用群晖自带的备份工具,如HyperBackup

缺点:

  • 不能实时备份,要设置定时备份时间,这个会引起群晖退出休眠
  • HyperBackup备份出来的是一个特殊的文件,无法直接打开使用,需要加挂

*方案三

webDAV 和 CloudSync

  1. 安装webDAV和CloudSync两个套件
  2. 设置webDAV,启用HTTP和HTTPS
  3. 然后打开CloudSync,添加同步,选webDAV
  4. 服务器输入 http://localhost:5005,并输入管理员账号密码,下一步
  5. 然后设置本地路径和远程路径,其中远程路径就是你这台群晖本机的需要备份的文件夹,本地路径就是备份文件夹
  6. 当有多个文件夹需要备份时新增多个备份即可
  7. 同步方向设置 选择【仅下载远程更改】

优点

  1. 同步是实时的,只要源文件夹有新文件,立即同步复制到备份文件夹,几乎没有任何延迟。不需要设置备份时间间隔
  2. 不影响休眠!如果长时间没有文件上传,群晖仍然可以正常休眠。(这个待验证,现在装了一堆东西,硬盘都已经不休眠了)
  3. 备份文件仍然是个普通文件夹,可以任意打开浏览、复制、删除,不像HyperBackup将文件打包
  4. 节省空间,你可以只同步重要的数据如照片,忽略电影
  5. 不限制硬盘类型,两个硬盘容量不同,类型是机械硬盘还是SSD,都无所谓的

黑群晖多个虚拟网卡,MAC地址一样

挂载引导分区

1
2
3
4
5
6
7
8
9
sudo -i
# 输入密码

echo 1 > /proc/sys/kernel/syno_install_flag
mkdir -p /tmp/synoboot1
mount /dev/synoboot1 /tmp/synoboot1
cd /tmp/synoboot1
ls -l

修改引导文件

1
2
3
4
cd grub/

vi grub.cfg

修改内容,在set mac1=xxxxx 后面增加set mac2=xxx set mac3=xxx
xxx 就是mac地址,按照格式填写就行了

1
2
3
4
5
set sn=1780PDN123458
set mac1=008132123456
set mac2=118132123457
set mac3=aa8132123458
set mac4=bb8132123459

之前已经将黑群晖 DS918+ 改成最多支持4个网卡了

Transmission是一种BitTorrent客户端,特点是一个跨平台的后端和其上的简洁的用户界面。Transmission以MIT许可证和GNU通用公共许可证双许可证授权,因此是一款自由软件。支持包括Linux、Mac OS X等多种操作系统(也有爱好者制作的windows安装包),以及Networked Media Tank、WD MyBook、ReadyNAS、D-Link DNS-323 & CH3SNAS、Synology等多种设备。支持GTK+、命令行、Web等多种界面。

其特点是开源、无广告,硬件资源消耗极少,界面极度精简,支持BT种子和磁力链接下载,支持web界面、远程控制等。

安装

  1. 设置默认下载文件夹
  2. 添加第三方套件源
    之前已经加过了:http://packages.synocommunity.com/
  3. 在“套件中心”-“社群”,就可以找到Transmission,点击安装

配置:

  1. 配置下载目录
  2. 设置登录的用户名和密码

默认的访问地址是:http://xxxxxx.xxx:9091/
需要在路由器上做端口映射

想要通过域名访问需要自己配置DDNS

配置Transmission Web Control

https://github.com/ronggang/transmission-web-control

汉化与加强Transmission Web的操作能力

ssh 到群晖上

切换到root

1
sudo -i

下载脚本并执行

1
2
3
4
5
6
7
wget https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control.sh

# 中文版本
wget https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control-cn.sh


sh install-tr-control.sh

选择1安装最小版本,直到安装完成

权限设置:

控制面板 –> 用户群组 –> sc-download

设置download目录权限为可读写

控制面板 –> 共享文件夹 –> 编辑download文件夹

设置权限 –> 系统内部账号 –> sc-transmission –> 可读写

为了能直接下载到video目录

控制面板 –> 用户群组 –> sc-download

设置video目录权限为可读写

控制面板 –> 共享文件夹 –> 编辑video文件夹

设置权限 –> 系统内部账号 –> sc-transmission –> 可读写

注意!
有些教程上是设置everyone可读写,这样是不安全的

外网访问

路由器做端口映射,默认端口:9091


使用https

进入群晖 –> 控制面板 –> 引用程序门户 –> 反向代理服务
新增一个:
来源

协议:https
主机名:*
端口:19091

启用HSTS
启用HTTP/2

目的地

协议:http
主机名:192.168.1.66
端口:9091

修改路由器上的端口应用:外网端口改成 19091,内网指向群晖的19091端口

访问:https://xxxxx.xxx:19091/transmission/web/


端口映射

进入 Transmission Web Control
进入设置–> 网络传输 –> 默认使用固定端口:51413

点击下方的测试端口,显示不可连接

在路由器上配置端口映射,将外网的51413端口映射到群晖(transmission)的51413端口

再次点击测试,显示端口可连接

测试系统PVE 7.0

PVE内核升级或降级

当前版本信息

1
2
3
4
5
6
7
8
9
10
11
# uname -r
5.11.22-1-pve


# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye

查找内核

1
2
3
4
5
6
7
8
9
10
# apt-cache search linux | grep 'PVE Kernel Image'

pve-kernel-5.11.17-1-pve - The Proxmox PVE Kernel Image
pve-kernel-5.11.21-1-pve - The Proxmox PVE Kernel Image
pve-kernel-5.11.22-2-pve - The Proxmox PVE Kernel Image
pve-kernel-5.11.7-1-pve - The Proxmox PVE Kernel Image
pve-kernel-5.4.119-1-pve - The Proxmox PVE Kernel Image
pve-kernel-5.4.124-1-pve - The Proxmox PVE Kernel Image
pve-kernel-5.4.128-1-pve - The Proxmox PVE Kernel Image

安装内核

1
2
3
4
5
6
7
8
9
# apt-get install pve-kernel-5.11.21-1-pve

apt-get install pve-kernel-5.4.128-1-pve

# 安装不了配置镜像
# 还不行挂代理

apt -o Acquire::http::proxy="http://192.168.1.100:10809/" install pve-kernel-5.4.128-1-pve

查看当前系统内核启动顺序

1
2
3
4
5
6
grep menuentry /boot/grub/grub.cfg

# 或者

cat /boot/grub/grub.cfg | grep menuentry

修改内核启动顺序

如果你升级的版本比当前内核版本高的话,默认新安装的内核就是第一顺序启动的,只需重启系统就行了,否则,则需要修改配置文件

找到上一步中的名称(启动到时候可以看到)
如:

Advanced options for Proxmox VE GNU/Linux
Proxmox VE GNU/Linux, with Linux 5.4.128-1-pve

修改/etc/default/grub中 GRUB_DEFAULT

可以使用顺序号(从0开始)或使用菜单名称

1
2
3
4
5
6
7
8
9
10
vi /etc/default/grub

# 将 GRUB_DEFAULT=0 修改想要的菜单,如果有二级菜单的,用> 符合指定
# 如这里的改成第二个菜单的第三项

GRUB_DEFAULT="1>2"

# 或者
#GRUB_DEFAULT="Advanced options for Proxmox VE GNU/Linux>Proxmox VE GNU/Linux, with Linux 5.4.128-1-pve"

注意有二级菜单时要有引号

其他示例:

  • GRUB_DEFAULT= “Previous Linux versions>Ubuntu, with Linux 3.2.0-18-generic-pae”
  • GRUB_DEFAULT= “Previous Linux versions>0”
  • GRUB_DEFAULT= “2>0”
  • GRUB_DEFAULT= “2>Ubuntu, with Linux 3.2.0-18-generic-pae”

更新引导并重启

1
2
3
4
update-grub

reboot

重启后,使用命令uname -r查看

1
2
# uname -r
5.4.128-1-pve


PS

因为在PVE下创建虚拟机 Realtek RTL8125 2.5GbE 的网卡 与1G的交换机连接 无法跑满速(只有大概20 ~ 40Mb/s),为降内核版本了安装 realtek-r8125-dkms_9.005.06-1_amd64.deb 驱动进行测试

实际上据说也是驱动bug,新的r8169驱动也支持这个网卡并且修复了这个bug,但是实际上测试并没有……

解决办法:

Chipset -> South Cluster Configuration -> PIC Express Configuration -> PCI Express Root Port

将全部PCI Express Root Port 的 ASPM 的Auto改成Disable

由于某些原因需要修改已经提交的代码里面的提交者名称和提交者邮箱

git filter-branch

https://git-scm.com/docs/git-filter-branch

git-filter-branch - 重写分支

描述(翻译的)

允许您通过重写 中提到的分支来重写 Git 修订历史记录,对每个修订应用自定义过滤器。这些过滤器可以修改每个树(例如删除一个文件或在所有文件上运行 perl 重写)或有关每个提交的信息。否则,将保留所有信息(包括原始提交时间或合并信息)。

该命令只会重写命令行中提到的正引用(例如,如果您传递a..b,则只会重写b)。如果您未指定过滤器,则将重新提交提交而不进行任何更改,这通常不会产生任何影响。尽管如此,这在将来可能对补偿某些 Git 错误等有用,因此允许这种用法。

注意: 此命令尊重命名空间.git/info/grafts中的文件和引用refs/replace/。如果您定义了任何移植或替换引用,运行此命令将使它们永久化。

警告! 重写后的历史将对所有对象具有不同的对象名称,并且不会与原始分支收敛。您将无法轻松地在原始分支之上推送和分发重写的分支。如果您不知道全部含义,请不要使用此命令,并且如果简单的单次提交就足以解决您的问题,请避免使用它。(有关重写已发布历史记录的更多信息,请参阅git-rebase[1] 中的“从上游重新数据库恢复”部分。)

操作

1、找个地方下载代码

1
2
cd /xxx/tmp
git clone git@github.com:xxxxx/xxxxxxx.git

2、修改提交信息

在项目目录下,随便创建一个xxx.sh,内容如下

修改下面的邮箱和用户名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git filter-branch --env-filter '
WRONG_EMAIL="wrong@example.com"
NEW_NAME="New Name Value"
NEW_EMAIL="correct@example.com"

if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
export GIT_COMMITTER_NAME="$NEW_NAME"
export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
export GIT_AUTHOR_NAME="$NEW_NAME"
export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

加执行权限

1
chmod +x xxx.sh

然后执行

1
./xxx.sh

3、检查

1
git log

看看提交人和提交邮箱是不是改了

4、强制提交

1
git push --force

多个分支时

切换到不同的分支执行xxx.sh
然后强行提交

如果提示:A previous backup already exists in refs/original/

就改改脚本,增加一个 -f 参数,强制执行

1
2
3
git filter-branch -f --env-filter '
...
...


之前已经有的本地代码

1、 删掉重新下载

整个项目目录删掉,重新clone 代码

2、强制更新为远端的版本

1
2
git fetch --all
git reset --hard origin/master

3、 删掉分支再重新检出分支

1
2
3
4
5
6
git branch -d xxxxx

git fetch --all
git branch -a

git checkout xxx
0%