WSL折腾日记

突然间发现子系统这种新鲜东西,故写篇笔记整理一下

安装

1.启动Windows Subsystem for Linux

开始WSL之旅的第一步是启动Windows Subsystem for Linux功能,有两种方法实现:

(1)通过命令行

管理员身份打开PowerShell。右键单击屏幕左下角“开始”菜单,找到“Windows PowerShell(管理员)”并打开

复制以下命令并运行

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

安装完成后重启电脑~

(2)通过控制面板

打开屏幕左下角“Cortana搜索框”输入“control panel”搜索并打开搜索结果中的“控制面板”

找到启用或关闭Windows功能,如图所示,打开“程序”——“启用或关闭Windows功能”,找到并勾选“适用于Linux的Windows子系统”,点击“确定”。

安装完成后重启电脑~

2.通过应用商店安装Linux发行版

打开Win10应用商店搜索你喜欢的Linux发行版并安装。目前,WSL支持Ubuntu,Kali Linux,GNU,OpenSUSE等发行版。

以安装Ubuntu为例,安装完成后搜索并打开Ubuntu执行后续安装。

安装完成后按提示输入默认用户名、密码。

在这里时,在输入用户名、密码时我将安装窗口直接关闭(才不会说是因为点错了呢!),结果,再次打开就直接是root,算是误打误撞?反正以后打开都是root权限,有、强0.0

而在这里也出现了一个问题,我想装的东西太多了,C盘不够用咋办?软链接到非系统盘呗!

工具

mklink : 本质上是一个创建链接的工具,这里使用mklink 欺骗系统,使系统误以为还是安装在了C盘

迁移

1.定位Linux子系统的文件系统位置

正常是:C:\Users\xxxx\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows(_xxxxxxx)(xxxxx可能有也可能没有,反正我是有(79rhkp1fndgsc))
直接粗暴的方法的是:先装一遍Linux子系统,在C:\Users\xxxx\AppData\Local\Packages\
下查看带有类似 CanonicalGroupLimited.UbuntuonWindows 字眼的新文件夹,记下它的名字

2.开始迁移

(1)先卸载Linux子系统

卸载的原因在于Linux子系统下的文件系统的权限更改十分复杂,这里面的一些文件不属于Windows下的管理员用户所有,也不属于你的用户,它就是Linux下用户所有的,使用一般的修改权限文件方法很容易出问题。因此还是推荐先备份后再卸载。

(2)创建软链接

使用管理员打开cmd, 输入下面的命令:

mklink /j C:\Users\XXXX\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc  D:\WSL-ubuntu\

D:\WSL-ubuntu\即非系统盘的位置

(3)创建成功后再打开应用商店,安装Linux子系统

(4)问题!

在这里我花了很长的时间查文档寻求解决方法,结果都是些简单问题0.0…

问题1: 出现子系统无法安装,错误代码0x80070005

问题出现在文件权限上。解决方法:

对着你非系统盘的储存文件夹,右键->属性->安全->编辑->设置完全控制,即可解决。

或:icacls D:\WSL-ubuntu\ /grant “你的用户名:(OI)(CI)(F)”

问题2:安装启动子系统后,卡在installing…

这里问题出现在LxssManager服务上。

Lxss Manager 服务支持运行本机 ELF 二进制文件。该服务提供在 Windows 上运行 ELF 二进制文件所需的基础结构。如果停止或禁用该服务,这些二进制文件将不再运行。

解决方法:重启电脑->此电脑->右键->管理->服务->找到LxssManager->启动

迁移总结

同样的道理,使用 mklink 工具可以将其他大文件迁移到非系统盘后再创造软链接,用于减小C盘负担是很不错的。接下来开始折腾优化0.0…

子系统的优化

1.更换apt源

因为Linux子系统的apt源使用的是官方源,需要连接到国外的服务器。所以安装一些软件时下载会很慢,我们可以改用国内的镜像apt源。
国内的镜像源主要有:
阿里源

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

中科大源

deb https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

网易源

deb http://mirrors.163.com/ubuntu/ wily main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ wily-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ wily-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ wily-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ wily-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ wily main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ wily-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ wily-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ wily-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ wily-backports main restricted universe multiver

个人觉得科大源好用点0.0

先进行一下备份。

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

然后

sudo nano /etc/apt/sources.list

选择一个源添加到文件最前面或直接替换掉原文件。
[Ctrl+o 写入 Ctrl+x 退出 Ctrl+k 删除整行,大概就用到这仨吧]

保存后运行

sudo apt-get update
sudp apt-get upgrade

2.终端的美化

win10下可有、丑了。推荐大家一个开源软件cmder,可以完美解决这一问题。这个软件同样可以在官网上下载到,而且是免安装。选择下载mini版即可,因为bash我们已经有了嘛!

![在这里插入图片描述](https://raw.githubusercontent.com/Alikas0/files/master/img/2019040919033478.png
?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E4MzE4MjAzNA==,size_16,color_FFFFFF,t_70)
贴张我修改后的图0.0,是不是好看很多。

