作者归档:Dasmz

Debian 12系统下,安装chrome浏览器,安装chrome driver

前缀、文档修改记录

20250509 初始化编辑此文章,完稿

章节1、需求描述

Debian 12系统下,安装chrome浏览器,配套安装chrome driver,以便用程序来驱动Chrome浏览器

章节2、操作步骤

2.1、安装必要的工具

root@server:~# apt update
root@server:~# apt install wget curl unzip

2.2、下载Chrome浏览器

root@server:~# mkdir -p /root/src

root@server:~# cd /root/src

root@server:~# wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
  // 从 Google 官方下载安装包

2.3、安装Chrome浏览器

使用 dpkg 安装,如果有依赖问题,再用 apt 修复即可

root@server:~#  cd /root/src/

root@server:~#  dpkg -i google-chrome-stable_current_amd64.deb
  // 本次安装到的版本是136.0.7103.92-1 Tag-2025-5-9

root@server:~#  apt --fix-broken install -y
  // 执行路径 /usr/bin/google-chrome

确认版本信息

root@server:~#  /usr/bin/google-chrome -version
Google Chrome 136.0.7103.92  

// Tag-2025-5-9 输出版本号,说明安装成功

2.4、下载和安装 ChromeDriver

ChromeDriver 版本需要和 Chrome 浏览器版本对应,所以,刚刚安装的Chrome版本务必记录下来。

低于115的版本的官方地址 https://chromedriver.chromium.org/downloads

https://developer.chrome.com/docs/chromedriver/downloads

图/官方提示:

高于115或者更新版本的官方地址 https://googlechromelabs.github.io/chrome-for-testing/

下载其中chromedriver的linux64版本即可,https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.92/linux64/chromedriver-linux64.zip

root@server:~#  cd /root/src/

root@server:~#  wget https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.92/linux64/chromedriver-linux64.zip
  // 版本编号要跟Chrome浏览器的一致


root@server:~# unzip chromedriver-linux64.zip
Archive:  chromedriver-linux64.zip
  inflating: chromedriver-linux64/LICENSE.chromedriver  
  inflating: chromedriver-linux64/THIRD_PARTY_NOTICES.chromedriver  
  inflating: chromedriver-linux64/chromedriver  
root@server:~#  

root@server:~# mv chromedriver-linux64/chromedriver /usr/bin/chromedriver
root@server:~# chmod +x /usr/bin/chromedriver
  // 挪目录,赋权限

root@server:~# chromedriver --version
  // 确认版本号,显示就是正常的,务必跟Chrome版本一致

章节3、测试代码

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# by Dasmz
# 2025-5-9
# 
import time
import random
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

CHROMEDRIVER_PATH = '/usr/bin/chromedriver'
SCREENSHOT_PATH = '/var/www/html/ScreenShot.png'

URL_LIST = ['URL1','URL2','URL3','URL4','URL5'...]

def getNow():
    now = datetime.now()
    return now.strftime("%Y-%m-%d %H:%M:%S")
    
def create_driver(user_agent):
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')  # 无界面模式
    chrome_options.add_argument("--window-size=1920x1080")  # 窗口大小
    chrome_options.add_argument('--disable-gpu')   # 关闭GPU加速
    chrome_options.add_argument("--mute-audio")   # 关闭声音
    chrome_options.add_argument("--no-sandbox")   # 无沙箱
    chrome_options.add_argument("--disable-dev-shm-usage")  # 不使用/dev/shm共享内存目录
    chrome_options.add_argument("--disable-extensions")   # 关闭扩展程序
    chrome_options.add_argument("--log-level=3")   # 只显示致命错误FATAL
    chrome_options.add_argument('--disable-application-cache')   # 关闭 Chrome 的应用缓存,包括页面缓存、离线缓存
    chrome_options.add_argument('--incognito')   # 隐身模式,每次打开网页都是新会话,不会用缓存、也不会保存 cookie
    chrome_options.add_argument('--disk-cache-size=0')   # 磁盘缓存设为 0 字节
    chrome_options.add_argument(f"--user-agent={user_agent}")
    
    # 禁止图片加载
    # prefs = {"profile.managed_default_content_settings.images": 2}
    # chrome_options.add_experimental_option("prefs", prefs)
    
    driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=chrome_options)
    driver.set_window_size(1920, 1080)   # 设置分辨率 (宽, 高)
    return driver

