最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

window 开发知识

运维笔记admin4浏览0评论

文章目录

  • 检查端口占用
  • 检查网络连接
  • 生成ssh-key
    • 常见 SSH 公钥加密算法
    • 推荐算法:ED25519
    • 如果使用 RSA,要注意
  • wsl
    • 检查 Windows 版本
    • 安装wsl(如果 wsl --install 不可用)
      • 安装 wsl
      • 手动安装
    • 查看可用版本
    • 你可以运行多次 wsl --install -d 命令来安装不同的发行版
    • 切换默认发行版
    • 删除某个发行版
    • 查看已安装的发行版
    • 进入
    • 查看宿主机虚拟机ip
    • 配置.wslconfig 文件
    • 配置 wsl.conf 文件
    • wsl中安装docker
      • WSL 开机运行
    • wsl网络配置
      • 1. windows端 .wslconfig
      • 2. ubuntu端 /etc/wsl.conf
      • 3. ubuntu端 /etc/resolv.conf 访问外部网络,绑定dns
      • 4.让外部网络访问本地机器内的wsl服务
    • 迁移linux系统挂载
    • 配置linux账号密码
    • 配置linux系统ssh登录
    • 配置dns永久生效
  • netsh
    • 1. 查看端口映射清单
    • 2. 添加端口映射
    • 3. 删除端口映射
    • 4. 查看特定端口情况
  • 问题
    • docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306
    • go 打包exe文件, 启动报错 panic time missing Location in call to ...

检查端口占用

netstat -ano
# 查找到某个特定端口的使用情况(例如 8080)
netstat -ano | findstr 8080
  • -a:显示所有活动的连接和监听端口。
  • -n:以数字形式显示地址和端口号。
  • -o:显示每个连接对应的进程 ID(PID)。

如果需要进一步定位使用该端口的程序,可根据 PID 查找

  • 打开任务管理器(快捷键 Ctrl + Shift + Esc)。
  • 切换到 “详细信息” 选项卡,找到对应的 PID,查看具体的进程名称。

检查网络连接

ping <服务器IP>
telnet <服务器IP> <端口号>

生成ssh-key

ssh-keygen -t ed25519 -C "your_email@example"

解释:

  • -t ed25519 :使用 RSA 加密算法
  • -C:添加一个标识(邮箱)

常见 SSH 公钥加密算法

算法命令参数特点推荐指数
RSA-t rsa兼容最广,默认支持,需设置长度⭐⭐⭐⭐
ED25519-t ed25519更快、更安全、密钥更短⭐⭐⭐⭐⭐
ECDSA-t ecdsa性能好,但某些老系统兼容差⭐⭐
DSA-t dsa已过时,不推荐使用

推荐算法:ED25519

  • 优点:

    • 更快的签名和验证速度

    • 更小的密钥和签名尺寸

    • 更强的安全性(曲线更安全)

  • 兼容性:

    • OpenSSH 6.5+ 才支持(2014 年之后都支持)
ssh-keygen -t ed25519 -C "your_email@example"

如果使用 RSA,要注意

默认是 2048 位,建议使用 4096 位 提升安全性:

ssh-keygen -t rsa -b 4096 -C "your_email@example"

wsl

在 Windows 上安装 WSL(Windows Subsystem for Linux)可以让你运行 Linux 环境,下面是详细的安装步骤

检查 Windows 版本

确保你的 Windows 支持 WSL:

  • Windows 10:版本 1903 或更高(Build 18362 及以上)。
  • Windows 11:所有版本支持。

安装wsl(如果 wsl --install 不可用)

安装 wsl

# 这个命令会自动启用 WSL 和虚拟机平台,并安装默认的 Linux 发行版(通常是 Ubuntu)
wsl --install
# 升级wsl
wsl --update

手动安装

  1. 打开 控制面板 > 程序和功能 > 启用或关闭 Windows 功能。
  2. 勾选以下选项:
    • 适用于 Linux 的 Windows 子系统
    • 虚拟机平台
  3. 点击 确定,系统会应用更改并要求重启。

查看可用版本

wsl --list --online

PS C:\workspace\projectspace\BravePuppyServer\game\script> wsl --list --online
以下是可安装的有效分发的列表。
使用 'wsl.exe --install <Distro>' 安装。

NAME                            FRIENDLY NAME
Ubuntu                          Ubuntu
Debian                          Debian GNU/Linux
kali-linux                      Kali Linux Rolling
Ubuntu-18.04                    Ubuntu 18.04 LTS
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
Ubuntu-24.04                    Ubuntu 24.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_7                 Oracle Linux 8.7
OracleLinux_9_1                 Oracle Linux 9.1
openSUSE-Leap-15.6              openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
openSUSE-Tumbleweed             openSUSE Tumbleweed

