返回

WSL折腾记

花了三四天折腾了下WSL作为远端服务器,并安装GitLab

Ubuntu安装

安装

1.启用Linux子系统

在系统设置的更新和安全中开启开发者选项。

然后打开 控制面板 -> 程序 -> 启用或关闭Windows功能。找到“适用于Linux的Windows子系统”和“虚拟机平台”,Hyper-v,勾选这三项之后确定,并重新启动计算机。

2.切换系统WSL默认版本到2

使用管理员用户打开CMD,运行:wsl --set-default-version 2

3.Windows自带应用商店中搜索Ubuntu,选一个版本安装。(我这里安装的是20.04LTS )

4.下载完毕后气筒Ubuntu,并在窗口中设置默认登录账号与密码。注意,Linux的密码输入是不提示*号的,只能盲打密码。

开放远程连接端口

注意,这一步是非必要的

由于我这里是准备将该物理机单独出来作为服务器的,所有访问都准备用远程连接的方式,所以需要对电脑进行一些设置。

固定电脑IP

首先,我们需要将IP设置为固定IP地址,防止一些特殊情况导致的物理机IP地址变更。

依次打开控制面板\网络和 Internet\网络和共享中心->更改适配器设置

然后点击物理机主要联网的设备->状态->详细信息,记录下图中框选部分的内容。

接下来我们点击属性->IPV4->属性,然后设置为使用下面的IP(DNS)地址,填入上一步截图的地址,点击确定保存。

升级SSH

  1. 卸载openssh sudo apt-get autoremove --purge openssh-server openssh-client

  2. 更新 sudo apt-get update

  3. 安装ssh服务端和客户端 sudo apt-get install openssh-server openssh-client

  4. 查看服务是否启动,如果正常启动了入下图所示,如果没有启动则没有任何输出。 ps -e|grep ssh

  5. 启动ssh sudo service ssh start

  6. 若启动失败,了解错误原因 sshd -t

  7. 确认ssh-server已经正常工作 netstat -tlp

cmd ssh 访问Ubuntu

在物理机中按下Ctrl+R,输入cmd回车,调出命令提示行。

输入ipconfig,查询本机IP地址。

输入ssh (Ubuntu的用户名)@(IP地址)回车,然后输入Ubuntu的密码。登录Ubuntu。如果没有登录上去,说明之前Ubuntu的安装出问题了,或者电脑没有安装ssh功能。

设置防火墙入站规则

依次打开:控制面板\系统和安全\Windows Defender 防火墙,点击左侧高级设置。

然后点击入站规则->新建规则。

依次选择:端口,下一步,特定端口(输入22),下一步,允许连接,下一步,默认设置,下一步,名称输入ssh,完成。

很多教程说关闭系统防火墙,其实是很危险行为,我们只需要为特定的访问端口开辟特殊权限就行,不必关闭整个防火墙。

局域网访问Ubuntu

接下来我们可以使用局域网上的另外一台物理机来访问Ubuntu

输入ssh (Ubuntu的用户名)@(Ubuntu物理机的IP地址),回车

登录成功,后面就可以远程操控该服务器系统了。

WSL2开放远程连接端口

前面讲到的是WSL的开放端口操作,如果是使用的WSL2,则还需要进行如下操作。

固定WSL的IP地址

wsl2是由windows 的Hyper-V 虚拟平台创建,每次重启windows之后Hyper-V 会重新启动,自然wsl2之前设置好的固定ip也会被重置。而wsl1不一样,wsl1的IP地址和Windows系统是共享的。

创建文本文档,写入如下内容后更改后缀为.bat文件。每次启动以管理员身份运行(电脑重启后会失效,需要再次运行,后面会给出开机自启的方案)。

@echo off
setlocal enabledelayedexpansion


::停掉可能在跑的wsl实例
wsl --shutdown Ubuntu-20.04
::重新拉起来,并且用root的身份,启动ssh服务和docker服务
wsl -d Ubuntu-20.04 -u root service ssh start
if !errorlevel! equ 0 (
    echo docker start success
    :: 看看我要的IP在不在
    wsl -u root ip addr | findstr "192.168.120.181" > nul
    if !errorlevel! equ 0 (
        echo wsl ip has set
    ) else (
        ::不在的话给安排上
        wsl -u root ip addr add 192.168.120.181/24 broadcast 192.168.120.0 dev eth0 label eth0:1
        echo set wsl ip success: 192.168.120.181
    )


    ::windows作为wsl的宿主,在wsl的固定IP的同一网段也给安排另外一个IP
    ipconfig | findstr "192.168.120.100" > nul
    if !errorlevel! equ 0 (
        echo windows ip has set
    ) else (
        netsh interface ip add address "vEthernet (WSL)" 192.168.120.100 255.255.255.0
        echo set windows ip success: 192.168.120.100
    )
)

其中192.168.120.181是设置WSL的IP地址(仅在物理机内部生效),192.168.120.100是为WSL的宿主容器设置的IP地址。

设置Windows开机自启