def run_chrome(driver, url):
    try:
        driver.get(url)
        # 等待 body 元素加载完成
        time.sleep(1.5)  # 给浏览器的网页加载的时间
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
        
        print(f"标题: {driver.title}")
        print(f"URL: {driver.current_url}")
        # print(f"页面源码长度: {len(driver.page_source)}")
        
        # 网页加载情况截图
        driver.save_screenshot(SCREENSHOT_PATH)
    except Exception as e:
        print(f"出错: {e}")

def go2web(driver):
    try:
        target_url = random.choice(URL_LIST)
        run_chrome(driver, target_url)
    except Exception as e:
        print(f"访问出错: {e}")

if __name__ == '__main__':
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
    
    driver = create_driver(user_agent)
    
    try:
        for i in range(1, 40000000):
            print(f"\n\n第 {i} 次访问 {getNow()}")
            go2web(driver)
            # time.sleep(1)  # 可调整等待时间
    except KeyboardInterrupt:
        print("手动中断")
    finally:
        driver.quit()

附录1、视频操作演示

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

基于LNMP架构,安装WordPress博客

前缀、文档修改记录

20250409 初始化编辑此文章,完稿

章节1、需求描述

搭建一个自己的Wordpress博客

整体的操作步骤就是

参照 https://dasmz.com/?p=3629 安装LNMP的基础环境

参照 https://dasmz.com/?p=1544 配置一个Wordpress的库

CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'wordpress_57AADFEF668Ae2E8E6285858';

create database wordpress character set utf8mb4 collate utf8mb4_bin;

GRANT ALL privileges ON wordpress.* to wordpress@localhost;

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON wordpress.* TO wordpress@localhost;

flush privileges;

exit

参照本篇的内容,完成剩余的搭建过程,一个简易的博客搭建过程就此完成

章节2、搭建工作

以下的步骤,务必在前面LNMP环境和Wordpress数据库已创建之后,进行操作

WordPress官网 https://wordpress.org/download/

中文站 https://cn.wordpress.org/download/

可以看到,截至当前时间2025-4-9 22:33,可以下载到最新的版本是6.7.2

WordPress 6.7.2建议的环境配置为 >= PHP 7.4 ; >= MySQL/ 8.0 ; >= MariaDB version 10.5

在服务器上执行命令

