深入理解 WSL2

  1. 手工安装: https://docs.microsoft.com/en-us/windows/wsl/install-manual
  2. Win 10 上的安装办法: https://docs.microsoft.com/en-us/windows/wsl/install-win10
  3. 从 WSL1 到 WSL2: https://docs.microsoft.com/en-us/windows/wsl/wsl2-ux-changes WSL2 使用了 VHD 格式存放 Linux 根
  4. /etc/wsl.conf 的配置 https://devblogs.microsoft.com/commandline/automatically-configuring-wsl/
  5. 从 Windows 访问 WSL 里面的文件 \\wsl$ , 9PServer 协议, https://devblogs.microsoft.com/commandline/whats-new-for-wsl-in-windows-10-version-1903/
  6. 对 WSL 里面进程的理解: https://blogs.msdn.microsoft.com/wsl/2016/10/19/windows-and-ubuntu-interoperability/
  7. WSL 里面的网络是怎么工作的: https://blogs.msdn.microsoft.com/wsl/2016/11/08/225/
  8. WSL 的前生 https://blogs.msdn.microsoft.com/wsl/2016/04/22/windows-subsystem-for-linux-overview/
  9. WSL 的文件系统 https://blogs.msdn.microsoft.com/wsl/2016/06/15/wsl-file-system-support/

后记, 有些 Windows 10 版本不能设置 wsl 版本, –set-version 这个选项都没有,因此不能生成 vhdx 文件,根据该文章的评论, 需要 Win10 升级到 18950 版本号才可以,默认是 18362。

wsl 命令行下载,安装后,运行 Ubuntu1804.exe 默认就安装到 %localappdata%\Packages 下。继续重新运行后可以指定进入的默认用户

在 Win10 上,进入设置(Win + I 快捷键)里的“更新和安全”,开启 “Windows 预览体验计划”,然后,检查“Windows 更新”,选择 “快”方式(每周一个更新),系统会自动检查到最新的预览版,然后下载和安装更新(需要经过几次重启)就可以看到桌面上右下角显示预览版了。

然后就是把 wsl 里面的 Ubuntu 格式升级到 2: 用 wsl -l -v 可以看到升级前的两个Ubuntu 版本都为 1,我们对 “Ubuntu” 这个升级到 2:

可以看到升级以后在 d:\ubuntu 目录下 生成了一个新的 ext4.vhdx 文件,而原先的 rootfs 目录不见了。

这个还不够,我们玩 Linux 当然要能远程 ssh 进入 wsl2 里面, 怎么办?
对熟悉 Linux 的人而言, 开启 ssh ,是很简单的事情, service ssh start 即可,如果没有安装过的话, 那就 apt update; apt install openssh-server 即可。
安装并启动 ssh 后, 只实现了 Win10 本机 ssh localhost 可以通信,但是外部机器无法访问 wsl2 里的 Ubuntu。这是因为 Win 10 上有一块 wsl 的网卡,wsl2 里面的机器都通过这块网卡和外部通信,但是反向当然不行。我们需要用 Win10 的 netsh 命令添加一条 端口转发的规则:
C:> netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=22 connectaddress=172.22.207.70
后面的 172 的地址就是 WSL2 Ubuntu 机器上 eth0 的地址。
当然,添加完这条,只是能用 ssh 192.168.x.x 你的 Win10 的 IP 地址能访问,如果让外部能访问的话, 还需要打开防火墙的 22 端口, 这个就去防火墙设置一条入站规则即可。同时建议设置 远程桌面的允许和远程桌面的入站允许。这样, Win10 机器就可以当成一台服务器来使用了。
有点爽!

curl 下载下来的 ubuntu App, 每次运行,如果还没有安装, 默认是安装到 %localappdata%\packages 目录下的,我这里的 d:\ububtu 是怎么来的呢?
原来我是用了 wsl 的 export/import 功能,相当于把影像放到了新目录下, 然后用 wsl –unregister 命令就可以销毁原来的影像了。
希望下次 ubuntu18.04.exe 命令执行的参数能指定 install-root .

哦, 对了还有 wsl2 里面的 Linux 要显示中文怎么办?

运行 # locale-gen zh_CN.UTF-8

目前解决通过 Win10 静态 IP 地址访问 WSL2 的办法是当 WSL2 重启(IP地址修改)时,自动更新转发规则.


让 Windows 10 快得飞起