你可以运行多次 wsl --install -d 命令来安装不同的发行版

wsl --install -d Ubuntu
wsl --install -d Debian

参数说明

  • --install:安装 WSL 并自动启用所有必要的功能(如虚拟机平台)。
  • -d--distribution:指定要安装的 Linux 发行版。
  • <distribution-name>:目标发行版的名称,例如 Ubuntu、Debian、Kali-Linux 等。

切换默认发行版

wsl --set-default <distribution-name>

wsl --set-default Debian

删除某个发行版

wsl --unregister <distribution-name>
wsl --unregister Debian

查看已安装的发行版

wsl --list
# 或
wsl -l

进入

# 进入默认的 可以通过wsl --set-default Debian 进行设置
wsl
# 指定目标发行版的名称 例如wsl -d Debian
wsl -d <发行版名>

查看宿主机虚拟机ip

# 查看宿主机ip
cat /etc/resolv.conf

# 在windows中查看wsl ip
wsl hostname -I

配置.wslconfig 文件

WSL 有 2 个重要的配置文件 .wslconfig 和 wsl.conf,其中 .wslconfig 位于 Windows 系统上,wsl.conf 位于 Linux 发行版系统上。首先介绍配置 .wslconfig。

打开 .wslconfig 文件目录:Win+R 运行 %UserProfile% ([通常是cd ~]用户目录),会打开用户目录,然后新建一个 wslconfig 文件。 .wslconfig 配置可以参考如下内容:

[experimental]
#自动释放内存
autoMemoryReclaim=gradual
#网络镜像模式
networkingMode=mirrored
hostAddressLoopback=true
#共用 Windows DNS、防火墙、代理设置
dnsTunneling=true
firewall=true
autoProxy=true

配置 wsl.conf 文件

wsl.conf 的作用是配置自启动程序、磁盘自动挂载等,文件目录为:/etc/wsl.conf。下面是参考案例:

[boot]
#启用 systemd
systemd=true
#开机运行 docker
service docker start

.wslconfig 和 wsl.conf 的详细参数可以参考官方文档:

https://learn.microsoft/zh-cn/windows/wsl/wsl-config

wsl中安装docker

安装 Docker
docker 可以通过发行版的包管理工具安装,比如 Ubuntu(sudo apt install docker docker-compose),也可以用官方的安装脚本进行安装:

curl -fsSL https://get.docker -o get-docker.sh
sudo sh get-docker.sh
sudo service docker start

在本文案例中 WSL 采用了 networkingMode=mirrored 镜像网络模式,好处是可以用 Windows 相同 IP 访问到 docker 。但是必须配置一下,否则无法访问 docker 容器。

  • 方法一:ignoredPorts
    在 .wslconfig 中通过 ignoredPorts 命令设置放行的端口,通过这些端口可以顺利访问你部署的 docker 容器。

    [experimental]
    networkingMode=mirrored
    hostAddressLoopback=true
    ignoredPorts = 8000,8080
    
  • 方法二:hostAddressLoopback
    在 .wslconfig 中添加 hostAddressLoopback=true :

    [experimental]
    networkingMode=mirrored
    hostAddressLoopback=true
    

然后进入 Linux 发行版编辑 docker 配置文件:/etc/docker/daemon.json,添加:

{
"iptables": false
}

这个方案的缺点是无法使用 iptables。

添加中文环境支持

如果遇到中文显示乱码检查一下是否安装中文字体


sudo apt install fonts-noto-cjk

WSL 开机运行

如果你想开机运行 WSL (让你的 docker 容器随时可访问),首先查看发行版名称并记下来:

wsl -l --all

PS C:\Users\123> wsl -l --all
适用于 Linux 的 Windows 子系统分发:
Ubuntu-24.04 (默认)
docker-desktop-data
docker-desktop
PS C:\Users\qupen>

Win+R 运行 shell:startup 打开启动目录,创建一个 wsl-startup.vbs 脚本文件,脚本内容如下:

set ws=wscript.CreateObject("wscript.shell")
ws.run "wsl -d Ubuntu-22.04",vbhide

可自行修改 Linux发行版名称(本案例为 Ubuntu-22.04),vbhide 参数为隐藏窗口运行。这样 WSL 的 Linux 发行版就会在开机时就运行。

然后装一个好用的 docker 管理器比如:dockge 或者 portainer,就可以在开始折腾了,就像把你的 Linux 主机和 Windows 二合一了一样。