apt update
apt install wget unzip
cd /var/www/
chown -R www-data:  ./html
cd ./html 
wget https://cn.wordpress.org/latest-zh_CN.zip   # 如果是国内服务器站点
wget https://wordpress.org/latest.zip   # 如果是海外服务器站点
unzip latest-zh_CN.zip
mv ./wordpress/*  ./
rm -r ./wordpress

那么接下来就可以通过浏览器进行Wordpress的初始化配置了

http://10.11.11.102/wp-admin/setup-config.php

http://10.11.11.102/index.php

添加前面自定义的数据库的用户名,密码,访问地址(如果库不在本机的话,这里填数据库的IP地址)

接下来,就是定义你网站的标题,管理员的用户名,强口令,一个可用于找回密码的管理员邮箱。

成功

后面通过 http://10.11.11.102/wp-login.php 即可登录Wordpress的控制台了,后面自己选择主题,或插件安装即可

附录1、视频操作演示

000159. 基于LNMP,搭建自己的Wordpress博客 2025-04-10

本期博客地址 https://dasmz.com/?p=4470
本期视频地址 https://youtu.be/EoBzi6IfNLs

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

WordPress的Bravada主题,修改页脚,增加版权信息 2025-1-14

前缀、文档修改记录

20250114 初始化编辑此文章,完稿

章节1、需求描述

WordPress的Bravada主题,我一个文字站点用了这个主题,到了新的一年,忘记怎么修改页脚的版权和时间信息了

章节2、修改位置

修改路径: 仪表盘 / 外观 / 自定义 / 常规 / 结构 / 自定义页脚文字

©2022~2025 - 这是个有趣的灵魂

有些东西,还是要动动手,记录下来

附录1、视频操作演示

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

来看看我如何下载X/Twitter视频 2024-12-05

前缀、文档修改记录

20241205 初始化编辑此文章,完稿,支持X视频
20250512 更新代码,支持Youtube Shorts了

章节1、需求描述

日常刷X/Twitter的话,经常看到一些有趣的视频,想要随手保存下来,这个需求,其实应该还是蛮普遍的。

本篇博客,不同于以往的下载方式,本篇介绍了组合使用 服务器 / youtube-dl / rsync的方式,可以非常便捷地下载X/Twitter视频了。

章节2、简略架构拓扑图

2.1、 环境说明:

1、 日常使用的苹果手机 * 1 ,里面配置章节4的捷径

2、 API服务器,操作系统Debian,安装了youtube-dl / ffmpeg / python3 / rysnc, python3的库调用了 Flask, request, jsonify,定义了一个临时存储视频的目录 /var/www/html/shortsv/

3、家里的服务器,挂载了NAS的存储路径,使用定时的rsync同步,小时粒度,同步视频文件到家里的NAS存储。

2.2、 流量说明

1、 苹果手机,日常用的X/Twitter客户端,如果刷到某个视频,则通过分享按钮,分享到捷径里的接口

2、捷径里,本质就是一个JSON传参数,把刚刚的X/Twitter的视频地址,传给服务器的API接口

3、服务器的API接口,接受到传参,调用已部署的youtube-dl/ffmpeg程序,下载并合并对应的视频

4、家里的Linux服务器,通过rsync每小时定时下载并同步服务器对应目录下的视频,下载到挂载的NAS目录里,下载动作完成后,清空远程服务器上的视频目录下的所有视频文件。

2.3、 优势分析

  • 成本低: 相比于充值X/Twitter会员,该方式可以下载高清的视频,还是很棒的,海外服务器挑个便宜的买就行。
  • 省手机流量: 相比于原先必须在手机上喊机器人跳出下载链接,手机上另存到相册,这个方式直接是文本传参,家里的NAS同步服务器下载的视频,没有Double手机流量的消耗,毕竟不是随时随地有WIFI。
  • 操作简单: 苹果手机上,在视频下方,直接调用捷径,等待在远端服务器上下载完成的提示即可。

章节3、 海外的远端服务器上的接口代码

如下,简略版本的,更容易维护,不过最好每次让请求都通过VPN走,不要明文传递参数到海外的服务器。

需要自定义的参数

var_cookies:  比选参数,这个是你本地浏览器登录了Twitter后,用浏览器插件Get cookies.txt LOCALLY导出的cookies.txt
var_listen_port:    可选修改,这个是API接口的在远程服务器上的监听端口
# 远程服务器上,需要执行的命令
apt update

apt install ffmpeg rsync python3 

mkdir -p /var/www/html/shortsv/

wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.03/yt-dlp -O /usr/bin/yt-dlp

chmod +x /usr/bin/yt-dlp

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2024-7-30
# api_getvideo.py V2025-05-10
#   注意点: 创建路径 mkdir -p /var/www/html/shortsv/
# Dasmz

from flask import Flask, request, jsonify
import subprocess
import json
import datetime

app = Flask(__name__)

def getNow():
    return datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")

@app.route('/', methods=['GET'])
def return_index():
    return '<p>THE API INTERFACE WORKS OK. TIME: %s</p>' % getNow(), 200

@app.route('/getV', methods=['POST'])
def download_video():
    try:
        data = request.json
        print(json.dumps(data))
        myURL = data.get('twitter_url')
        # print(f'{myURL}')
        if 'x.com' not in myURL and 'youtube.com' not in myURL:
           print("URL is Error!")
           return jsonify({'error': 'Invalid URL'}), 400
        # 用时间戳来命名文件 防止出现文件名过长 存档失败
        o_filename = '/var/www/html/shortsv/%s' % getNow()
        # 选择最高可用分辨率的视频流和音频流 合并为单个文件输出
        output = subprocess.check_output([
            '/usr/bin/yt-dlp',
            '-k',
            '--cookies', '/root/sh/cookies.txt',
            '-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]',
            '-o', o_filename + '.%(ext)s',
            myURL
        ])
        return jsonify({'message': 'Video downloaded successfully'}), 200
    except FileNotFoundError:
        return jsonify({'error': 'yt-dlp command not found'}), 500
    except subprocess.CalledProcessError as e:
        return jsonify({'error': str(e)}), 500


if __name__ == '__main__':
    #app.run(host='0.0.0.0', port=6969, debug=True)
    app.run(host='0.0.0.0', port=6969)

章节4、苹果手机的捷径

https://www.icloud.com/shortcuts/4ce720db10a446008e9fad7c18d5feb1

需要自定义的参数是,传参至的远程的海外API服务器地址

章节5、 国内的家里的服务器的配置

配置定时同步的程序,每日自动重启任务,路径 /root/sh/restart_rsyncdata_service.sh

#!/bin/bash
# NAME: /root/sh/restart_rsyncdata_service.sh
# PATH
cd /root/sh/

# STOP
echo "<+>  STOP THE SERVICE"
/usr/bin/ps -ef | grep rsyncdata_shorts | grep -v grep | awk '{print $2}' | xargs kill -9
echo "<+>  STOP THE SERVICE. DONE"

# START
echo "<+>  START THE SERVICE"
/usr/bin/nohup /root/sh/rsyncdata_shorts.sh 2>&1 > /root/sh/Log_rsyncdata_shorts.log &
echo "<+>  START THE SERVICE. DONE"

# END

root@JellyfinServer:~# 

文件 /root/sh/rsyncdata_shorts.sh, 如下内容

#!/bin/bash
# NAME: /root/sh/rsyncdata_shorts.sh
# /media/TV/HDD0104TB/ShortsV/  本地存储路径

for i in `seq 0 24`
do
  date > /root/sh/rsyncdata_shorts.timestamp.dat
  /usr/bin/ssh -i /root/sh/key_id_rsa_2048.key -p 22 root@你服务器的IP地址 'rm -r /var/www/html/shortsv/*fhls*'
  /usr/bin/rsync -avz -e "ssh -i /root/sh/key_id_rsa_2048.key -p 22" --progress root@你服务器的IP地址:/var/www/html/shortsv/*mp4 /media/TV/HDD0104TB/ShortsV/
  /usr/bin/ssh -i /root/sh/key_id_rsa_2048.key -p 22 root@你服务器的IP地址 'rm -r /var/www/html/shortsv/*'
  /usr/bin/sleep 3600
  date >> /root/sh/rsyncdata_shorts.timestamp.dat
done
# END

定时任务

# rsync 数据  shorts短视频数据
59 1 * * *  /root/sh/restart_rsyncdata_service.sh 2>&1 > /root/sh/Log_restart_rsyncdata_service.log

附录1、视频操作演示

000156. 都快2025年了,来看看我如何下载X/Twitter视频 2024-12-05

本期博客地址 https://dasmz.com/?p=4334
本期视频地址 https://youtu.be/pIDbwmerGj0

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

自动定时刷新网页,硬刷新,浏览器插件 2024-11-04

前缀、文档修改记录

20241104 初始化编辑此文章,完稿

章节1、需求描述

接到一个对XXX网页,刷访问量的需求,最好要慢刷,低并发,页面有统计,最好使用真实的浏览器进行。

这个时候,按照这样的需求,推荐大家用Edge或者谷歌浏览器的”Auto Refresh Plus | Page Monitor”, 插件出品方为“autorefresh.io”

章节2、安装及使用

安装过程跟安装其他插件,没有什么区别,访问谷歌浏览器商店,搜索其名称”Auto Refresh Plus | Page Monitor”,点击添加到浏览器即可。

其整个工作界面非常容易上手,第一行是插件版本,开始按钮,声音提示按钮。

下面是对网页刷新的时间间隔设置,也可以取随机时间值。

硬刷新:这个比较重要,一些网页统计的值,要从后台看到你的请求,这个参数就必须够上,这样就不会命中本地浏览器的缓存。

设置刷新次数:比如XXX网页要刷10万次的访问,这个地方可以勾选,并设置数值100000

在网页上显示视觉计数器:一般不需要勾选。

在用户交互时停止刷新:针对某些网页,刷新过密会出现登录窗口等场景,这个可以勾上。

普通的网页,其实就是设置一个时间间隔、勾选硬刷新,即可点击开始按钮,开启刷新网页访问的任务。

附录1、视频操作演示

本期博客地址 https://dasmz.com/?p=4292
本期视频地址 https://youtu.be/OfIFrKhG5j0
博客地址 https://dasmz.com

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

编译安装HaProxy 2024-10-25

前缀、文档修改记录

20241025 初始化编辑此文章,完稿,文章中的最新稳定版本,为书写此文时间的v3.0.5
20241119 更新到v3.0.6版本
20241121 更新小部分内容

章节1、需求描述

在Debian/Ubuntu系列系统上,编译安装最新稳定版本的haproxy version v3.0.X,该版本为LTS,支持到2029年Q2季度。

地址: http://git.haproxy.org/git/haproxy-3.0.git/

下载地址: https://www.haproxy.org/download/3.0/src/haproxy-3.0.6.tar.gz

章节2、编译步骤

实测通过,用的Ubuntu 20.04.2 LTS、Debian 12系统环境,建一个 src目录,供放置软件源代码压缩包

mkdir -p /root/src/

cd /root/src/
wget https://www.haproxy.org/download/3.0/src/haproxy-3.0.6.tar.gz

如果是内网环境,使用任意工具,把本地的haproxy-3.0.6.tar.gz文件传输到服务器的目录 /root/src/haproxy-3.0.6.tar.gz

安装必要的依赖

apt update
apt install -y gcc make build-essential libpcre3-dev libssl-dev zlib1g-dev libsystemd-dev

解压源代码的压缩包

cd /root/src/
tar -zxvf haproxy-3.0.6.tar.gz
cd haproxy-3.0.6/

创建一些必要的用户和目录

mkdir -p /etc/haproxy  /var/lib/haproxy  /run/haproxy
useradd -U -s '/usr/sbin/nologin' -d '/var/lib/haproxy' haproxy
cd /var/lib/
chown -R haproxy:haproxy ./haproxy
cd /run/
chown -R haproxy:haproxy ./haproxy

编译安装

// 编译
cd /root/src/haproxy-3.0.6/
make TARGET=linux-glibc USE_SYSTEMD=1 USE_OPENSSL=1 USE_ZLIB=1 USE_PCRE=1

编译参数选项说明:
TARGET=linux-glibc:指定目标平台,我这里是64位的X86_64系统。
USE_OPENSSL=1:开启 SSL 支持。
USE_ZLIB=1:开启 zlib 支持,用于压缩响应数据。
USE_PCRE=1:启用 PCRE 库支持正则表达式。
USE_TFO=1:可选,启用 TFO 支持,TCP Fast Open,适合延迟敏感的应用,如负载均衡、Web 服务
// 可选,配套需要开启 /proc/sys/net/ipv4/tcp_fastopen 置于3,开启同时支持客户端和服务器端的TFO
USE_LUA=1:可选,启用 Lua 脚本支持
USE_SYSTEMD=1:可选,启用systemd管理 HAProxy服务


// 安装
make install

// 执行文件
cp ./examples/haproxy.init  /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy

查看一下版本信息

/usr/local/sbin/haproxy -v

创建配置相关的目录

mkdir -p /etc/haproxy  /var/lib/haproxy  /run/haproxy

创建一个空的配置文件,配置文件的内容定义,这个根据你们业务的实际来:

touch /etc/haproxy/haproxy.cfg

写入一个简单的测试内容,轮循2个后端HTTP的WEB

global
   strict-limits 

defaults
   mode http
   balance random      # power-of-two-choices
   timeout client 60s
   timeout server 60s
   timeout connect 1s

listen p
   bind :8000
   balance roundrobin
   server server_web01    47.1.2.101:11111 check inter 8000 rise 2 fall 3 weight 1 maxconn 8192
   server server_web02    47.3.4.102:12222 check inter 8000 rise 2 fall 3 weight 1 maxconn 8192


用curl命令,测试一下访问

admin@Desktop:~$ curl http://122.222.100.83:8000
<p>S01</p>
admin@Desktop:~$ curl http://122.222.100.83:8000
<p>S02</p>
admin@Desktop:~$ curl http://122.222.100.83:8000
<p>S01</p>
admin@Desktop:~$ curl http://122.222.100.83:8000
<p>S02</p>
admin@Desktop:~$ 

创建一个haproxy名称的服务文件

cat > /etc/systemd/system/haproxy.service << EOF
[Unit]
Description=HAProxy Load Balancer
After=network.target

[Service]
ExecStart=/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
ExecReload=/bin/kill -USR2 \$MAINPID
KillMode=mixed
Restart=always

[Install]
WantedBy=multi-user.target
EOF

启动停止命令

systemctl daemon-reload
systemctl start haproxy    # 启动
systemctl stop haproxy    # 停止
systemctl enable haproxy    # 自动开机启动
systemctl status haproxy    # 查看状态

附录1、视频操作演示

本期博客地址 https://dasmz.com/?p=4263
本期视频地址 https://youtu.be/oYm4jI1TTdo

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

忘记Debian 12系统的root密码,通过单用户重置密码 2024-10-13

前缀、文档修改记录

20241013 初始化编辑此文章,完稿

章节1、需求描述

真无语,一台Debian 12的Linux系统的root密码忘记了,因为是云主机,还好商家提供VNC的console页面,这样就可以通过单用户的方式,重置密码。

章节2、操作步骤

开机,在grub的引导页面,在“Debian GNU/Linux” 这行的时候,按键盘的“e”,进编辑模式

如下图,将光标移动到“ linux /vmlinuz-5.10.0-29 …. ” 这个linux开头的行,并在行的末尾增加

 init=/bin/bash

增加完,根据下面的提示,按Ctrl+X 或者F10启动

确保分区具备rw权限,并重置root密码

mount -o remount,rw /
password root

重置密码完成后,正常重启云主机即可。

最重要的,可别再忘记刚刚重置后的密码。

附录1、视频操作演示

附录2、参考文档

https://www.gnu.org/software/grub/manual/grub/grub.html#gfxmode

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

Proxmox VE 8.1.4环境中,ZFS1的rpool替换故障的硬盘 2024-09-29

前缀、文档修改记录

20240929 初始化编辑此文章,未完稿,等采买一个新硬盘。
20241007 更换的硬盘到了,更新此文章。
20241008 更新此文章,关于修复引导。完成此文章
20250508 更新,增加gpt分区下,sgdisk快速镜像盘的分区的内容

章节1、需求描述

突然发现PVE里面有一个硬盘坏了,本篇文章记录替换的过程。环境是ZFS1(512GB SSD * 4),PVE系统直接部署用的这个rpool,相当于一台单机版的虚拟化环境,无额外的存储。

章节2、故障现象

PVE中rpool显示已经降级,且在系统日志中,可以看到I/O错误提示,这种情况,如果不是电源线故障,基本可以断定是硬盘挂了一块。

章节3、故障修复的过程

3.1、ZFS的rpool修复

因为这块故障硬盘,已经显示为已移除(REMOVED),对rpool硬盘ZFS池子已经没有了作用,就可以直接把这块坏硬盘断电取下来,换上新的硬盘。

比如我这里,新硬盘还是 /dev/sdd,在PVE的磁盘页面上,对盘进行初始化,选择 /dev/sdd硬盘,选择上方的“使用GPT初始化磁盘”。

查看原硬盘的分区格式,我这里的4块盘,都是一个分区规格

Device       Start        End   Sectors   Size Type
/dev/sdc1       34       2047      2014  1007K BIOS boot
/dev/sdc2     2048    2099199   2097152     1G EFI System
/dev/sdc3  2099200 1000215182 998115983 475.9G Solaris /usr & Apple ZFS

使用fdisk/parted/sgdisk等工具,对新硬盘按其他3个盘的格式,进行一致的分区。

这里比较重要的是,新版的PVE,基本都是GPT分区,这样就简单些。

通过sfdisk命令,查看一下可用的盘的分区格式

sfdisk -d /dev/nvme0n1

可以看到label:gpt ,那么就可以用sgdisk进行分区的镜像

# 正常的盘  /dev/nvme0n1
# 新换的空白盘  /dev/sda  新盘的容量,要大于等于正常盘的容量。
sgdisk --backup=nvme0n1-gpt.bak /dev/nvme0n1
sgdisk --load-backup=nvme0n1-gpt.bak /dev/sda

# 看一下2个盘的分区,确保一致
fdisk -l /dev/nvme0n1 /dev/sda

可以通过 ls -la /dev/disk/by-id 命令,查看新换的硬盘的ID号

初始化/dev/sdd新硬盘后,就可以用在ZFS的rpool中,用新硬盘替换旧硬盘

# 旧硬盘 ata-Netac_SSD_512GB_AA20231205512G621697-part3
# 新硬盘 ata-YSSDJQB-512GSQ_2C23F2707401407-part3

zpool replace rpool ata-Netac_SSD_512GB_AA20231205512G621697-part3 ata-YSSDJQB-512GSQ_2C23F2707401407-part3

执行命令后,等待ZFS对rpool池的重建同步完成即可。

完成后,如下,从20:28开始同步,花了大约2小时,整个rpool总的1.77TB(512GB * 4, ZFS1):

3.2、引导修复过程

因为我这里这4块盘做的ZFS1,安装的PVE,不纯粹为数据盘区,故而,还需要把UEFI引导文件同步一下。

最安全的确认引导方式的命令

efibootmgr -v
  • 如果上面的命令,返回一个消息,指出EFI变量不受支持,则在BIOS/Legacy中使用grub
  • 如果输出包含如“Boot0005* proxmox […] File(\EFI\proxmox\grubx64.efi)”内容的行,则在UEFI模式下使用grub
  • 如果输出包含如”Boot0006* Linux Boot Manager […] File(\EFI\systemd\systemd-bootx64.efi)”内容的行,则使用systemd-boot

我这里显示的 efibootmgr -v 命令结果如下,并有提示启动顺序BootOrder:

BootCurrent: 000D
Timeout: 2 seconds
BootOrder: 0010,0005,000D,000E,000F,000B,000A,0001,0004,0003,0002,0000,000C
Boot0000* Linux Boot Manager	VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)
Boot0001* Linux Boot Manager	HD(2,GPT,f17f77b6-f394-46a5-b8b7-14b91d7b5b2e,0x800,0x200000)/File(\EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI)
Boot0002* Linux Boot Manager	VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)
Boot0003* Linux Boot Manager	VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)
Boot0004* Linux Boot Manager	VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)
Boot0005* Linux Boot Manager	HD(2,GPT,5bd1d45d-90ae-c64f-9cdb-8c86455bbac3,0x800,0x200000)/File(\EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI)
Boot000A* Linux Boot Manager	HD(2,GPT,f4cac5de-9b0b-4ca2-9c9e-2bfff1c2adfc,0x800,0x200000)/File(\EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI)
Boot000B* Linux Boot Manager	HD(2,GPT,1f5f4da2-e8cf-4c7d-86a8-e697c5055e91,0x800,0x200000)/File(\EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI)
Boot000C* Linux Boot Manager	VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)
Boot000D* UEFI OS	HD(2,GPT,f17f77b6-f394-46a5-b8b7-14b91d7b5b2e,0x800,0x200000)/File(\EFI\BOOT\BOOTX64.EFI)..BO
Boot000E* UEFI OS	HD(2,GPT,f4cac5de-9b0b-4ca2-9c9e-2bfff1c2adfc,0x800,0x200000)/File(\EFI\BOOT\BOOTX64.EFI)..BO
Boot000F* UEFI OS	HD(2,GPT,1f5f4da2-e8cf-4c7d-86a8-e697c5055e91,0x800,0x200000)/File(\EFI\BOOT\BOOTX64.EFI)..BO
Boot0010* UEFI OS	HD(2,GPT,5bd1d45d-90ae-c64f-9cdb-8c86455bbac3,0x800,0x200000)/File(\EFI\BOOT\BOOTX64.EFI)..BO

实际根据官方文档,

If systemd-boot is used as a bootloader (see Determine which Bootloader is used), some additional setup is needed. This is only the case if Proxmox VE was installed with ZFS-on-root.

使用命令确认一下,如果/分区是 rpool/ROOT/pve-1,基本就可以确定,我这里使用的是systemd-boot方式的引导。

root@PVE03SSD:~# findmnt /
TARGET SOURCE           FSTYPE OPTIONS
/      rpool/ROOT/pve-1 zfs    rw,relatime,xattr,posixacl,casesensitive
root@PVE03SSD:~# 

继续用 proxmox-boot-tool status 命令看看,这里比较重要的是,启动用的uefi还是grub的提示

// 显示的文本格式内容
System currently booted with uefi
19A9-F481 is configured with: uefi (versions: 6.5.11-8-pve)  // 这个对应到 sda2
19AA-6DD8 is configured with: uefi (versions: 6.5.11-8-pve)  // 这个对应到 sdb2
19AA-E4C2 is configured with: uefi (versions: 6.5.11-8-pve)  // 这个对应到 sdc2
WARN: /dev/disk/by-uuid/19AB-5A9E does not exist - clean '/etc/kernel/proxmox-boot-uuids'! - skipping     // 19AB-5A9E 这个对应到 故障盘的旧盘sdd2,应该替换为 新的 sdd2

接下来就是正式的在新盘的/dev/sdd2修复引导过程

格式化/dev/sdd2分区

proxmox-boot-tool format /dev/sdd2

确认一下,分区已经格式化正确,并且一致,命令如下:

 lsblk -o +FSTYPE

对/dev/sdd2修复引导

proxmox-boot-tool init /dev/sdd2 uefi

上面的命令执行完,再次确认引导的状态,我这里是能看到4个盘都有,就是对的。

 proxmox-boot-tool status

备注,这里,提示的2个旧的不存在的UUID,直接在文件 /etc/kernel/proxmox-boot-uuids 中删除对应的行即可。

Done,完美收官。

附录1、文件系统类型

  4 BIOS boot                      21686148-6449-6E6F-744E-656564454649
  1 EFI System                     C12A7328-F81F-11D2-BA4B-00A0C93EC93B
157 Solaris /usr & Apple ZFS       6A898CC3-1DD2-11B2-99A6-080020736631

附录2、参考链接

https://pve.proxmox.com/wiki/Host_Bootloader#:~:text=proxmox%2Dboot%2Dtool%20is%20a,from%20the%20vfat%20formatted%20ESPs.

附录1、视频操作演示

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

后记1、关于分区的一些内容

在新硬盘/dev/sdd上面,创建 /dev/sdd1的 BIOS boot分区

在新硬盘/dev/sdd上面,创建 /dev/sdd2的 EFI System分区

在新硬盘/dev/sdd上面,创建 /dev/sdd3的 Solaris /usr & Apple ZFS分区

跟其他磁盘,对比一下分区,3个分区格式,还有gpt都是一致的。

TrueNAS 汇总 2024-08-30

前缀、文档修改记录

20240830 初始化编辑此文章,更新中
20240901 更新

章节1、需求描述

折腾配置了一台物理机,采用E5处理器,64G内存,2块240G SSD作为系统盘,8块500G磁盘,配置了一台TrueNAS服务器,汇总一下折腾的笔记

设备信息

操作系统版本:TrueNAS-SCALE-24.04.2
产品:X99
型号:Intel(R) Xeon(R) CPU E5-2683 v4 @ 2.10GHz
内存:63 GiB
系统序列号:Default string

章节2、常规的语言设置

TrueNAS支持简体中文,支持传统中文,时区,国内用户一般选择 Asia/Shanghai。

章节3、设置一个静态的IP地址

章节4、存储的设置

手里一共有8块3.5英寸的 500G机械键盘,组建一个存储池,因为数据都不太重要,所以,选择RAIDZ1的容错方式,配置7块盘在RAIDZ1使用中,1块盘作为热备盘。

章节5、硬盘的S.M.A.R.T健康度检测

一般配置每天凌晨一次的短检测,每周一次的长检测。

章节6、销毁池子(慎重操作)

像在折腾阶段,如果原先池子里的数据不需要了,或者已经备份了,就可以完全销毁重建池子,暴力一点的做法是,直接在console页面,选择 reset configuration to defaults.

这种,就直接把所有的配置全部清掉了。

附录1、视频操作演示

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨

OpenEuler 22.03 SP4网络,双链路主备配置 2024-08-19

前缀、文档修改记录

20240819 初始化编辑此文章,完稿

章节1、需求描述

项目里,有台主机必须安装国产化系统openeuler 22.03 SP4 版本,为了稳定,配置网络为双网卡的主备。

注: 官方说,这个版本,只能支持到主备模式,截至本文时间2024-08-19,暂不支持动态LACP的端口聚合。

章节2、操作步骤

2.1、创建bond接口

在操作系统内,使用nmcli命令创建bond接口,并设置其管辖的物理网卡。‌bond接口目前仅支持mode=active-backup(‌主备模式)‌。‌

假设2个网口的名称分别为 enp3s0 enp4s0

root@SERVER:~# nmcli con add type bond con-name bond0 ifname bond0 mode active-backup

root@SERVER:~# nmcli con add type bond-slave ifname enp3s0 master bond0

root@SERVER:~# nmcli con add type bond-slave ifname enp4s0 master bond0

root@SERVER:~# mv /etc/sysconfig/network-scripts/ifcfg-enp3s0 /etc/sysconfig/network-scripts/bak-ifcfg-enp3s0-202408  

root@SERVER:~# mv /etc/sysconfig/network-scripts/ifcfg-enp4s0   /etc/sysconfig/network-scripts/bak-ifcfg-enp4s0-202408

2.2、修改配置文件,设置IP地址信息

手动修改或自动生成配置文件 /etc/sysconfig/network-scripts/ifcfg-bond ,‌设置BOOTPROTO=none,‌以及指定IP地址(IPADDR)、‌子网掩码(PREFIX=24)、‌网关(GATEWAY)和DNS服务器(DNS1= DNS2=)。‌

BOOTPROTO=none
IPADDR=192.168.10.100    // 自定义IP地址
PREFIX=24    // 自定义掩码长度
GATEWAY=192.168.10.254    // 自定义网关地址
DNS1=192.168.10.254    // 自定义DNS1地址
DNS2=192.168.10.253    // 自定义DNS2地址

2.3、重启网络服务和激活bond

使用 shutdown -r now / reboot now重启一次操作系统(推荐)

使用systemctl restart NetworkManager重启网络管理服务以应用新的配置。‌
使用nmcli con up bond0激活bond接口。‌
使用nmcli device status检查网卡的状态,‌确保bond接口和其他相关网卡都处于活动状态。‌

2.4、配置上联的接入交换机

上联的接入交换机, 接入模式,设置一个默认的端口VLAN。

参考链接 https://docs.openeuler.org/en/docs/22.03_LTS_SP3/docs/Administration/configuring-the-network.html

附录1、视频操作演示

附录2、@Dasmz

博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。

对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费

Twitter: Dasmz

Youtube: @DasmzStudio

Telegram: @Dasmz

Donate
云乞讨