尽管在 Win7 的世界里, msconfig 是我经常使用的一个命令, 但是升级到 Win10 后,机器巨卡, 8G 的内存使用率还好, 老旧 4核 i5 2520M CPU 经常到 100%。
翻了一下网上的教程, 用 msconfig 进入服务,隐藏所有微软服务, 然后全选留下的应用, 然后点击全部禁用。 重新启动后, Win 10 真的快的飞起。

原先的 ThinkPad X220 Win7 都能通过 MediaCreattionTool1903 下载工具升级,下载运行后直接选择“升级本电脑”即可。(Dell 笔记本升级失败)

升级完成后 运行 slmgr.vbs -dlv 可以得到如下输出:

如果运行 slmgr.vbs -xpr 则显示:


Cygwin 清华以及华为云镜像

清华镜像:https://mirrors.tuna.tsinghua.edu.cn/cygwin/
在 cmd 命令行下安装 Cygwin 软件包
假设原先的 setup 命令安装在 C:\cygwin64\cygwinsetup.exe 
我们只要运行
cygwinsetup -q -P package1_name, package2_name 
即可安装软件包,没有在 Mintty 下运行的原因是, 如果遇到升级,mintty 会被 kill 掉,安装会失败。 当然大多数情况下, 你也可以在 mintty 下,直接安装。例如:
譬如我们用华为云的镜像安装 curl 
$ ./cygwinsetup.exe -XqOs https://repo.huaweicloud.com/cygwin/ -P curl
$ /cygdrive/c/cygwin64/cygwinsetup.exe  --help
Cygwin setup 2.897

Command Line Options:

 --allow-unsupported-windows    Allow old, unsupported Windows versions
 -a --arch                         Architecture to install (x86_64 or x86)
 -C --categories                   Specify entire categories to install
 -o --delete-orphans               Remove orphaned packages
 -A --disable-buggy-antivirus      Disable known or suspected buggy anti virus
                                   software packages during execution.
 -D --download                     Download packages from internet only
 -f --force-current                Select the current version for all packages
 -h --help                         Print help
 -I --include-source               Automatically install source for every
                                   package installed
 -i --ini-basename                 Use a different basename, e.g. "foo",
                                   instead of "setup"
 -U --keep-untrusted-keys          Use untrusted keys and retain all
 -L --local-install                Install packages from local directory only
 -l --local-package-dir            Local package directory
 -m --mirror-mode                  Skip package availability check when
                                   installing from local directory (requires
                                   local directory to be clean mirror!)
 -B --no-admin                     Do not check for and enforce running as
                                   Administrator
 -d --no-desktop                   Disable creation of desktop shortcut
 -r --no-replaceonreboot           Disable replacing in-use files on next
                                   reboot.
 -n --no-shortcuts                 Disable creation of desktop and start menu
                                   shortcuts
 -N --no-startmenu                 Disable creation of start menu shortcut
 -X --no-verify                    Don't verify setup.ini signatures
    --no-version-check             Suppress checking if a newer version of
                                   setup is available
 -O --only-site                    Do not download mirror list.  Only use sites
                                   specified with -s.
 -M --package-manager              Semi-attended chooser-only mode
 -P --packages                     Specify packages to install
 -p --proxy                        HTTP/FTP proxy (host:port)
 -Y --prune-install                Prune the installation to only the requested
                                   packages
 -K --pubkey                       URL of extra public key file (gpg format)
 -q --quiet-mode                   Unattended setup mode
 -c --remove-categories            Specify categories to uninstall
 -x --remove-packages              Specify packages to uninstall
 -R --root                         Root installation directory
 -S --sexpr-pubkey                 Extra public key in s-expr format
 -s --site                         Download site URL
 -u --untrusted-keys               Use untrusted saved extra keys
 -g --upgrade-also                 Also upgrade installed packages
    --user-agent                   User agent string for HTTP requests
 -v --verbose                      Verbose output
 -V --version                      Show version
 -W --wait                         When elevating, wait for elevated child
                                   process

The default is to both download and install packages, unless either --download or --local-install is specified.

Cygwin HOME 默认为 /home/$U 如果我们修改 /etc/nsswitch.conf 把
db_home: 值修改为 /%H , 那么 Cygwin 可以使用 Windows 的 HOME 了. 不要忘记开头的 反斜杠啊!

如果我们去查看 git-scm 自带的 git bash 的话, 可以看到 /etc/nsswitch 的设置是