wsl网络配置

# windows 宿主机获取wsl服务器地址
# 如果查询默认分发,则可省略指定该分发的此部分命令:-d <DistributionName>。 请务必使用大写 -I 标志,而不是小写 -i。
wsl -d <DistributionName> hostname -I

# wsl中查看宿主机ip
ip route show | grep -i default | awk '{ print $3}'

https://learn.microsoft/zh-cn/windows/wsl/networking

https://blog.csdn/visket2008/article/details/142822361

1. windows端 .wslconfig

此文件为对wsl端网络、硬件资源、文件路径等相关配置参数,所在目录为C:\Users\{你的系统用户名}\.wslconfig请将配置都删除掉。

[wsl2]
processors=8  # 分配给linux的cpu
memory=10737418240 #分配给linux的内存

上述不知道怎么配置,也可以直接在系统上搜索wsl

2. ubuntu端 /etc/wsl.conf

此文件内,用于记录系统端配置加载项,如果其他项你控制不了,请都删掉,按我的配置

[boot]
systemd=true   # 开启systemctl

[network]
hostname=ubuntu22  # 给自己主机起一个名字
generateResolvConf=false  # 是否开启自动生成resolv配置文件,用于生成dns

[user]
default=root    # 系统登录默认用户

完成上述配置后,退出系统,依次在windows命令行执行下列

# windows 命令行界面执行
# 关闭wsl
wsl --shudown
# 查询是否关闭,state显示为stopped
wsl -l -v
# 启动wsl
wsl

至此,应该可以正常访问网络进行下载了,不过执行ping www.baidu 应该还是会出错,因为dns解析出错了。

# ubuntu环境下执行命令
root@ubuntu22:/data# ping www.baidu
ping: www.baidu: 域名解析暂时失败

3. ubuntu端 /etc/resolv.conf 访问外部网络,绑定dns

此文件用于系统生成dns解析配置,这里你需要了解一些网络知识,包括ip、网关、dns等。当关闭了wsl.conf文件中自动生成resolv配置文件后,需要手动去创建了。

我们打开windows端的网络配置,自己找到windows系统的网络连接入口。

这里可以发现,再windows上wsl的网络地址ip为172.17.192.1,你可以理解为,wsl系统的网络ip地址就是这个。

而我们在ubuntu内再查看一下当前ubuntu的ip地址,可以发现都在一个网段172.17中,说明wsl中每个操作系统都会有一个基于网关ip的精确ip地址。

总结:wsl就是一个网关地址,它会将通过wsl进行创建的N个操作系统统一连接到该ip地址转发出去上网。所以,作为内部操作系统的ubuntu,只要能配置连接上wsl,就能访问外部网络。

下面我们来修复dns,执行route -n查看到的网关就得到ip地址就是172.17.192.1

ubuntu24@ubuntu24:$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.192.1    0.0.0.0         UG    0      0        0 eth0

注意看到的0.0.0.0对应的网关地址,就是你windows机器上 虚拟网络wsl的ip地址。根据之前查询的内容,说明网络已经完成了匹配和映射,现在我们只需要绑定一下dns的nameserver即可。

route -n 命令不存在, 则可以直接指定在windows 中查看的wsl的ip 即上面的172.17.192.1

# ubuntu端
vi /etc/resolve.conf

# 添加下列内容,注意nameserver后面的地址,一定是你上述route -n 查询到的网关地址
nameserver 172.31.32.1
options edns0 trust-ad

配置完成,保存该文件。再次测试ping命令,显示成功

root@ubuntu22:/data# ping www.baidu
PING www.a.shifen (183.22.17.52) 56(84) bytes of data.
64 bytes from 183.22.17.52 (183.22.17.52): icmp_seq=1 ttl=49 time=21.2 ms
64 bytes from 183.22.17.52 (183.22.17.52): icmp_seq=2 ttl=49 time=21.1 ms

4.让外部网络访问本地机器内的wsl服务

网络本身不复杂,就是一个网络访问领一个网络的网关,然后转发给该网络内的机器或网关设备继续转发

如果需要电脑A访问电脑B中的wsl-ubuntu,在保证电脑A可以正确访问到电脑B,我们只需要解决电脑B访问本地wsl-ubuntu即可。

如果按照上述配置wsl网络完成,说明网络已经打通了,剩下要解决的只有端口映射了,NAT网络需要手动指定映射,就像docker一样,运行的docker容器,需要指明内部服务的端口号和外部服务端口号绑定关系,否则无法访问进去,这种方式是为了避免端口冲突。

