systemd 设置环境变量

设置 systemd 的环境变量,有如下几种方式:

  • 1. 在 xxx.service 通过 Environment="MY_VAR_1=VAR_1_VALUE" 设置变量
  • 2. 在 xxx.service 通过 EnvironmentFile=/opt/workspace/my_env 指定配置文件
  • 3.systemctl edit xxx.service 或手动创建 /etc/systemd/system/xxx.service.d/override.conf 文件进行配置

同一个变量,在多个方式同时配置,会存在覆盖。建议只使用一种方式。

方式 1 Environment=

编辑 systemd 的 service 文件,添加 Environment= 形如下:

  • [Service]
  • Environment=“MY_VAR_1=VAR_1_VALUE”
  • Environment=“MY_VAR_2=VAR_2_VALUE”

上述添加了两个环境变量:MY_VAR_1=VAR_1_VALUE 和 MY_VAR_2=VAR_2_VALUE

如需修改环境变量,即修改 service 文件,需要重新 reload

  • systemctl daemon-reload

方式 2 EnvironmentFile=

编辑 systemd 的 service 文件,添加 EnvironmentFile= 形如下:

  • [Service]
  • EnvironmentFile=/opt/workspace/env_test.env
  • EnvironmentFile=-/opt/workspace/env_test_not_exist.env

上述指定了两个设置环境变量的文件:/opt/workspace/env_test.env 和 /opt/workspace/env_test_not_exist.env
需要注意的是,第二个 EnvironmentFile 使用 - 在目录前,作用是忽略文件不存在。

创建 /opt/workspace/env_test.env 格式如下

  • MY_VAR_1=VAR_1_VALUE
  • MY_VAR_2=VAR_2_VALUE

方式 3 创建 xxx.service.d/override.conf

创建这个文件,有两种方式,执行 systemctl edit xxx.service 后,进入 nano 编辑界面保存成文件即可。或者在 xxx.service 同目录下,创建 xxx.service.d 文件夹,在该文件夹下,创建 override.conf (文件名随便,一般为 override.conf )。

创建的文件格式如下:

  • [Service]
  • Environment=“MY_VAR_1=VAR_1_VALUE”
  • Environment=“MY_VAR_2=VAR_2_VALUE”

以 Debian 系统为例,一般 xxx.service 文件在 /etc/systemd/system/ 下,
所以创建的文件路径为 /etc/systemd/system/xxx.service.d/override.conf

引用:

How to set environment variable in systemd service?

PVE OP overlay分区扩容

官方镜像硬盘空间只有一百多兆,如果安装比较多的插件空间会比较紧张,需要扩容,网上找到使用最多的教程方法,不知道为什么在我这里一直无法成功扩容,常见教程都是将硬盘剩余空间新建分区,然后迁移overlay分区文件到新分区,再挂载为外部/overlay,或者迁移根目录下所有内容再挂载为根目录/,这两种我试了不下5次,均告失败,还有按openwrt官方方法也是未能成功扩容,最后找到较少见的直接扩容原overlay空间的方法,好不容易成功扩容,记录一下,以防忘记。

1. 安装必要工具

opkg install losetup parted cfdisk block-mount fdisk resize2fs

2. 调整硬盘大小

在pve中调整硬盘大小,然后启动虚拟机。

3. 扩容操作

ssh登录openwrt,运行以下命令:

cfdisk #查看硬盘分区信息,检查是不是有一个调整硬盘大小后多出来的free space,一般overlay目录挂载的是/dev/sda2

parted /dev/sda

print #查看硬盘信息,第二个分区即sda2,注意现在空间大小(size)

resizepart 2 100% #修改第二个分区sda2大小为100%,即将所有free space划入sda2

print #检查看空间大小是不是变了

losetup #记住/dev/loop0的offset偏移值

losetup -o offset偏移值 /dev/loop100 /dev/sda2 #offset偏移值换成上一命令显示的offset值,loop100可以改成其他,只要不跟现有loop设备重复就行

e2fsck /dev/loop100 #检查文件系统,一路按y确认就可以

resize2fs /dev/loop100 #修改分区空间大小

reboot #重启系统后可使用df -h命令检查overlay是不是变大了,或者进入软件安装界面查看剩余空间

至此完成overlay分区扩容。

Proxmox VE PCIe 直通 intel 核显开启 SRIOV

Proxmox VE PCIe 直通 intel 核显开启 SRIOV
cokebar 2024-04-04 17:35 2024-04-04 17:40 PVE 没有评论
主要参照:

https://pve.proxmox.com/wiki/PCI(e)_Passthrough

