管理员 发布的文章

Linux | /var/log/journal日志清理


说明

简单来说 /var/log/journal 下面的日志是由systemd记录写入的日志,有时候该目录会占用比较多的空间,可以通过命令:journalctl --disk-usagedu -sh /var/log/journal/查看空间占用情况,也可以使用 journalctl 命令查看具体的日志信息。

清理方法比较简单

1、指定日志的大小

journalctl --vacuum-size=100M

日志指定100MB,超过的就删除

2、指定保存时间

journalctl --vacuum-time=10d

10d为10天,1w为一周

以上为手动清理

如果要自动清理的话需要 编辑 /etc/systemd/journald.conf 文件 添加 SystemMaxUse=100M 可以指定日志大小超过100MB就自动清理

修改保存完执行: systemctl restart systemd-journald 重启生效。


C++ | 类的双向耦合:理解与避免


e3987409a24d418baf2be613f38998ad.jpg

背景

在C++编程中,类与类之间的关系常常会产生复杂的依赖,特别是当两个类相互引用时,这种依赖关系被称为双向耦合(Bidirectional Coupling)。这种关系在某些场景下是不可避免的,但也可能导致维护困难、代码复杂度增加、模块化降低等问题。

什么是双向耦合?

双向耦合是指两个类之间相互依赖,A类依赖于B类,而B类也依赖于A类。这种双向的依赖关系在设计模式中常常出现,例如在某些MVC架构中,视图和控制器可能会相互引用。一个简单的例子如下:

class B; // 前向声明
class A
{
    B *b;
    // A 依赖于 B
public:
    void setB(B *b) { this->b = b; }
};
class B
{
    A *a; // B 依赖于 A
public:
    void setA(A *a) { this->a = a; }
};

在这个例子中,类A和类B相互依赖,形成了双向耦合。尽管这个例子简单,但它揭示了在大型项目中,这种耦合可能带来的复杂性。

双向耦合的潜在问题

  1. 增加代码复杂性:双向耦合使得类之间的关系复杂化,导致代码难以理解和维护。
  2. 测试困难:单元测试某个类时,如果它依赖于其他类,那么就必须对这些依赖进行模拟或测试,增加了测试难度。
  3. 降低模块化:当类之间存在双向耦合时,系统的模块化程度下降,类之间的强依赖关系使得代码难以重用。
  4. 维护困难:任何一个类的修改都有可能导致另一个类的修改,从而影响整个系统的稳定性。

双向耦合的常见场景

在实际开发中,双向耦合常常出现在以下几种场景中:

  • 父子关系:一个父类和子类之间的复杂依赖关系,特别是在父类需要访问子类特定功能时。
  • 观察者模式:观察者和被观察者之间可能存在双向耦合,因为被观察者需要通知观察者,而观察者可能需要从被观察者中获取数据。
  • MVC架构:控制器和视图之间可能存在双向耦合,因为控制器需要更新视图,而视图可能需要通知控制器某些事件。

如何避免双向耦合

为了避免双向耦合,可以采用以下策略:

  1. 使用接口和抽象类:通过引入接口或抽象类,减少具体类之间的直接依赖。例如,使用观察者模式时,可以通过引入一个抽象的观察者接口,避免被观察者和具体观察者之间的双向耦合。
class Observer
{
public:
    virtual void update() = 0;
};
class Subject
{
    std::vector<Observer *> observers;

public:
    void attach(Observer *observer) { observers.push_back(observer); }
    void notify()
    {
        for (Observer *observer : observers)
        {
            observer->update();
        }
    }
};
  1. 依赖注入:使用依赖注入将依赖关系注入类中,而不是在类内部创建依赖对象。这样可以减少类之间的耦合,并提高可测试性。
class Service
{
};
class Client
{
    Service *service;

public:
    Client(Service *service) : service(service) {}
};
  1. 解耦模式:采用设计模式如中介者模式(Mediator Pattern),通过一个中介者来管理类之间的交互,避免直接的双向依赖。
class Mediator
{
    A *a;
    B *b;

public:
    void setA(A *a) { this->a = a; }
    void setB(B *b) { this->b = b; }
    void communicate()
    {
        a->action();
        b->response();
    }
};
  1. 使用智能指针和弱指针:在现代C++中,使用std::shared_ptr和std::weak_ptr可以有效管理对象的生命周期,避免循环引用引发的资源泄漏问题。