实际操作,在windows端命令行执行,第一个IP显示为172.17.203.110,它就是当前ubuntuip地址,如果你有多个wsl系统,建议还是通过ubuntu内,执行ifconfig查看。

C:\Users>wsl hostname -I
wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。
172.17.203.110

接着直接在windows端的命令行界面中,ping该ip地址,如果畅通表示网络连接是成功的。

C:\Users>ping 172.17.203.110

正在 Ping 172.17.203.110 具有 32 字节的数据:
来自 172.17.203.110 的回复: 字节=32 时间<1ms TTL=64
来自 172.17.203.110 的回复: 字节=32 时间<1ms TTL=64

再根据该ip地址,在windows端的命令行界面,配置ip+端口映射关系

#listenport=外部宿主机端口
#connectport=内部wsl虚拟机端口
#connectaddress=执行wsl hostname -I 查看的非127.0.0.1的ip地址
netsh interface portproxy add v4tov4 listenport=1521 listenaddress=0.0.0.0 connectport=3006 connectaddress=172.17.203.110

迁移linux系统挂载

wsl2的文件系统是通过windows挂载磁盘中的vhdx实现的,此linux系统默认会安装在C盘中,路径大概是如下,有兴趣可以找找。

C:\Users\${系统用户名}\AppData\Local\Packages\CanonicalGroupLimited.${安装系统临时命名}\LocalState\ext4.vhdx

也就是说,随着我们在这个系统上安装越多东西,它会直接占用C盘空间,显然不符合长期使用的路子,我们先更改一下将磁盘映射挂载到其他目录中。
先将目前在运行的系统全部关闭掉。

PS C:\Users\pc> wsl --shutdown
PS C:\Users\pc> wsl -l -v
  NAME       STATE           VERSION
* Ubuntu    Stopped         2

系统状态为停止后即可开始迁移文件系统,我们先对目前的文件系统做镜像导出。

# 在管理员命令行窗口执行
# ubunt   表示上述我查询的子系统名称
# D:\wsl\system\ubuntu.tar 表示我需要将子系统镜像导出到哪里存储
PS C:\Users\pc> wsl --export Ubuntu D:\wsl\system\ubuntu.tar
正在导出。
操作成功完成

短暂等待后应该即可导出完成,接下来我们要做的就是卸载当前的系统文件挂载。

PS C:\Users\pc> wsl --unregister Ubuntu
正在注销。
操作成功完成。

接下来继续执行到新的地址中做挂载,请尽量选择空间大的盘符,避免多次迁移的问题。

# ubunt22 表示新的系统名称是什么
# D:\wsl\ubuntu22\ 表示新的系统文件挂载在哪个目录中
# D:\wsl\system\ubuntu.tar 表示需要导入的是哪个子系统文件
# --version 2 表示使用wsl2还是wsl1版本
wsl --import  ubunt22  D:\wsl\ubuntu22\  D:\wsl\system\ubuntu.tar  --version 2

导入完毕后直接打开系统,看是否能进入操作系统即可。

配置linux账号密码

每个子系统的账号密码独立的,且不予windows账户产生关系,若忘记了操作系统的账号密码,请打开命令行工具,并使用以下命令进入默认 WSL 分发版的根目录:

wsl -u root

如果需要在非默认分发版中更新忘记的密码,请使用命令:

#将 Ubuntu 替换为目标分发版的名称。
wsl -d Ubuntu -u root

在命令行工具内的根级别打开 WSL 发行版后,可使用此命令更新密码:

# 其中 <username> 是发行版中帐户的用户名,而你忘记了它的密码
passwd <username>

系统将提示你输入新的 UNIX 密码,然后确认该密码。 在被告知密码已成功更新后,在命令行工具内关闭

配置linux系统ssh登录

更新子系统

# 适用于 Ubuntu 和 Debian
sudo apt update && sudo apt upgrade

windows系统上直接访问linux,使用terminal已经是看起来最友好的方式了,但并不好用,这里建议使用ssh的方式进行访问,这样我们就能使用xshell之类的应用无缝访问,但初始安装的ubuntu是没有ssh的,好像ubuntu24版本默认自带了,因此我们需要自己安装。

# 尝试启动ssh服务,发现没有这个服务
root@DESKTOP-7DNO2OG:/data# service ssh start
Failed to start ssh.service: Unit ssh.service not found.
# 接着执行安装服务
root@DESKTOP-7DNO2OG:/data# sudo apt-get install openssh-server
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done

安装完毕后,执行下面命令确认服务状态,我执行完毕后处于active状态了,说明开启sshd服务成功,可以被远程访问了。