打开cmder直接进入的是cmd,我们可以在设置中更改它的startup方式,选择command line ,填入bash -cur_console:p
保存设置,下次打开时就直接进入Linux子系统了。

WSL折腾日记_第1张图片

还可以在colors选项中选择自己喜欢的主题,在transparency中更改主界面的透明度。
而且cmder还有分屏功能。这些功能请自行发掘0.0

3.便捷打开方式!

我们可以将cmder添加进win10的环境变量中,这样我们就可以像在Linux系统中那样,在任意文件目录下直接右键打开cmder并进入当前路径了。
比如在桌面点击右键,选择cmder here,这样打开cmder就可以直接进入桌面的路径了。

WSL折腾日记_第2张图片

设置环境变量的具体方法是,依次进入控制面板->系统和安全->系统->高级->环境变量->编辑系统环境变量Path->新建->把cmder路径添加进来,保存之后就可以用win+R的方式打开cmder了。

接下来,以管理员方式打开cmd,输入命令Cmder.exe /REGISTER ALL。之后就可以直接在右键中打开cmder了!

4.安装zsh和on-my-zsh

shell的类型有很多种,linux下默认的是bash,虽然bash的功能已经很强大,但对于以懒惰为美德的程序员来说,bash的提示功能不够强大,界面也不够炫,并非理想工具。

而zsh的功能极其强大,只是配置过于复杂,起初只有极客才在用。后来,有个穷极无聊的程序员可能是实在看不下去广大猿友一直只能使用单调的bash, 于是他创建了一个名为oh-my-zsh的开源项目,then,我这种蒟蒻也能用上zsh了。

(1)安装zsh

sudo aptitude update
sudo aptitude install zsh

(2)设zsh为默认shell

chsh -s /bin/zsh

(3)全自动安装on-my-zsh

wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

zsh主题

通过如下命令可以查看可用的Theme

# ls ~/.oh-my-zsh/themes

如何修改zsh主题呢?
编辑~/.zshrc文件,将ZSH_THEME="candy",将candy修改为你需想要的主题。

zsh扩展

~/.zshrc中找到plugins关键字,就可以自定义启用的插件了,系统默认加载git

git插件

命令内容可以参考cat ~/.oh-my-zsh/plugins/git/git.plugin.zsh

常用的:

gapa    git add --patch
gc!    git commit -v --amend
gcl    git clone --recursive
gclean    git reset --hard && git clean -dfx
gcm    git checkout master
gcmsg    git commit -m
gco    git checkout
gd    git diff
gdca    git diff --cached
gp    git push
grbc    git rebase --continue
gst    git status
gup    git pull --rebase

完整列表:https://github.com/robbyrussell/oh-my-zsh/wiki/Plugin:git

extract

解压文件用的,所有的压缩文件,都可以直接x filename,不用记忆参数

当然,如果你想要用tar命令,可以使用tar -tab键,zsh会列出参数的含义。

autojump

按照官方文档介绍,需要使用如下命令安装,而不是一些博客中的介绍:

yum install autojump-zsh

安装好之后,需要在~/.zshrc中配置一下,除了在plugins中增加autojump之外,还需要添加一行:

[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh

安装好之后,记得source ~/.zshrc,然后你就可以通过j+目录名快速进行目录跳转。支持目录名的模糊匹配和自动补全。

  • j -stat:可以查看历史路径库

zsh-autosuggestions

zsh-autosuggestions

git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions

~/.zshrc 中配置

plugins=(其他的插件 zsh-autosuggestions)

因为箭头不太方便,在.zshrc中自定义补全快捷键为逗号,但是又一次遇到了需要输入逗号的情况,所以,并不太推荐如下修改:

bindkey ',' autosuggest-accept

zsh-syntax-highlighting

zsh-syntax-highlighting

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

~/.zshrc文件中配置:

plugins=(其他的插件 zsh-syntax-highlighting)

git-open

git-open插件可以在你git项目下打开远程仓库浏览项目。

git clone https://github.com/paulirish/git-open.git $ZSH_CUSTOM/plugins/git-open

bat

bat 代替 cat
cat 某个文件,可以在终端直接输出文件内容,bat 相比 cat 增加了行号和颜色高亮

brew install bat

常用快捷键

  • 命令历史记录
    • 一旦在 shell 敲入正确命令并能执行后,shell 就会存储你所敲入命令的历史记录(存放在~/.zsh_history 文件中),方便再次运行之前的命令。可以按方向键↑和↓来查看之前执行过的命令
    • 可以用 r来执行上一条命令
    • 使用 ctrl-r 来搜索命令历史记录
  • 命令别名
    • 可以简化命令输入,在 .zshrc 中添加 alias shortcut='this is the origin command' 一行就相当于添加了别名
    • 在命令行中输入 alias 可以查看所有的命令别名

使用技巧

  • 连按两次Tab会列出所有的补全列表并直接开始选择,补全项可以使用 ctrl+n/p/f/b上下左右切换
  • 智能跳转,安装了 autojump 之后,zsh 会自动记录你访问过的目录,通过 j 目录名 可以直接进行目录跳转,而且目录名支持模糊匹配和自动补全,例如你访问过 hadoop-1.0.0 目录,输入j hado 即可正确跳转。j --stat 可以看你的历史路径库。
  • 命令选项补全。在zsh中只需要键入 tar - 就会列出所有的选项和帮助说明
  • 在当前目录下输入 … 或 … ,或直接输入当前目录名都可以跳转,你甚至不再需要输入 cd 命令了。在你知道路径的情况下,比如 /usr/local/bin 你可以输入cd /u/l/b 然后按进行补全快速输入
  • 目录浏览和跳转:输入 d,即可列出你在这个会话里访问的目录列表,输入列表前的序号,即可直接跳转。
  • 命令参数补全。键入kill 就会列出所有的进程名和对应的进程号
  • 更智能的历史命令。在用或者方向上键查找历史命令时,zsh支持限制查找。比如,输入ls,然后再按方向上键,则只会查找用过的ls命令。而此时使用则会仍然按之前的方式查找,忽略 ls
  • 多个终端会话共享历史记录
  • 通配符搜索:ls -l **/*.sh,可以递归显示当前目录下的 shell 文件,文件少时可以代替 find。使用 **/ 来递归搜索
  • 扩展环境变量,输入环境变量然后按 就可以转换成表达的值
  • 在 .zshrc 中添加 setopt HIST_IGNORE_DUPS 可以消除重复记录,也可以利用sort -t ";" -k 2 -u ~/.zsh_history | sort -o ~/.zsh_history手动清除

杂七杂八问题汇总:

1.子系统运行32位程序问题

sudo apt update
sudo apt install lib32ncurses5 lib32z1
sudo apt install qemu-user-static
sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'

2.由第1个问题引发的依赖包问题-aptitude安装

aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具。与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些。举例来说,aptitude 在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净;aptitude在安装软件时,会同时安装/更新其依赖包。

以下是大佬(不是我0.0)总结的一些常用 aptitude 命令,仅供参考。

aptitude update 更新可用的包列表
aptitude upgrade 升级可用的包
aptitude dist-upgrade 将系统升级到新的发行版
aptitude install pkgname 安装包
aptitude remove pkgname 删除包
aptitude purge pkgname 删除包及其配置文件
aptitude search string 搜索包
aptitude show pkgname 显示包的详细信息
aptitude clean 删除下载的包文件
aptitude autoclean 仅删除过期的包文件

  • aptitude软件包列表中的软件包状态:

    v 虚拟
    B 损坏
    u 解包
    C 预配置
    H 预安装
    c 卸载未清除
    p 清除软件
    i 已经安装
    E 内部错误
  • 在aptitude软件包列表中的请求操作:

    h 保持
    p 清除
    d 删除(卸载)
    B 损坏
    i 安装
    r 重装
    u 升级

    有的问题 apt-get 解决不了,必须使用 aptitude 解决,有的问题,用 aptitude 解决不了,必须使用 apt-get

    *aptitude 解决得更好的地方: install, remove, reinstall(apt-get无此功能), show(apt-get无此功能), search(apt-get无此功能), hold(apt-get无此功能), unhold(apt-get无此功能),

    *apt-get 解决得更好的地方: source(aptitude无此功能), build-dep (低版本的aptitude没有build-dep功能)

    apt-get 跟 aptitude 没什么区别的地方:update, upgrade (apt-get upgrade=aptitude safe-upgrade, apt-get dist-upgrade=aptitude full-upgrgade)

    3.GUI界面无法链接

    提示

    /usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
      warnings.warn(str(e), _gtk.Warning)
    Traceback (most recent call last):
      File "/usr/bin/ccsm", line 94, in 
        import ccm
      File "/usr/lib/python2.7/dist-packages/ccm/__init__.py", line 1, in 
        from ccm.Conflicts import *
      File "/usr/lib/python2.7/dist-packages/ccm/Conflicts.py", line 26, in 
        from ccm.Constants import *
      File "/usr/lib/python2.7/dist-packages/ccm/Constants.py", line 30, in 
        CurrentScreenNum = gtk.gdk.display_get_default().get_default_screen().get_number()
    AttributeError: 'NoneType' object has no attribute 'get_default_screen'
    

    无法解决。

参考资料:
1.https://onlycaptain.github.io/2018/09/30/Windows下Linux子系统迁移到非系统盘/
2.https://zhuanlan.zhihu.com/WindowsSubsystemForLinux
3.https://www.jianshu.com/p/dc32a75e2de4
4.https://blog.csdn.net/shengerjianku/article/details/82290482
5.https://blog.csdn.net/yili_xie/article/details/4803314
6.https://segmentfault.com/a/1190000013612471

你可能感兴趣的:(WSL)