https://github.com/strongtz/i915-sriov-dkms

适用于Proxmox VE 8.x版本,内核6.1~6.5.

一、编译安装i915-sriov-dkms
首先确保启用了pve-no-subscription源和debian源,推荐先把debian源换成国内源 如清华源。

然后先更新一下软件包,并安装其他依赖,主要是需要确保内核头文件和内核版本一致,所以干脆全更新到最新版本:

Shell
apt update
apt upgrade -y
apt install -y build-* dkms git pve-headers sysfsutils
全部安装完毕后,需要先重启一下:

Shell
reboot
(有能力的可以尝试卸载旧版本内核和头文件,以节省空间)

重启好以后,接下来下载源码到指定位置:

Shell
cd /usr/src
git clone https://github.com/strongtz/i915-sriov-dkms.git
mv i915-sriov-dkms i915-sriov-dkms-6.1
找到/usr/src/i915-sriov-dkms-6.1/dkms.conf文件,修改如下两行,修改前为:

PACKAGE_NAME=”@_PKGBASE@”
PACKAGE_VERSION=”@PKGVER@”
修改后:

PACKAGE_NAME=”i915-sriov-dkms”
PACKAGE_VERSION=”6.1″
最后编译dkms模块并安装:

Shell
dkms install -m i915-sriov-dkms -v 6.1 –force
二、修改系统设置
定位到/etc/default/grub文件,打开编辑如下高亮这一行:

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=”quiet”
GRUB_CMDLINE_LINUX=””
把高亮的这一行修改为:

GRUB_CMDLINE_LINUX_DEFAULT=”quiet intel_iommu=on iommu=pt intel_iommu=on i915.enable_guc=3 i915.max_vfs=7″
打开/etc/modules文件,添加下面高亮的行:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.
# Parameters can be specified after the module name.

vfio
vfio_iommu_type1
vfio_pci
#vfio_virqfd #not needed if on kernel 6.2 or newer
PVE 8.1内核版本是6.5,大于6.2,最后一行不用写,故注释掉。

运行如下命令,查看显卡的PCI总线地址:

Shell
lspci | grep VGA
命令大致如下:

00:02.0 VGA compatible controller: Intel Corporation Raptor Lake-P [Iris Xe Graphics] (rev 04)
前面的 00:02.0 就是总线地址,不过是缩写地址,省略了前缀 0000: ,完整的是 0000:00:02.0 ,记住这个地址。

添加下面一行到 /etc/sysfs.conf 文件中:

devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7
上面命令中的 0000:00:02.0 就是前面获取的显卡的PCI总线地址,替换成你自己的就可以了。一般情况下intel核显都是 0000:00:02.0 这个地址,不用改。

运行命令:

Shell
update-grub
update-initramfs -u -k all
最后重启:

Shell
reboot
这样就完成了,最后看一下效果,下图中0000:00:02.1~0000:00:02.7这7个就是SRIOV虚拟出来的显卡:

相关文章:

Proxmox VE(PVE)8.0使用CT模板创建LXC版docker服务

Proxmox VE(PVE)8.0使用CT模板创建LXC版docker服务

前边已经分享了pve的安装,pve下安装爱快(ikuai)以及pve下安装openwrt实现旁路由,还想要弄一个docker来跑一些其他的服务,docker的安装有两种方式,一种是装一个linux的虚拟机,然后在里边来跑docker,另一种就是今天要介绍的使用CT模板来创建LXC容器跑docker。

CT模板下载

我这里使用的是debain12来当作模板,可以在pve里下载该模板。

pve ct debain

创建CT

常规

点击创建CT,这里的主机名随便给一个,因为我这里是要专门来运行docker,所以我这里填:docker, 密码是这个容器的登录密码,一定要牢记。另外要把无特权的容器取消勾选

pve ct docker common

模板

模板选择下载的debian模板

pve ct docker template

磁盘

磁盘大小根据自己的实际需要给

pve ct docker disk

CPU

cpu把j4125的4核都给过去

pve ct docker cpu

内存

我这里先给2GB,后续根据需求再添加

pve ct docker ram

网络

我这里手动指定了ip,可以使用dhcp自动分配ip

pve ct docker network

DNS

dns默认

pve ct docker dns

确认

刚才设置的一些信息的预览

pve ct docker confirm

创建完成后先不要开机,还需要一些其他的一些配置。

功能

在功能里勾选NFS等选项

pve ct docker function

LXC配置文件