class A;
class B
{
    std::weak_ptr<A> a;

public:
    void setA(std::shared_ptr<A> a) { this->a = a; }
};
class A
{
    std::shared_ptr<B> b;

public:
    void setB(std::shared_ptr<B> b) { this->b = b; }
};
  1. 模块化设计:尽量将功能分解为独立的模块,降低类之间的耦合度,增强代码的可维护性和扩展性。

双向耦合的合理应用

尽管双向耦合有很多潜在的缺点,但在某些情况下,合理使用双向耦合是可以接受的。例如,当两个类之间确实存在强关联关系,并且这种关系不会导致复杂度显著增加时,双向耦合可能是最自然的设计。
此外,在一些框架或设计模式中,双向耦合也是不可避免的,特别是在那些需要频繁交互的对象之间。例如,GUI应用中的事件驱动设计,双向耦合可能是不可避免的。

总结

C++中的双向耦合虽然在某些情况下是必要的,但它也可能带来诸多复杂性。通过合理设计类的依赖关系,使用接口、抽象类、依赖注入以及设计模式等技术,可以有效减少双向耦合对系统带来的负面影响。最终,理解双向耦合的本质,并在设计中有意识地避免不必要的耦合,是提升代码质量和系统可维护性的关键。


教程 | Linux下VirtualGL+TurboVNC远程桌面使用显卡


背景

这里使用的是国产统信UOS操作系统的实体机,显卡是Nvidia Quadro P620,默认源里是没有VirtualGL和TurboVNC两个软件的,所以需要编译安装。还测试了EXSI8.0情况下使用Nvidia Tesla V100直通安装的银河麒麟SP10虚拟机,这里需要注意一下,开机启动方式必须是EFI或者UEFI,并且勾选安全启动,要不直接使用BIdOS的方式启动你的驱动时怎么也安装不上的。

安装显卡驱动

更新系统及查看相关信息

sudo apt update && sudo apt upgrade -y # 更新系统
sudo apt install dkms build-essential linux-headers-generic

sudo lsmod | grep nouveau #查看nouveau的开源驱动是否被使用
sudo lspci | grep VGA #查看集成显卡
sudo lspci | grep NVIDIA #查看英伟达显卡
sudo lshw –c video | grep configuration #查看显卡驱动

sudo systemctl stop lightdm # 暂停界面

禁用nouveau驱动

打开或创建黑名单配置文件:
通常,这个文件位于 /etc/modprobe.d/ 目录下。你可以创建一个新的配置文件专门用来禁用 nouveau,例如:

sudo touch /etc/modprobe.d/blacklist-nvidia-nouveau.conf
cat >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf << EOF
blacklist nouveau
options nouveau modeset=0
EOF

以上作用是将 nouveau 驱动添加到黑名单,并设置 nouveau 不使用任何模式设置。

如果时EXSI直通显卡的话需要启用对不支持的GPU的支持。

sudo touch /etc/modprobe.d/nvidia.conf
cat >> /etc/modprobe.d/nvidia.conf << EOF
options nvidia NVreg_OpenRmEnableUnsupportedGpus=1
EOF

禁用驱动后,需要重新生成initramfs,以确保在下一次启动时不加载 nouveau 驱动。

sudo dracut --force # 重新生成初始化RAM磁盘Fedora、CentOS和RHEL的系统
sudo update-initramfs -u # 重新生成初始化RAM磁盘Debian或Ubuntu的系统

sudo apt --purge remove nvidia-* # 删除所有Nvidia的驱动

sudo reboot  #重启系统

官网解决此问题的大神回复1
官网解决此问题的大神回复2

安装Nvidia驱动

Nvidia官网查好版本下载指定驱动:NVIDIA-Linux-x86_64-535.183.06.run

wget https://us.download.nvidia.com/tesla/535.183.06/NVIDIA-Linux-x86_64-535.183.06.run
chmod +x NVIDIA-Linux-x86_64-535.183.06.run  # 给文件执行权限
sudo ./NVIDIA-Linux-x86_64-535.183.06.run  # 运行后一路回车确认就行

查看最终驱动安装结果:
CIOMP_2024-09-14_09-26-17.png

VirtualGL

编译环境安装

# 银河麒麟
yum install gcc gcc-c++ git cmake libstdc++-static
# 统信
sudo apt install gcc g++

依赖环境安装

# 银河麒麟
yum install opencl-headers ocl-icd ocl-icd-devel libX11-devel libXext-devel libXrender-dev libXtst-devel libXt-devel xcb-util-keysyms-devel
# 统信
sudo apt install opencl-headers ocl-icd-opencl-dev libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libxcb-keysyms-dev

下载源码编译安装