在Windows中打开任务计划程序,创建任务。

在常规面板设置启动名称,勾选不管用户是否登录都要运行,使用最高权限运行。

在触发器面板设置触发条件为启动时

设置操作面板增加启动程序,程序选中我们上一步创建的.bat文件

后续重启电脑后就会自动执行该文件了

WSL端口转发

如果是在本地物理机上访问,直接使用127.0.0.1即可,但是想在局域网中访问,就需要用到端口转发了

控制台中输入ip a查询WSL的IP地址。

172.25.82.107是WSL原始的内部IP地址,每次启动改变,192.168.120.181是我们上一步为WSL增加的固定IP地址。

用管理员身份打开PowerShell,输入如下指令进行端口转发

netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=22 connectaddress=192.168.120.181

listenport:要转发的Windows端口,listenaddress:监听的IP地址(一台物理机可能有多个网卡,所以会有多个地址,0.0.0.0为监听所有IP),connectport:转发到目标的端口号,connectaddress:转发到目标的IP地址。

输入如下指令查询已经转发的端口

netsh interface portproxy show all

输入如下指令关闭指定端口的转发

netsh interface portproxy delete v4tov4 listenport= 22 listenaddress=0.0.0.0

GitLab

安装

如果使用的是SWL,需要升级到SWL2,且先处理完无法使用systemctl命令的问题(后面Bug中有提到)

参考博客

1.依次在Ubuntu中输入以下命令,在弹窗中直接回车就好

sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
sudo apt-get install -y postfix 

2.然后输入如下代码,信任GitLab的GPS公钥

curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null

3.输入sudo -i进入root模式使用vim进行配置:(按a进入文本编辑模式,按ecs退出编辑模式,输入:q 直接退出,输入:wq保存退出,输入:q!强制退出)

vim /etc/apt/sources.list.d/gitlab-ce.list

4.根据安装的Ubuntu选择不同的版本gitlab-ce 镜像站,复制其中内容到配置中。

deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu bionic main

5.依次输入如下命令进行GitLab安装,安装成功会出现如下界面

sudo apt-get update 
sudo apt-get install gitlab-ce

6.执行配置

(这一步执行报错的请查阅后面Bug栏提到的Ubuntu安装时无法使用systemctl命令Bug)

sudo gitlab-ctl reconfigure

7.启动GitLab

sudo gitlab-ctl start

​ 停止Gitlab命令

sudo gitlab-ctl stop

接下来,我们可以在物理机的浏览器中输入127.0.0.1:80来访问GitLab

开放IP与端口

现在我们还只能在GitLab的宿主物理机上进行访问,想要通过局域网访问,还需要如下修改。

  1. 在物理机中用管理员身份打开PowerShell,执行如下代码,转发80端口到wsl。(具体操作参考前文提到的WSL端口转发

    netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.120.181
    

  2. 修改GitLab配置文件中的IP地址。

    在Ubuntu控制台中输入如下指令,打开gitlab.rb文件进行修改。

    sudo -e /etc/gitlab/gitlab.rb
    

    修改上面绿色部分的IP地址为Ubuntu宿主机(Windows)的IP地址。Ctrl+X保存,然后回车

    然后执行指令sudo gitlab-ctl reconfigure,更新配置

    接下来我们就可以在局域网上物理机的浏览器中,输入192.168.1.20来访问Gitlab。

修改GitLab管理员账号密码

  1. 在Ubuntu控制台中输入 sudo -i切换到超级用户

  2. 输入su - git切换到git用户

  3. 输入gitlab-rails console切换到root用户

  4. 使用user = User.where(id: 1).first,定位到id=1的用户,就是超级管理员

  5. 输入user.password='你的密码' ,修改密码

  6. 输入user.save!,保存更改

Bug

Ubuntu启动失败

Ubuntu安装后打开可能遇到如下情况,出现这个提示,说明需要更新WSL2的内核。

按照提示打开https://aka.ms/wslusers链接。点击下图中的下载链接,下载并安装WSL2内核。

无法使用systemctl命令

当我们使用reboot命令重启Ubuntu时会报如下错误

解决办法:

  1. 输入以下指令,更新软件仓库

    sudo apt-get update

  2. 安装daemonize和fontconfig

    sudo apt install -y fontconfig daemonize

  3. 编辑文本/etc/profile,添加下面代码,按ctrl+x保存,y确定,然后直接回车。

    sudo nano /etc/profile

    SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
    
    if [ -z "$SYSTEMD_PID" ]; then
       sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
       SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
    fi
    
    if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
        exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
    fi
    
  4. 修改/etc/sudoers文件,加入如下内容:

    sudo nano /etc/sudoers

    %sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
    %sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*
    
  5. 输入下面代码,执行脚本

    source /etc/profile

  6. 重新打开ssh窗口

SSH连接时报 远程主机标识已更改 错误

找到提示中的目标文件,用记事本打开后删除目标地址主机的内容即可。

Licensed under CC BY-NC-SA 4.0
0