也就是说, 我们如果用 Cygwin 的话, 参照上面的 db_home 也应该是可以设置为 Windows 的 Home 的, 也就是 c:\Users\username

个人推荐的几个包: tree, psmisc, screen, wget, curl, procps

apt-cyg 是个好东东, 还是强烈推荐使用,简单方便。
安装 apt-cyg 就是 git clone https://github.com/transcode-open/apt-cyg.git
然后 cd apt-cyg; install apt-cyg /bin
使用 apt-cyg 就很简单了。 命令行不加任何参数就显示帮助, 列出本地安装的软件包就是 apt-cyg list
显示当前的使用的镜像就是 apt-cyg mirror
显示软件包里的所有文件: apt-cyg listfiles packageName

把 openssh 作为服务安装:
1. 运行 ssh-host-config -y
2. 然后可以用 net start cygsshd 或者 cygrunsrv -S cygsshd 启动

补充:
1. 在后面的文章有提到 KVM NFS 共享存储时,想到在 Cygwin 下也能直接挂接 Linux 上的 NFS 存储, 搜索了下, Cygwin 只能挂接自身的,不能挂接外面的 NFS 服务,因为需要原生的 NFS 文件系统驱动才能挂接,要么是打开 Windows 的 Unix 套件,但是那个和 Cygwin 本来就是“竞争对手”,如果要那个,就不会安装 Cygwin 了。 所以,这个算是 Cygwin 的一个缺点吧。


choco 安装 WNMP 关于 Nginx 的小坑

  1. 要安装 Nginx-Service , 如果安装 nginx 不能成功
  2. 除了安装 PHP 外, 还要安装 php-service (就是 php-fpm了)
  3. 默认的 Nginx 配置有严重的问题,需要大修(修复后文件见截屏)
  4. 上步骤,简略版本:
  • choco install nginx-service
  • choco install php
  • choco install php-service
  • vim c:\tools\nginx\conf.d\server.default.conf
  • nssm restart nginx-service

Git for windows 自带的 mintty 中文显示问题

在 Windows 7 ,默认中文字符集的情况下, 我们启动 mintty,设置选项 locale 为 zh_CN,Character Set 为 UTF-8,同时在进入 mintty 后的环境里面,设置 LC_ALL=zh_CN.UTF8
LANG=zh_CN.UTF8

才能让 ping 命令 和 ls -al 命令以及 less 结果都能正确的显示中文
mintty 的配置保存在 $HOME/.minttyrc 文件里,以上两个环境变量可以在 $HOME/.bashrc 下 export 即可。

Linux 下有 Locale 命令可以打印出当前语言相关的环境变量,各个变量的解释可以参见: The Single UNIX ® Specification, Version 2,可以说学习 Linux 要先把这篇文章中的概念都搞清楚。

中文文件内容如果是 GBK 编码的话, 用 less 会乱码, 要
export LESSCHARSET=latin1

另外在 mintty 里, 可以执行 /c/windows/system32/chcp.com 显示当前操作系统默认的 Code Page,(中文简体为 936),如果需要修改为 UTF-8,可以加参数 65001 。

所以,如果 Mintty 本身设置为 GBK 的话,进入终端后,运行 locale 命令,就可以得到如下结果:

在这个环境下,我们运行 ping 命令,上下两部分都能正确显示中文:


由于我们使用 Mingtty 登录到远端的 Linux 主机,它们绝大多数为 UTF 字符集,所以 以上设置 LC 变量为 zh_CN.GBK 是不可行的。
正确的办法还是设置 Mingtty 本身的字符为 zh_CN.UTF8,然后在 Win 7 下的 mingtty 绝大多数命令是没有问题的, 只有 ping 命令显示有问题, 解决的办法是在运行 ping 命令之前, 修改操作系统 code page为 UTF-8. 添加如下行到 $HOME/.bashrc 即可
# Change code page to UTF8
${SYSTEMROOT}/System32/chcp.com 65001 >/dev/null



VS Code Tips

用 VS Code 写代码估计很快能成为事实标准,工欲善其事必先利其器,写一个 VS Code 的小诀窍,很有必要。

  1. 把常用目录添加到忽略清单里,这样 code 每次启动,就不会检查这些文件夹,例如 node_modules 目录
  2. 利用 Windows Git 自带的 git bash 功能,在项目目录右键选择 Git Bash Here,直接进入项目目录后运行 code . 或者添加一个”发送到” VS Code 的快捷方式,可以快速的打开项目。
  3. 把显示语言设置为中文, 按Ctl-Shift-P 进入命令盘,输入 Display Language,选择 en 下面的 Install additional languages,选择简体中文,重启 code 即可
  4. 为了让自己的编辑器更有个性化,我们可以选择自己喜欢的主题,按 Ctl-K, Ctl-T 即可选择不同的主题。

  5. Code 选择默认 shell,用 Ctl-Shift-~ 可以新开一个终端