root@DESKTOP-7DNO2OG:/data# systemctl restart ssh.service
root@DESKTOP-7DNO2OG:/data# service ssh status
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-09-09 14:04:41 CST; 7s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 1245 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 1246 (sshd)
      Tasks: 1 (limit: 19089)
     Memory: 1.8M
     CGroup: /system.slice/ssh.service
             └─1246 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

服务启动成功了,但本地可能访问不了,因为端口ip账号是否使用证书等配置还没有做,下面去修改sshd配置,以下为账号密码最小配置方式,由于是本地不考虑安全问题。

# 编辑本页面
vi /etc/ssh/sshd_config

#接下来放开被注释的属性,并设置为自己想要的
# 系统ssh访问端口号
Port 50022
# 许可访问ip
ListenAddress 0.0.0.0
# 开启密码验证方式
PasswordAuthentication yes

# 重启sshd服务
systemctl restart sshd

至此,sshd服务配置完成,通过你自己习惯用的第三方ssh工具连接即可。
若需要开启外部访问,建议关闭账号密码访问方式,配置证书访问,本文最后附一下所有配置证书登录和完整的sshd_config配置。

附:

配置证书登录模式,创建证书,修改sshd_config

# 生成证书,建议添加密码,出现在/root/~/.ssh目录下
ssh-keygen -t rsa
# 导入公钥
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

# 设置权限
chown -R 0700  ~/.ssh
chown -R 0644  ~/.ssh/authorized_keys

# 设置策略
vi /etc/ssh/sshd_config

RSAAuthentication yes
StrictModes no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 重启服务
systemctl restart sshd

# 将id_rsa复制到远程连接的客户端电脑
# 配置通过证书ssh连接
# 连接成功后继续去服务器修改策略
vi /etc/ssh/sshd_config

# 关闭通过密码登录(请先保证使用证书登录成功,再来修改关闭密码登录策略)
PasswordAuthentication no  

# 重启服务
systemctl restart sshd

配置dns永久生效

1、修改 /etc/systemd/resolved.conf 文件

vi  /etc/systemd/resolved.conf

# 指定 DNS 服务器,以空白分隔,支持 IPv4 或 IPv6 位置
DNS=8.8.8.8 114.114.115.115
# 备用 DNS 服务器
FallbackDNS=8.8.8.8
# 设置搜索域名
Domains=domain
# 设置 LLMNR 是否激活,可用的选项有 yes、no、resolve
LLMNR=yes
# 设置 MulticastDNS 是否激活,可用的选项有 yes、no、resolve
MulticastDNS=yes
# 设置 DNSSEC 是否激活,可用的选项有 yes、no、allow-downgrade
DNSSEC=yes
# 设置缓存是否激活,可用的选项有 yes、no、no-negative
Cache=no-negative

根据需要修改 resolved.conf 文件中的DNS,然后保存。
2、重启 systemd-resolved 服务

systemctl restart systemd-resolved

3、设置开机启动 systemd-resolved 服务

systemctl enable systemd-resolved

4、备份 systemd-resolved 托管文件 resolv.conf

mv /etc/resolv.conf /etc/resolv.conf.bak

重新生成

ln -s /run/systemd/resolve/resolv.conf /etc/

netsh

1. 查看端口映射清单

netsh interface portproxy show v4tov4

2. 添加端口映射

netsh interface portproxy add v4tov4 listenaddress=宿主机ip listenport=宿主机端口 connectaddress=虚拟机ip connectport=虚拟机端口

# 示例
netsh interface portproxy add v4tov4 listenport=9111 listenaddress=0.0.0.0 connectport=9101 connectaddress=172.17.203.110

3. 删除端口映射

netsh interface portproxy delete v4tov4 listenaddress=宿主机ip listenport=宿主机端口

4. 查看特定端口情况

netstat -anp|grep "端口"

问题

docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306

重启电脑之后,启动mysql报错端口占用,使用netstat -aon | findstr 查看并没有占用

解决:
重启NAT网络就可以解决了,以管理员身份运行windows powershell执行下面两条命令:

net stop winnat
net start winnat

再次启动容器,成功!

go 打包exe文件, 启动报错 panic time missing Location in call to …

在golang 使用“Asia/Shanghai” 时区转换时间格式,本机正常,其他机器报错panic time missing Location in call to …

这是由于缺少IANA TimeZone Database,一般在linux系统都自带了,但是在window系统中可能会缺失。

//时间 to 时间戳
	nyc, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		nyc = time.FixedZone("CST", 8*3600)
	}
发布评论

评论列表(0)

  1. 暂无评论