git clone https://github.com/VirtualGL/virtualgl.git  # 下载源码项目
cmake .  # 配置项目 或者加上-DCMKAE_INSTALL_PREFIX=/usr/opt参数设置安装目录 默认安装到/opt目录下
make -j9 && make install # 编译并且安装

配置

sudo nvidia-xconfig --query-gpu-info    # 查看busid
sudo nvidia-xconfig -a --allow-empty-initial-configuration --virtual=1920x1200 --busid PCI:0@3:0:0  # 填上一步中获取的busid 

sudo service lightdm stop   # 关闭显示服务
sudo /opt/VirtualGL/bin/vglserver_config    # 选1,其他都为Y,最后x退出
usermod -a -G vglusers <用户名> # 添加用户进用户组vglusers,使其具有相关权限,否则后面远程桌面的时候启用不了VirtualGL。<用户名> 改为你的用户名
sudo service lightdm start # 开启显示服务

sudo reboot

TurboVNC

依赖环境安装

# 银河麒麟
yum install libjpeg-turbo libjpeg-turbo-devel pam-devel java java-devel
# 统信
sudo apt install libturbojpeg0-dev libpam0g-dev java-dev

防止配置时出现Could no find PAM headers报错

主要是依赖安装完了,对应的头文件也有,说啥检查不到文件,应该是有些环境没配置才导致的这个错误。

注释掉unix/Xvnc/programs/Xserver/hw/vnc/CMakelists.txt的14行#message(FATAL_ERROR "Could no find PAM headers")
CIOMP_2024-09-10_20-01-30.png

下载源码编译安装

git clone https://github.com/TurboVNC/turbovnc.git
cmake .  # 配置项目 或者加上-DCMKAE_INSTALL_PREFIX=/usr/opt参数设置安装目录 默认安装到/opt目录下
make -j9 && make install # 编译并且安装

配置

/opt/TurboVNC/etc/turbovncserver.conf配置文件修改配置如下:

$useVGL=1; # 主要是让vnc使用VirtualGL
$wm="deepin"; # 正常找`/usr/share/xsession/`下的桌面配置,默认会找gnome.desktop或ubuntu.destop,统信用的lightdm,所以这里添加一个deepin。

运行vncserver

/opt/TurboVNC/bin/vncserver -geometry 1920x1080 :1 # 开启VNC

结合VirtualGL运行相关程序

/opt/VirtualGL/bin/vglrun glxinfo | grep OpenGL  # 将会输出使用显卡的情况输出

CIOMP_2024-09-14_11-28-57.png

最终连接效果

CIOMP_2024-09-13_10-32-35.png


教程 | Windows10 系统开启ssh Server服务


安装方法:

1、 下载最新的二进制安装版直接安装:
OpenSSH-Win64-v9.5.0.0.zip
也可以去开源项目里下载微软开源的openssh

2、打开防火墙,开启22端口 (也可使用控制面板中防火墙 高级 进行设置)

netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22

3、 设置开机启动

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic

4 、 启动ssh服务

Start-Service sshd
Start-Service ssh-agent

教程 | Windows远程桌面多用户远程登录配置


RDP Wrapper

干嘛的?RDPWrap 是一 Windows 远程桌面登录增强工具,它可以让多个用户同时远程登录到同一台 Windows 计算机而不会互相干扰,这对于家庭用户和小型企业用户来说非常有用。

工具获取地址

  1. RDP Wrapper Github下载地址
  2. RDPWrap-v1.6.2.zip(上不了github的下这个)

使用方法

1.下载解压文件
2.右键install.bat文件以管理员方式运行,出现 successful installed 提示,就表示安装好了,按任意键关闭窗口即可。

运行完成后会在 C:Program FilesRDP Wrapper下面生成2个文件:rdpwrap.dll,rdpwrap.ini(配置文件).

CIOMP_2024-07-04_18-02-40.png
3.点击RDPConf.exe检查配置是否成功,成功如下图。
CIOMP_2024-07-04_17-57-51.png
CIOMP_2024-07-04_18-00-43.png

会出现的问题

1.RDPConf.exe中Service state后的ver.显示是 N/A。

解决办法:直接在cmd或运行里输入winver查看操作系统内部版本。

2.RDPConf.exe中出现红字的[not supported] 提示,此提示代表不能成功配置,主要原因是C:\Program Files\RDP Wrapper\rdpwrap.ini内没有当前系统对应版本的配置。

解决办法:在rdpwrap.ini项目中下载最新的rdpwrap.ini文件覆盖掉C:\Program Files\RDP Wrapper\rdpwrap.ini的。