还需要进入pve的shell,对刚创建的LXC容器的配置文件进行修改,位置:/etc/pve/lxc,此时里边应该只有1个配置文件,文件名对应创建的lxc容器在pve里的id。我的是102.conf

需要在后边再添加几行:

 

lxc.apparmor.profile: unconfined # 表示容器内的进程将不受任何 AppArmor 限制
lxc.mount.auto: cgroup:rw
lxc.mount.auto: proc:rw
lxc.mount.auto: sys:rw
lxc.cap.drop:  # 用于指定容器内进程的能力限制,允许进程执行一些特定的操作,例如修改系统时间、挂载文件系统等
lxc.cgroup.devices.allow: a

完整的配置如下:

 

root@pve:/etc/pve/lxc# cat 102.conf 
arch: amd64
cores: 4
features: fuse=1,mount=nfs;cifs,nesting=1
hostname: docker
memory: 4096
net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.1.253,hwaddr=BA:64:EF:29:04:A6,ip=192.168.1.22/24,type=veth
ostype: debian
rootfs: local-lvm:vm-102-disk-0,size=30G
swap: 512
lxc.apparmor.profile: unconfined
lxc.mount.auto: cgroup:rw
lxc.mount.auto: proc:rw
lxc.mount.auto: sys:rw
lxc.cap.drop: 
lxc.cgroup.devices.allow: a

配置完成后就可以正常启动该容器了。

更换源

源文件路径:/etc/apt/sources.list,替换为下边的内容。

root@docker:/etc/apt# cat sources.list
deb https://mirrors.ustc.edu.cn/debian bookworm main contrib
deb https://mirrors.ustc.edu.cn/debian bookworm-updates main contrib
deb https://mirrors.ustc.edu.cn/debian-security bookworm-security main contrib

查看是否替换成功,执行命令apt update:

