webmin安装使用

从github下载安装脚本

curl -o setup-repos.sh https://raw.githubusercontent.com/webmin/webmin/master/setup-repos.sh
sh setup-repos.sh

Debian and derivatives
apt-get install webmin --install-recommends

登录入口

https://<Your-Server-IP>:10000

用户名密码是读取的服务器操作系统的用户名和密码,root和你安装操作系统时的密码

功能配置

可以从未使用模块面板安装软件,

可以对已经自定义安装的软件进行目录配置,如图,mysql是在wemin之前安装的没有使用系统默认目录

https://github.com/lewellyn/virtualmin-nginx/issues/4

内网搭建dns服务

需求

在家里组建局域网,其中一台电脑组为服务器,搭建了很多网站(nas系统,个人博客,游戏服务,代码仓库)智能设备网关,需要内网访问。

理论

DNS(Domain Name System,域名系统)是互联网的一项基础服务,它将域名转换为IP地址,从而使计算机能够互相通信。简单地说,DNS就像互联网的电话簿,把人类容易记住的域名(如www.example.com)转换成计算机能够识别和处理的IP地址(如192.0.2.1

DNS的工作原理

  1. 域名解析
    • 用户在浏览器中输入一个网址(如www.example.com)。
    • 计算机需要知道对应的IP地址才能访问这个网站。
  2. 查询DNS服务器
    • 计算机首先检查本地缓存是否有该域名的IP地址记录。
    • 如果本地缓存没有,计算机会向配置的DNS服务器发送查询请求。
  3. 递归查询
    • DNS服务器如果没有该域名的记录,会进行递归查询,从根DNS服务器开始,逐级查询顶级域名服务器(如.com服务器)和权威DNS服务器,直到找到正确的IP地址。
  4. 返回结果
    • DNS服务器将查询结果返回给用户的计算机,计算机随后使用该IP地址与目标服务器建立连接。

什么是DNS服务器

DNS服务器是提供DNS服务的计算机系统或程序。它的主要功能是响应DNS查询请求,将域名解析为IP地址。根据其功能和角色,DNS服务器可以分为以下几类:

根DNS服务器

  • 位于DNS体系结构的最顶层,负责管理和维护根域(Root Zone)。
  • 当DNS服务器无法解析域名时,会向根DNS服务器请求帮助。

顶级域名服务器(TLD Name Servers)

  • 管理特定顶级域(如.com.org.net等)。
  • 顶级域名服务器提供特定顶级域内的权威DNS服务器列表。

权威DNS服务器(Authoritative DNS Servers)

  • 存储域名与IP地址的映射关系,并为域名提供权威的解析信息。
  • 通常由域名注册商或域名所有者维护。

递归DNS服务器(Recursive DNS Servers)

  • 为客户端执行递归查询,将域名解析为IP地址。
  • 通常由互联网服务提供商(ISP)或公共DNS服务(如Google DNS、OpenDNS)提供。

DNS服务器的类型和用途

权威DNS服务器

  • 作用:存储和提供特定域名的解析记录。
  • 用途:当用户查询特定域名时,权威DNS服务器提供该域名的最终解析结果。

递归DNS服务器

  • 作用:为客户端执行递归查询,缓存查询结果以提高解析效率。
  • 用途:大多数用户的计算机配置使用递归DNS服务器来进行域名解析,这些服务器会逐步查询其他DNS服务器以获得所需的IP地址。

Host文件

Hosts文件是一个用于将主机名(域名)映射到IP地址的本地文本文件。在操作系统解析域名时,系统首先检查Hosts文件中的记录,如果找到匹配的条目,就会直接使用对应的IP地址,而无需向DNS服务器发出查询请求。

Hosts文件在不同操作系统中的位置如下:

  • Windows
    • 文件路径:C:WindowsSystem32driversetchosts
    • 编辑方法:需要以管理员权限运行文本编辑器(如记事本),然后打开该文件进行编辑。
  • Linux/Unix
    • 文件路径:/etc/hosts
    • 编辑方法:使用超级用户权限编辑文。
  • macOS
    • 文件路径:/etc/hosts
    • 编辑方法:使用超级用户权限编辑文件。

host文件弊端,当局域网或广域网中计算机数量过多时,修改host文件工作量繁多耗时长。这时就需要dns服务器提供域名解析服务

详细操作步骤

安装dns服务软件,系统为ubuntu

bind9文档 dnsmasq

sudo apt install bind9

配置文件结构说明

/etc/bind
├── named.conf 主配置文件
    引入了named.conf.default-zones,named.conf.local,named.conf.options
├── named.conf.default-zones
    包含BIND9默认的区域配置,定义根提示文件、本地回环地址和反向区域的默认配置。
    包括 db.0,db.127,db.255,db.empty,db.local
├── named.conf.local
    用户自定义区域配置,添加域名需要修改
├── named.conf.options
    定义BIND9的全局选项配,如目录、递归设置、转发器和日志配置
├── bind.keys
    用途:包含DNSSEC(DNS Security Extensions)验证所需的根密钥。
    内容:定义了一组信任锚,用于验证DNSSEC签名的区域数据。
├── db.0
    用途:用于根区域的反向DNS查找。
    内容:定义了0.in-addr.arpa区域,用于解析IP地址0.0.0.0的反向查询。
├── db.127
    对应ip127.0.0.1 类似db.0
├── db.255
    对应ip255.255.255.255类似db.0
├── db.empty
    用途:用于定义一个空的反向区域模板
    内容:用于未使用的IP地址范围,防止未授权的查询
├── db.local
    用途:用于本地回环地址localhost的正向DNS查找
    内容:定义了localhost的A记录
├── rndc.key
    用途:用于rndc(Remote Name Daemon Control)的密钥文件
    内容:包含用于安全通信的密钥,用于远程管理BIND9服务器
└── zones.rfc1918

配置解析,以域名www.Alist.lan Alist.lan IP 192.168.1.100为例

编辑named.conf.local配置文件

sudo vim /etc/bind/named.conf.local

添加如下内容

zone "Alist.lan" {
    type master;
    file "/etc/bind/db.Alist.lan";
};

创建并编辑区域文件/etc/bind/db.Alist.lan

vim /etc/bind/db.Alist.lan

输入以下配置内容并保存

$TTL 86400
@       IN      SOA     ns1.Alist.lan. root.Alist.lan. (
                              1         ; 序列号,每次修改后需增加
                         604800         ; 刷新时间(秒)
                          86400         ; 重新尝试时间(秒)
                        2419200         ; 过期时间(秒)
                         86400 )        ; 最小TTL(秒)
;
@       IN      NS      ns1.alist.lan.  ; 指定域的权威名称服务器
ns1     IN      A       192.168.1.100   ; 名称服务器的IP地址
@       IN      A       192.168.1.100   ; 将域名*.lan映射到IP地址
www     IN      A       192.168.1.100   ; 将www.*.lan映射到IP地址 

序列号说明

修改记录后如果你不增加序列号,从属DNS服务器将不会知道主DNS服务器上的区域文件已更新,从而不会更新它们自己的数据。这可能导致不一致的DNS解析结果,影响网络的正常运行。相当于版本管理

序列号的格式

序列号通常是一个32位整数。最常见的格式有以下几种:

简单递增:每次修改区域文件时,序列号简单地递增1。

日期格式:使用日期加上一个小版本号来表示序列号。比如,2023080901表示2023年8月9日的第一次更新,2023080902表示同一天的第二次更新

检查配置是否正确

sudo named-checkconf
sudo named-checkzone Alist.lan /etc/bind/db.Alist.lan
#显示结果如下为正确
zone Alist.lan/IN: loaded serial 1
OK

重启BIND9服务

sudo systemctl restart bind9

配置客户端使用本地DNS服务器

对单台设备配置

在客户端机器上配置网络设置,将DNS服务器指向你的BIND9服务器(192.168.1.100

局域网配置

修改路由器DNS配置,指向你的BIND9服务器(192.168.1.100

首选DNS服务器设置内网的DNS服务器

测试DNS解析是否生效

在客户端机器上使用dignslookup命令测试域名解析:

dig @192.168.1.100 Alist.lan
dig @192.168.1.100 www.Alist.lan

同一局域网内的设备访问测试,dns有缓存,需要重新连接网络测试

扩展工具

编写一个添加解析服务的shell脚本

FAQ

看网上其他人的文章,会出现外网访问慢的问题,需要修改cat named.conf.options配置,添加

forwarders { 运营商ip或者家里上级路由网关; };

我没出现这种情况,采取的安装后默认配置,DNS查询是递归的,在本地dns查询不到后,会向上级DHCP的服务的dns查找,出现这种情况可能是没有开启DHCP服务,使用的静态ip导致上级dns查询不到。也可能是DNS缓存的问题。

options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        // forwarders {
        //      0.0.0.0;
        // };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        listen-on-v6 { any; };
};

Ubuntu搭建Samba使用笔记

安装配置

sudo apt install samba

修改配置文件/etc/samba/smb.conf添加如下配置

[5TB]
comment = 5TB
path = /mnt/569fa0a4-724e-44aa-94a0-cf740b506291
create mask = 0700
directory mask = 0700
valid users = nasm
read only = no
browseable = yes
writable = yes
guest ok = yes

[5TB]

  • 这是共享名称,在网络上访问共享时会显示这个名称。

comment = 5TB

  • 这是对共享资源的描述,会在Windows资源管理器中显示。

path = /mnt/569fa0a4-724e-44aa-94a0-cf740b506291

  • 指定共享目录的实际路径。在这个示例中,共享目录为/mnt/569fa0a4-724e-44aa-94a0-cf740b506291

create mask = 0700

  • 创建文件时的权限掩码。0700表示新创建的文件只有所有者(创建文件的用户)有读写执行权限。

directory mask = 0700

  • 创建目录时的权限掩码。0700表示新创建的目录只有所有者有读写执行权限。

valid users = nasm

  • 指定可以访问该共享的用户。在这个示例中,只有用户nasm可以访问该共享。

read only = no

  • 指定共享是否只读。no表示该共享是可写的,用户可以在其中创建和修改文件。

browseable = yes

  • 指定共享是否在网络浏览时可见。yes表示该共享在浏览网络资源时是可见的。

writable = yes

  • 指定共享是否可写。yes表示用户可以向共享中写入数据。

guest ok = no

  • 指定是否允许未认证的用户访问该共享。no表示不允许匿名用户访问该共享

创建用户

sudo smbpasswd -a nasm

根据提示输入密码

传输配置优化

在全局设置部分添加或修改以下参数:

ini复制代码[global]
   socket options = TCP_NODELAY SO_RCVBUF=65536 SO_SNDBUF=65536
   read raw = yes
   write raw = yes
   max xmit = 65535
   dead time = 15
   getwd cache = yes
   use sendfile = yes
   aio read size = 16384
   aio write size = 16384
   min receivefile size = 16384

这些参数的作用如下:

  • socket options:设置TCP/IP套接字选项,提高传输性能。
  • read rawwrite raw:允许原始读写,提高传输效率。
  • max xmit:设置最大传输块大小。
  • dead time:设置空闲连接的等待时间,单位为分钟。
  • getwd cache:启用路径缓存,提高性能。
  • use sendfile:启用sendfile()系统调用,提高传输性能。
  • aio read sizeaio write size:启用异步I/O,提高大文件传输性能。
  • min receivefile size:设置接收文件的最小大小。

ubuntu安装配置aria2

aria2介绍

安装

sudo apt-get install aria2

编辑配置文件

创建配置目录和session文件

sudo mkdir /etc/aria2
sudo touch /etc/aria2/aria2.session

创建文件/etc/aria2/aria2.conf如下

#=========文件保存目录自行修改
dir=/mnt/3b0360b4-babc-45cc-9669-0bc2bfe66007
#打开rpc的目的是为了给web管理端用
enable-rpc=true
rpc-allow-origin-all=true
rpc-listen-all=true
rpc-listen-port=6800
continue=true
input-file=/etc/aria2/aria2.session
save-session=/etc/aria2/aria2.session
max-concurrent-downloads=3

更详细的配置参考:aria2.conf

手动运行测试配置是否有问题

sudo aria2c --conf-path=/etc/aria2/aria2.conf

配置systemed开机启动

创建systemd配置文件/etc/systemd/system/aria2c.service如下

[Unit]
Description=aria2
After=network.target

[Service]
ExecStart=/usr/bin/aria2c --conf-path=/etc/aria2/aria2.conf
ExecStop=/bin/kill $MAINPID
RestartSec=always

[Install]
WantedBy=multi-user.targeta

配置启动

systemctl daemon-reload

systemctl enable aria2

WebGUI

AriaNg https://github.com/mayswind/AriaNg

使用nginx虚拟主机配置

server {
    listen 80;
    server_name aria2ng.lan;
    access_log /home/nasm/wwwlogs/aria2ng_nginx.log combined;
    root /home/nasm/Code/AriaNg;
    index index.html index.htm ;
    #error_page 404 /404.html;
    #error_page 502 /502.html;


    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
      expires 30d;
      access_log off;
    }

    location ~ .*\.(js|css)?$ {
      expires 7d;
      access_log off;
    }

    location ~ ^/(\.user.ini|\.ht|\.git|\.svn|\.project|LICENSE|README.md) {
      deny all;
    }
    
    location /.well-known {
      allow all;
    }
  }

局域网中电脑配置host文件

127.0.0.1 aria2ng.lan

配置后浏览器输入访问域名即可,也可以使用ip地址访问

Ubuntu搭建NAS

文件系统选择

系统盘推荐使用ext4

文件存储盘,数据不重要推荐XFS

sudo apt install xfsprogs

数据重要推荐ZFS (Zettabyte File System)或Btrfs (B-tree File System),支持数据保护

sudo apt install zfsutils-linux

sudo apt install btrfs-progs

安装好文件系统后可以使用图形界面磁盘管理工具格式化磁盘

配置自动挂载磁盘

简单方式:使用磁盘管理工具配置

复杂方式:编辑/etc/fstab文件

在文件末尾添加一行,格式如下:

UUID=your-uuid /mnt/mydisk ext4 defaults 0 2

UUID=your-uuid:替换为你找到的UUID。

/mnt/mydisk:替换为你的挂载点路径。

ext4:替换为你的文件系统类型,如ext4, ntfs, xfs等。

defaults:可以包含其他挂载选项,例如rw(读写)、ro(只读)、noatime(不更新访问时间)等。

0:设置为0表示不备份这个文件系统。

2:表示文件系统检查的优先级,一般非根文件系统设置为2,根文件系统为1。

使用命令测试/etc/fstab配置是否正确:

sudo mount -a

重启系统: 重新启动系统以验证配置是否在启动时自动生效。

远程控制

anydesk,sunlogin(向日葵),teamview`

云盘工具

nextcloud

AList 获取各种网盘文件下载连接工具

将各大网盘或存储的目录整合到一个项目列表中,可以查看文件列表,播放,下载,

https://github.com/alist-org/alist

文档地址 https://alist.nn.ci/zh/guide/install/script.html

下载工具

Aria

https://www.yangliuan.cn/archives/5972

qbittorrent

qBittorrent-Enhanced-Edition

平板串流和扩展虚拟屏幕

串流工具

电脑安装sunshine

https://github.com/LizardByte/Sunshine

平版安装moonlight

https://github.com/moonlight-stream

手柄链接平板无反应安装如下补丁

https://github.com/nefarius/ViGEmBus

网盘地址:https://wwd.lanzn.com/b026wv8lwj 密码:bilq

视频参考 平板串流

平板扩展为虚拟屏幕

前置条件实现上述串流

电脑安装虚拟屏幕软件

https://github.com/nomi-san/parsec-vdd

查看平板的分辨率与刷新率,根据参数使用parsec-vdd添加虚拟屏幕,重启生效

平板启动moonlight

记录虚拟屏幕名称,一般为\\.\DISPLAYS 打开sunshine设置audio&video->output->输入屏幕名称,底部save->apply,在window显示设置中设置屏幕

视频 屏幕扩展

网盘地址 https://pan.baidu.com/s/1iYVu9kh7Ck9S4mQkM7VPfA?pwd=4321
提取码: 4321

AI玩游戏项目

只狼

analoganddigital / DQN_play_sekiro ricagj / train_your_own_game_AI

魂类游戏

amacati / SoulsGym

超级玛丽

ppaquette / gym-super-mario vivek3141 / super-mario-neat

mam91 / neat-genetic-mario

贪吃蛇

snake-ai

街头霸王二

street-fighter-ai

DreamerV2

DreamerV2 的详细论文解读,可以看这个视频:

https://youtu.be/o75ybZ-6Uu8

danijar / dreamerv2

王者荣耀

FengQuanLi / ResnetGPT FengQuanLi / WZCQ

GTA5自动驾驶

Sentdex / pygta5

地平线

zspri / forza-ai zohairajmal / forza4selfdrive

EthanNCai / AI-Plays-ForzaHorizon4

进程间通信(process communication IPC)

管道(piepline)

内核管理的缓冲区,形象的理解管道两端连接着两个进程 ,一个读取一个写入。linux系统中将管道视为文件

匿名管道( pipeline )

有亲缘关系的进程才可以使用,父子进程,兄弟进程。以字节流形式传输,需要约定好数据格式,缓存区为空或写满时会阻塞。shell终端 | 管道符号就是匿名管道,示例如下:

ls | wc

命名管道FIFO(first in first out)

与匿名管道的区别,命名管道与系统中一个路径名关联,以文件的形式存在于文件系统中,进程可以通过FIFO路径名访问FIFO文件,实现进程间数据传输。遵循先进先出原则,缓存区为空或写满时会阻塞。

使用demo,待完善

php 命名管道函数 posix_mkfifo()

注意要和管道设计范式区分

How fast are Linux pipes anyway?

SystemV IPC

每个内核的IPC结构(消息队列,信号量,共享内存)都用一个非负整数的标识符加以引用。

php的扩展 Semaphore函数 命名和c语言及系统函数命名基本一致。

消息队列(sysvmsg)

消息队列的实质是一个存放消息的链表,由内核维护。每个消息视为一条记录,消息包括一个长整形的类型字段和需要传递数据。由消息队列标识符标识,有读写权限的进程可以从队列读取消息,写入消息到队列。通过key来找到对应消息队列。

如何使用?注意事项。使用demo,待完善

信号量(semaphore)

多进程之间可能因为进程合作和资源共享而产生制约关系。

直接相互制约关系

两个进程通过管道通信,管道为空时,读进程无法从管道读取数据,进入阻塞;管道满时,写进程无法向管道写入数据,进入阻塞。类似这种需要进程间合作导致的制约关系称为直接相互制约。进程间有同步关系

间接相互制约关系

假设当前系统中只有一台打印机,当A进程占用打印机时,进程B也申请使用打印机。进程B就会进入阻塞,等待打印机释放。其它进程同理。类似这种因资源共享导致的制约关系称为间接相互制约关系。进程间有互斥关系

临界资源

同步和互斥存在的根源是系统中存在临界资源(硬件资源:内存,打印机,硬盘;软件:共享代码段,变量等)。为了避免多进程的并发执行造成的不一致性,临界资源在同一时刻只允许有限个进程对其进行访问或修改。

信号量,是专门用户解决进程间同步与互斥问题的一种通信机制,它与信号无关,也不同于管道,FIFO以及消息队列 ,一般不用于传输数据,包含一个变量(表示资源数量,类型为非负整型),修改信号量的原子操作P和V,该信号量下等待资源进程的队列。

使用步骤

1.创建信号量/集,或者获取系统中已有的信号量/集。

2.初始化信号量/集。

3.信号量的P,V操作根据请求修改信号量数量,P操作使信号量-1,V操作使信号量+1.

4.从系统中删除不需要的信号量。

如何使用?注意事项。使用demo,待完善

共享内存(Shared memory)

允许多个进程访问给定的同一块存储区域。一般情况下,每个进程的虚拟地址空间会与不同的物理地址进行映射(参考上文页表指针)。当使用共享内存进行通信时,系统会将同一段物理内存映射给不同的进程,映射关系示意图如下。

映射关系

系统中的物理内存和虚拟内存都通过页面(页表)来管理,为多个进程分配共享内存实际是为进程分配一个或多个物理页面。因此共享内存的大小必须是系统中页面大小的整数倍。

进程使用共享内存时,先将虚拟内存空间与共享内存进行映射,映射完成后,进程对虚拟地址的读写,就相当于直接对物理内存读写。通信完成后需要释放物理内存解除进程与共享内存的映射关系。

共享内存,因为是进程直接读写物理内存,了不同进程间多次读写的时间。共享内存本身不限制读写次序,但是开发人员应该自觉遵循读写规则,在写进程操作尚未完成时,不应该有进程从共享内存中读取数据。通常,共享内存和信号量一起使用,由信号量帮它实现读写操作的同步。

Linux挂载磁盘错误

检查文件系统类型: 确保 /dev/sda1 上的文件系统类型是你操作系统支持的。使用以下命令查看文件系统类型:

sudo file -s /dev/sda1

这将输出文件系统类型,如果不是常见的文件系统类型(如 ext4、ntfs、fat32 等),你可能需要安装相应的文件系统工具。

检查并修复文件系统: 如果文件系统损坏,可以尝试使用 fsck 工具进行修复。注意,修复前请确保没有其他进程正在使用该分区。

sudo fsck /dev/sda1

运行该命令后,按照提示进行修复。

尝试手动挂载: 尝试使用以下命令手动挂载分区,并查看具体的错误信息:

sudo mount /dev/sda1 /mnt

如果挂载成功,你可以访问 /mnt 目录。如果失败,请记录并分析错误信息。

检查磁盘硬件问题: 使用 dmesg命令查看内核日志,查找与 /dev/sda1 相关的错误信息:如果日志中有硬件错误,可能是磁盘本身有问题,需要进一步的硬件检查。

dmesg | grep sda1 

检查挂载点的权限: 确保挂载点目录(如 /media/yangliuan/12321321)存在并且具有适当的权限:

sudo mkdir -p /media/yangliuan/12321321 
sudo chown your_username:your_username /media/yangliuan/12321321 

your_username 替换为你的用户名。如果经过以上步骤后问题仍未解决,可能需要进一步的详细诊断,或者咨询相关的技术支持人员。

手动挂载错误如下:

$MFTMirr does not match $MFT (record 3). Failed to mount '/dev/sda1': Input/output error NTFS is either inconsistent, or there is a hardware fault, or it's a SoftRAID/FakeRAID hardware. In the first case run chkdsk /f on Windows then reboot into Windows twice. The usage of the /f parameter is very important! If the device is a SoftRAID/FakeRAID then first activate it and mount a different device under the /dev/mapper/ directory, (e.g. /dev/mapper/nvidia_eahaabcc1). Please see the 'dmraid' documentation for more details. ChatGPT

这个错误提示表明 NTFS 文件系统存在一些问题,可能是由于文件系统不一致或硬件故障引起的。根据错误信息,你可以尝试以下步骤来解决问题:

在 Windows 下运行 chkdsk: 如果你有 Windows 系统,可以尝试在 Windows 下使用 chkdsk 工具来修复 NTFS 文件系统。打开命令提示符并以管理员身份运行以下命令:

chkdsk /f

这将在下次启动时对磁盘进行检查和修复。确保在 Windows 中运行 chkdsk 后重新启动系统,然后再次启动到 Linux。

检查硬件故障: 如果 chkdsk 无法解决问题,可能存在硬件故障。你可以尝试连接这个硬盘到另一台计算机上,看看是否能够正常访问。如果在其他计算机上也无法正常访问,那么很可能是硬件故障引起的。

使用 ntfsfix 工具: 在 Linux 下,你也可以尝试使用 ntfsfix 工具来尝试修复 NTFS 文件系统。运行以下命令:

sudo ntfsfix /dev/sda1 

这个命令会尝试修复一些常见的、轻微的 NTFS 文件系统问题。

如果以上方法都无法解决问题,可能需要考虑备份数据并格式化磁盘,然后重新创建文件系统。但在此之前,请确保你已经备份了重要的数据。