admin 管理员组文章数量: 1086761
文章目录
- 检查端口占用
- 检查网络连接
- 生成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
手动安装
- 打开 控制面板 > 程序和功能 > 启用或关闭 Windows 功能。
- 勾选以下选项:
- 适用于 Linux 的 Windows 子系统
- 虚拟机平台
- 点击 确定,系统会应用更改并要求重启。
查看可用版本
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
,它就是当前ubuntu
的ip
地址,如果你有多个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)
}
版权声明:本文标题:window 开发知识 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1747679201a2570226.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论