root@docker:/etc/apt# apt update
Hit:1 https://mirrors.ustc.edu.cn/debian bookworm InRelease
Get:2 https://mirrors.ustc.edu.cn/debian bookworm-updates InRelease [55.4 kB]
Get:3 https://mirrors.ustc.edu.cn/debian-security bookworm-security InRelease [48.0 kB]
Get:4 https://mirrors.ustc.edu.cn/debian-security bookworm-security/main amd64 Packages [148 kB]
Hit:5 https://download.docker.com/linux/debian bookworm InRelease
Fetched 251 kB in 1s (228 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
51 packages can be upgraded. Run 'apt list --upgradable' to see them.

可见已经替换成功。

SSH登录

默认情况下只能通过pve的控制台进行登录,无法在其他地方进行登录。

修改sshd的配置文件,文件路径:/etc/ssh/sshd_config,添加下边的内容:允许root登录,开启key登录:

PermitRootLogin yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

如果只想使用key登录,禁止密码登录可以再添加一行:PasswordAuthentication no 。根据自己需求添加。

时区设置

默认情况下是0时区:

root@docker:~# date 
Sun Mar 24 07:04:09 UTC 2024
root@docker:~# date -R
Sun, 24 Mar 2024 07:04:11 +0000

修改为北京时间:

root@docker:~# timedatectl set-timezone Asia/Shanghai
root@docker:~# timedatectl
               Local time: Sun 2024-03-24 15:06:22 CST
           Universal time: Sun 2024-03-24 07:06:22 UTC
                 RTC time: n/a
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no

可以看到已成功设置为北京时间了。

整个LXC容器已设置完成。

解决Linux navidrome 下音乐乱码的问题:

解决Linux下音乐乱码的问题:

MP3文件乱码的原因:

这个问题出现在mp3文件里,由于大陆大多数MP3文件都是用GBK/GB18030编码写入标签信息的,而大多数的linux播放器默认以utf-8编码读取,这就产生了乱码。

解决方法:

使用Mutagen来修改Mp3文件的标签信息,具体方法如下(只针对GBK/GB18030编码的情况):

安装Mutagen:

https://www.geeksforgeeks.org/how-to-install-mutagen-for-python-on-linux/

sudo apt-get install python-mutagen

sudo pip3 install mutagen

在终端执行:

mid3iconv -e gbk *.mp3(转换当前目录下的所有 mp3)

想转换当前目录及子目录则执行:

find . -iname “*.mp3” -execdir mid3iconv -e gbk {} \;

解决Linux下音乐乱码的问题:

gsettings set org.gnome.gedit.preferences.encodings auto-detected “[‘UTF-8′,’GB18030′,’GB2312′,’GBK’,’BIG5′,’CURRENT’,’UTF-16′]”

然后再用gedit打开文件

修改PVE容器CT镜像源

修改PVE容器CT镜像源

原文参照

http://mirrors.ustc.edu.cn/help/proxmox.html

CT Templates

另外,如果你需要使用 Proxmox 网页端下载 CT Templates,可以替换 CT Templates 的源为 http://mirrors.ustc.edu.cn

具体方法:将 /usr/share/perl5/PVE/APLInfo.pm 文件中默认的源地址 http://download.proxmox.com 替换为 https://mirrors.ustc.edu.cn/proxmox 即可。

可以使用如下命令:

cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back
sed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm

针对 /usr/share/perl5/PVE/APLInfo.pm 文件的修改,执行systemctl restart pvedaemon 以生效

CT无法启动

在第一次启动CT时,我遇到了无法启动问题,报错信息为WARN: old systemd (< v232) detected, container won't run in a pure cgroupv2 environment! Please see documentation -> container -> cgroup version. TASK WARNINGS: 1,翻阅PVE官方文档未找到想要答案,只注意到这个错误应该与systemd有关,但我的主机systemd版本为247,不应该版本过低。

最后运行apt list --upgradable时发现systemd可以从247.3-7+deb11u4升级到247.3-7+1-pmx11u1,后者来源于promox源,前者来源与debian源,意识到可能是debian源的systemd不支持CT所需要的特性,于是apt upgrade and reboot,重启后CT启动成功。

PVE更新系统

apt updgrade过后再次apt upgrade ,发现有3个包显示kept backed,虽然可以正常使用,但逼死强迫症。通过PVE论坛帖子发现,我的更新方式有问题。

一般debian的服务器为了稳定都选择使用apt updgrade来更新系统,但是PVE需要使用apt dist-upgradeapt updgrade会破坏PVE依赖。PVE的web面板里面的更新按钮就是使用apt dist-upgrade,PVE官方手册也推荐它。

Docker容器如何备份?

Docker容器如何备份?

发布于 2021-11-01 15:36:14
5.1K0
举报
文章被收录于专栏:测试工程师成长之道

背景:

为什么要备份容器?

作为一名合格的程序猿, 时时刻刻都要思考应用或者(service)的容错以及灾备, 他是保障我们日后快速恢复工作必不可少的条件.

容器由于种种原因会损坏而无法正常work, 这时候全公司的人都等着这个系统使用, 这是后排查问题还不如直接使用一个备份镜像更为便捷和快速 .

备份容器:

1. 在远程主机上查看当前容器列表

docker ps -a

[zhouhuwei@localhost ~]$ docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

403e6db0c jenkins/jenkins “/sbin/tini — /usr/…” 9 days ago Up 9 days 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins

a7d775e3d mysql “docker-entrypoint.s…” 10 days ago Up 9 days 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp

2.制作容器备份

docker commit -p 403e6db0c jenkins_backup

其中 403e6db0c 是容器id, jenkins_backup是备份名称

3. 查看备份是否成功

docker images

[zhouhuwei@localhost ~]$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

mysql_backup latest a35fea6c 37 minutes ago 514MB

jenkins_backup latest edfced2 38 minutes ago 444MB

确认已经成功备份

4. 将镜像制作成文件

说明:

使用docker save 可能需要使用root权限

保存的命令是:

docker save -o [filename] [image]

[zhouhuwei@localhost ~]$ docker save -o jenkins_backup.tar jenkins_backup

[zhouhuwei@localhost ~]$ ls

jenkins_backup.tar

备份文件制作完成

5. 在本地使用命令将镜像从远程备份到本地

louie-mac:~ louiezhou$ scp zhouhuwei@192.168.10.10:/home/zhouhuwei/jenkins_backup.tar /Users/louiezhou/home/sf/DockerImageBackup

zhouhuwei@192.168.10.10’s password:

jenkins_backup.tar 100% 639MB 7.7MB/s 01:23

备份到本地目录是:/Users/louiezhou/home/sf/DockerImageBackup

到此就将镜像备份到本地, 我们去对应目录check下:

louie-mac:~ louiezhou$ cd /Users/louiezhou/home/sf/DockerImageBackup

louie-mac:DockerImageBackup louiezhou$ ls -lh

total 1310752

-rw——- 1 louiezhou staff 639M 10 18 10:42 jenkins_backup.tar

恢复容器:

1. 为了验证容器是否能正常导入, 先删除docker 里的镜像

docker rmi jenkins

2.导入

docker load < /Users/louiezhou/home/sf/DockerImageBackup/jenkins_backup.tar

louie-mac:sf louiezhou$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

jenkins_backup latest edfced27a56e 32 minutes ago 444MB

3.运行镜像

sudo docker run -p 8080:8080 -name jenkins -d jenkins_backup

4. 启动成功

903e6db0c jenkins/jenkins “/sbin/tini — /usr/…” Up 1 min 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins

温馨提示:文字上有错位的建议在电脑端阅读更为友好.

Expanding root partition and filesystem

Expanding root partition and filesystem

  • This instruction expands OpenWrt root partition and filesystem on x86 target.
  • Follow the automated section for quick setup.
  • Support ext4 and squashfs image types.
  • Automatically identify the root partition and filesystem.
  • Expand the root partition and filesystem using free space.
  • Preserve the scripts through firmware upgrade.
  • Automatically run after firmware upgrade.
# Configure startup scripts
cat << "EOF" > /etc/uci-defaults/70-rootpt-resize
if [ ! -e /etc/rootpt-resize ] \
&& type parted > /dev/null \
&& lock -n /var/lock/root-resize
then
ROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \
'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"
ROOT_DISK="/dev/$(basename "${ROOT_BLK%/*}")"
ROOT_PART="${ROOT_BLK##*[^0-9]}"
parted -f -s "${ROOT_DISK}" \
resizepart "${ROOT_PART}" 100%
mount_root done
touch /etc/rootpt-resize
reboot
fi
exit 1
EOF
cat << "EOF" > /etc/uci-defaults/80-rootfs-resize
if [ ! -e /etc/rootfs-resize ] \
&& [ -e /etc/rootpt-resize ] \
&& type losetup > /dev/null \
&& type resize2fs > /dev/null \
&& lock -n /var/lock/root-resize
then
ROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \
'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"
ROOT_DEV="/dev/${ROOT_BLK##*/}"
LOOP_DEV="$(awk -e '$5=="/overlay"{print $9}' \
/proc/self/mountinfo)"
if [ -z "${LOOP_DEV}" ]
then
LOOP_DEV="$(losetup -f)"
losetup "${LOOP_DEV}" "${ROOT_DEV}"
fi
resize2fs -f "${LOOP_DEV}"
mount_root done
touch /etc/rootfs-resize
reboot
fi
exit 1
EOF
cat << "EOF" >> /etc/sysupgrade.conf
/etc/uci-defaults/70-rootpt-resize
/etc/uci-defaults/80-rootfs-resize
EOF
# Install packages
opkg update
opkg install parted losetup resize2fs
 
# Expand root partition/filesystem
sh /etc/uci-defaults/70-rootpt-resize
wget -U "" -O expand-root.sh "https://openwrt.org/_export/code/docs/guide-user/advanced/expand_root?codeblock=0"
. ./expand-root.sh

解决OpenWrt桥接PPPoE模式下无法访问光猫

问题描述

很多人将光猫改为桥接模式(或者使用猫棒),使用OpenWrt路由器拨号后,发现不能再通过路由器访问光猫后台了。

问题分析

光猫改桥接后,会把PPPoE的帧直接透传给上行接口,对于OpenWrt路由器来说,就像直接用一根网线连接了远端PPPoE服务器,所以当我们访问192.168.1.1时,数据直接发送给了远端服务器,所以无法访问光猫。

解决方法

光猫Lan IP:192.168.1.1

路由器Lan IP:192.168.2.1

1、OpenWrt修改本地Lan IP地址,网络 -> 接口 -> lan(编辑) -> 常规设置,IPv4地址改为192.168.2.1,默认是192.168.1.1和光猫的192.168.1.1的冲突了,所以需要改为其他的。

422-1.png

2、网络 -> 接口 -> WAN(编辑) -> 高级设置,使用网关跃点从0改为其他(大于0即可),保存并应用设置。

422-2.png

3、网络 -> 接口 -> 添加新接口,名称随便(如model),协议选择静态地址,设备选择连接光猫的网口(如eth1),点击创建接口

422-3.png

4、网络 -> 接口 -> model(编辑) -> 常规设置,IPv4地址填入192.168.1.x(如192.168.1.2),IPv4子网掩码选择255.255.255.0,IPv4网关填写192.168.1.1,切换到高级设置,去除使用默认网关的勾,点击保存

422-4.png

422-6.png

5、网络 -> 路由 -> 添加,接口选择model(上一步增加的接口),路由类型选择unicast,目标填写192.168.1.0/24,网关填写192.168.1.1,点击保存再应用

422-5.png

6、重启OpenWrt路由器,然后测试访问192.168.1.1,可以看到光猫的登陆界面了。

422-7.png