另类 Sendto:把 VS Code 加到“发送到”

本来打开一个项目的做法是在项目目录上右键 “Git Bash Here”,然后运行 code . 就可以在 VS Code 打开整个项目了。

早上突发奇想,觉得这个应该可以用“发送到”相当于把整个目录丢进 VS Code 就可以,何必中间多去 Git Bash 进入一次? 于是搜索一下解决方案,很简单:

打开文件浏览器,输入 shell:sendto,然后把 VS Code 的快捷方式拖入,然后就可以右键文件夹,选择“发送到”,看到 VS Code,直接就可以把项目丢进 VS Code 了。

2019年五一节关于微软的一些文章

微软最近市值上了万亿, 老徐最近也贡献了300多元钱,买了一个 Office365 的个人版。 在 Mac 电脑上安装了全套的几个 App 。但是发现 Outlook 没有 RSS 订阅的功能,而在 Windows 版本上是有那个功能的。 只好继续使用 Mozilla Thunderbird 来订阅 RSS。

一大堆 RSS 挑了几篇自己感兴趣的分享一下,有几篇不一定和微软有关。
文章内容不翻译, 就直接贴链接,写一下我的点评。所有贴出的链接,由于订阅号不支持外链,可以点击查看原文去我公司的博客打开链接。

第一篇是关于”软件定义收音机”, Software Defined Radio,作为无线电专业毕业的老徐,自然听到 Radio,这个词, 要稍微多瞄一眼。 基本上就是把捡拾到的无线电波转换成数字形式通过电脑播放。 看这个软件的界面,还真的是功能丰富,多种波段都支持。 当然,这个作为给孩子的 STEM 课程,对于孩子理解无线电波是很有作用的。 (原文链接

第二篇是关于把 PostgreSQL 转换成时序数据库的,微软 Azure 上的 PostgreSQL 数据库接入开源的 TimescaleDB 扩展(Extension),让 PostgreSQL 成为物联网的时序数据库。 (原文链接

第三篇是关于 Azure 上的 MySQL 只读数据库的负载扩容,怎样添加更多的 Replica。然后在 BI 报表工具上怎样架构。特别是读写结构的微服务怎么做架构,负载均衡器通过 API 的接口名称定义把流量路由到不同的读写服务。(原文:https://azure.microsoft.com/zh-cn/blog/scaling-out-read-workloads-in-azure-database-for-mysql/

第四篇是关于微软物联网的免费培训网站, iotschool 。 根据不同的学习路径, 可以选择不同的资料,例如选择了要学习 IoT Edge 的话,就有下面的连接

链接上面包屑,可以带你去 IoT School 的首页,你可以定制自己的学习计划。

第五篇是关于微软怎么架构自己的 Kafaka 集群的,每天要处理 trillions 的事件,他们的服务器配置是怎么做的。 (原文

第六篇是关于设计模式和聚合,微软的物联网数据处理架构是怎么设计的。(原文

第七篇是关于 Headless CMS ,(A Headless CMS is a backend only content management system (CMS) built from the ground up as a content repository that makes content accessible via a RESTful API for display on any device.) ,翻译过来就是没有前端的内容管理系统,前端用 REST API 可以在任何的设备上展示。(譬如微信小程序),实际上风靡全球的开源 WordPress CMS,应该已经算是 Headless 了, 只不过人们设计了太多的 Theme,来适应个人和商业的各种不同需求,可以说 .Net ,Java, Python 的此类软件远远落后于基于 PHP 的 CMS。(原文链接

第八篇是关于怎样把 Ubuntu Linux 加入到活动目录的,使用活动目录的企业管理员一定有用(原文链接

最后一篇是关于在 Ubuntu Linux 上安装微软 SQL Server 的, 管理 Windows 服务器都要用 RDP 图形界面去管理,真是不爽。现在可以把 MS SQL Server 安装到 Linux 底下,对于传统企业熟悉 SQL Server 的 IT 人员可是个好消息。 (原文链接