windows 的 wsl 命令
?wsl 文檔:https://docs.microsoft.com/zh-cn/windows/wsl/
From :https://blog.csdn.net/weixin_34101784/article/details/88729575
From :https://www.cnblogs.com/Flat-White/p/13501639.html
玩轉 WLS:Windows 10 Ubuntu子系統 :https://www.jianshu.com/nb/38447202
給 WSL安裝圖形管理工具 Webmin:https://www.jianshu.com/p/63a38da17fa0
Windows Subsystem for Linux(簡稱WSL)是一個在Windows 10上能夠運行原生Linux二進制可執行文件(ELF格式)的兼容層。它是由微軟與Canonical公司合作開發,其目標是使純正的Ubuntu 14.04 "Trusty Tahr"映像能下載和解壓到用戶的本地計算機,并且映像內的工具和實用工具能在此子系統上原生運行。
為什么 Linux 上的程序無法在 Windows 上運行
了解過一點操作系統原理的同學應該都知道,這是 Windows 與 Linux 的內核提供的接口不同(系統調用、API 等)導致的。舉個栗子,我們想知道某目錄下的內容,在 Linux 下我們會使用?ls?命令,而在 Windows 下我們會使用?dir?命令。
當我們在 Linux 上執行?ls?命令,ls?會調用?getdents?這個系統調用,Linux 內核收到請求,將目錄的內容返回給應用程序;當我們在 Windows 上執行?dir?命令,dir?會調用?NtQueryDirectoryFile?這個 API,NT 內核收到請求,將目錄的內容返回給應用程序。雖然系統不同,但基本上都是一個道理。
然而,當我們把 Linux 上的應用程序拿到 Windows 上運行時,應用程序和內核就雙雙懵逼了。比如?ls?會嘗試調用?getdents?系統調用(理想化的情況下,暫不考慮可執行文件格式等問題),Windows 的 NT 內核一看,心說:「這他娘的什么東西,老子不認識啊,啥情況啊」,ls?也想:「尼瑪,內核怎么不回話啊,咋回事兒啊」……兩邊語言不通,應用程序自然無法正確執行。
但是有了 WSL,情況就不一樣了。
依然拿?ls?舉例,當我們在 WSL 中運行?ls?命令時,ls?會調用?getdents?系統調用(這個系統調用接口是 WSL 提供的,Windows 本身并沒有這個接口),WSL 收到這個請求,明白了應用程序是想要知道目錄的內容,于是把 Linux 的系統調用轉換為 NT API?NtQueryDirectoryFile。NT 內核收到 WSL 的請求,將目錄的內容返回給 WSL,WSL 再把返回的內容包裝好后返回給?ls。
也就是說,WSL 在 Linux 應用程序與 Windows NT 內核之間起到了翻譯者的作用。很簡單的道理,既然 NT 內核無法理解 Linux 應用程序的 POSIX 系統調用,那就弄個翻譯來將 POSIX 系統調用實時轉換為 NT 內核能理解的 API 調用,突出一個見人說人話、見鬼說鬼話。
只要實現了足夠多的系統調用翻譯,那么理論上 WSL 可以完全模擬成一個 Linux 內核。
相信各位都聽說過鼎鼎大名的 Cygwin。同樣是能讓 Linux 應用程序運行在 Windows 上,WSL 和 Cygwin 有什么不同呢?其實差別還是挺大的。
雖然 Cygwin 提供了完整的 POSIX 系統調用 API(以運行庫?Cygwin*.dll?的形式提供),但其依然工作在 User Mode;而 WSL 中的 Linux 應用程序進程會被包裹在一個叫做 Pico Process 的東西里,這個東西里發出的所有系統調用請求都會被直接送往 Kernel Mode 中的?lxcore.sys?與?lxss.sys?處理。
同樣是將 POSIX 系統調用轉換為 Windows 中的 API,Cygwin 是轉換成 Win32 API 的調用(因為它架設在 Win32 子系統上,很多內核操作受限于 Win32 的實現,比如?fork),而 WSL 則是轉換為更底層的 NT API 調用(WSL 是與 Win32 平行的子系統,直接架設在 NT 內核上,可以通過 NT API 原生實現?fork?等系統調用)。
WSL 架構示意圖。圖片來源:Windows for Linux Nerds?:https://blog.jessfraz.com/post/windows-for-linux-nerds/
最重要的一點:如果使用 Cygwin,Linux 應用程序的源碼必須 link 至 Cygwin 運行庫(Cygwin*.dll),修改源碼重新編譯后才能在 Windows 下運行。這些重新編譯后的 Linux 應用程序在調用 POSIX API 時不會直接去請求內核,而是會去調用 Cygwin 運行庫,由運行庫翻譯成 Win32 API、執行調用后返回結果。這也就意味著,重新編譯后的應用程序需要依賴 Cygwin 運行庫才能正常運行(有時候你會碰到的「缺少?Cygwin1.dll」報錯就是這個原因),而且這樣編譯出來的可執行程序是純正的 Win32 PE 格式封裝,只能在 Windows 上運行。Cygwin 目錄下,被編譯成 Win32 可執行程序的 Linux 應用程序們。
?而在 WSL 下,我們可以直接運行未經任何修改的 ELF 格式 Linux 可執行程序。
總結:WSL 就像是一個翻譯官,就算那些未經修改的 Linux 應用程序們操著一口純正的 POSIX 系統調用語法,WSL 也能快速準確地將其翻譯為 NT 內核能聽懂的 API 調用;而那些使用了 Cygwin 重新編譯后的 Linux 應用程序,就像是改造人一樣變成了 Win32 應用程序的形狀,還被套了個翻譯機。程序自己(源碼中)說的是 POSIX,經過翻譯機(Cygwin 運行庫)之后就變成 Win32 API 調用了,這樣 NT 內核也能聽得懂。但是每次添加新程序都要改造,多麻煩啊,還是 WSL 原生態更健康(笑)。
安裝 WSL,擁抱可愛的 Linux
注意:WSL 僅支持 64 位系統
第一步,打開「控制面板」中的「程序與功能」,點擊左側邊欄的「啟用或關閉 Windows 功能」選項,在彈出的窗口中勾選「適用于 Linux 的 Windows 子系統」,然后點擊確定(可能需要重啟)。如果你懶得用 GUI,也可以直接在 PowerShell 中以管理員權限執行命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux?第二步,打開 Microsoft Store,搜索「WSL」。挑選一個你喜歡的 Linux 發行版,然后點擊安裝。(截至目前,商店中可用的發行版有 Ubuntu、openSUSE、SUSE Linux Enterprise Server、Debian 以及 Kali Linux。)
?第三步,在開始菜單中找到你剛剛安裝的發行版,打開它。等待幾分鐘的初始化過程,設定好用戶名與密碼后(不需要與 Windows 的相同,用過 Linux 的選手應該都懂的)就會自動進入 Linux 環境。至此,你已經完成了 WSL 的安裝。你也可以同時安裝多個發行版,它們的數據都是獨立的,互不影響。
Microsoft store下載的kali不包含任何工具 需要后續安裝完整版kali
先更新源 使用命令:apt-get update
安裝 vim:sudo apt-get install vim
更換 kali 源
sudo vim /etc/apt/sources.list
然后復制下面的源
#中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib#阿里云 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib#清華大學 deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free#浙大 deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free#東軟大學 deb http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contrib deb-src http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contrib#官方源 deb http://http.kali.org/kali kali-rolling main non-free contrib deb-src http://http.kali.org/kali kali-rolling main non-free contrib然后使用如下命令查看源是否更換成功:cat /etc/apt/sources.list
更新源并安裝完整版 kali
sudo apt-get update # 更新源 sudo apt-get dist-upgrade # 更新軟件 sudo apt-get install kali-linux-large # 安裝完整版kali許多教程這里的安裝命令都是 sudo apt-get install kali-linux 或 sudo apt-get install kali-linux-full
這里也是找了很久才知道主要數據包名字改了 導致很多教程現在都失效了
鏈接:Major Metapackage Makeover | Kali Linux Blog?
?執行完第二條命令后有一個報錯提示
/* 這個報錯筆者第一次安裝時沒有遇到 但是后續多次嘗試都有遇到這個問題= =
暫時不清楚原因 */
?執行如下命令修復可解決
sudo mv /var/lib/dpkg/info/ /var/lib/dpkg/info_old/ sudo mkdir /var/lib/dpkg/info/ sudo apt-get update … sudo apt-get -f install … sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old/ sudo rm -rf /var/lib/dpkg/info sudo mv /var/lib/dpkg/info_old/ /var/lib/dpkg/info/參考:https://blog.csdn.net/heray1990/article/details/47803541
然后再執行第三條命令安裝完整版kali
如果更新源后沒有更新軟件直接執行第三條命令
可使用:sudo apt-get install kali-linux-large --fix-missing
這里中途會有一些圖形化界面的選擇選項 類似這種
?這里用翻譯軟件自行翻譯選擇合適選項
//有教程寫有Yes選Yes有OK選OK 最后一個選“from inetd”
安裝時大致查看過這些選項影響應該不大請自行斟酌
然后就等著黑框框里閃啊閃啊 等待安裝完成
這里提一下Windows Terminal從PowerShell進入子系統只需使用kali或者bash命令
其中bash命令是在當前目錄進入子系統
CTRL+D可以回到PowerShell/cmd
安裝完成后簡單的測試一下
?可以發現kali內置Python2 Python3 以及binwalk可以正常使用。至此 安裝結束。
使用軟件源鏡像
由于眾所周知的原因,各大發行版默認的軟件源在中國大陸的訪問速度是龜速。
我目前使用的是?? 清華大學的 Ubuntu 鏡像源: :https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/
安裝多個發行版
Windows 10 Fall Creators Update 之后,WSL 支持同時安裝多個 Linux 發行版,直接在 Microsoft Store 中搜索想要的發行版并點擊安裝即可。這些發行版可以同時運行,并且數據互相獨立。你可以使用?wslconfig.exe?來查詢已安裝的發行版,或者更改默認的發行版。
刪除發行版也很簡單,直接卸載對應的商店應用即可(記得備份哦)。?
多種進入 WSL 的方式比較
新版支持同時安裝多個發行版,那自然不能像以前那樣只提供一個?bash.exe?入口了。
秋季創意者更新之后的 Windows 提供了?多種進入 WSL 環境的方式:
- wsl.exe
打開默認發行版中的默認 Shell。
- <distroname>.exe
打開指定發行版中的默認 Shell。
- bash.exe?(DEPRECATED)
打開默認發行版中的?bash?Shell。
如果你更改了默認 Shell 卻總是打開 bash,就說明你使用了這個入口。
你也可以通過這些入口直接在 WSL 中執行命令并返回結果:
- <distroname> -c [command]
- bash -c [command]
- wsl [command](不再需要指定?-c)?
與 Windows 的互操作性
WSL 與 Windows 之間的互操作性 (Interoperability) 很牛逼。怎么個牛逼法呢?
Windows 下的所有盤符都掛載在 WSL 中的?/mnt?目錄下,可以直接操作。WSL 中的所有數據則存放于?C:\Users\{你的用戶名}\AppData\Local\Packages\{Linux發行版包名}\LocalState\rootfs?目錄中(不要在 Windows 中修改這些文件,這會造成文件權限錯誤):
$ ls /mnt c d e $ mount -l rootfs on / type lxfs (rw,noatime) C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000) D: on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000) E: on /mnt/e type drvfs (rw,noatime,uid=1000,gid=1000)可以在 Windows 命令行環境中直接調用 WSL 中的命令:
PS C:\temp> wsl ls -al total 0 drwxrwxrwx 1 printempw printempw 4096 Sep 7 19:04 . drwxrwxrwx 1 printempw printempw 4096 Sep 7 18:38 .. -rwxrwxrwx 1 printempw printempw 4 Sep 7 19:04 foo.txt也可以在 WSL 中直接啟動 Windows 應用:
$ notepad.exe "C:\temp\foo.txt"還可以通過 pipes 與 Windows 程序通信:
# 復制內容至 Windows 剪貼板 $ cat foo.txt | clip.exe甚至可以把 Windows 命令和 WSL 命令混著用:
PS> ipconfig | wsl grep IPv4 IPv4 Address. . . . . . . . . . . : 192.168.1.114$ ipconfig.exe | grep IPv4 | cut -d: -f2 192.168.1.114$ ls -al | findstr.exe foo.txt -rwxrwxrwx 1 printempw printempw 4 Sep 7 19:04 foo.txt$ cmd.exe /c dirVolume in drive C is WindowsVolume Serial Number is B263-****Directory of C:\temp2018/09/07 19:04 <DIR> . 2018/09/07 19:04 <DIR> .. 2018/09/07 19:04 4 foo.txt1 File(s) 4 bytes2 Dir(s) 194,422,341,632 bytes free同時,WSL 與 Windows 共享網絡棧,也就是說你可以:
- 在 WSL 中啟動 web server,在 Windows 上使用瀏覽器訪問;
- 在 Windows 下啟動 MySQL/Redis 服務器,在 WSL 中連接;
- 諸如此類。
如果你對 WSL 與 Windows 之間互操作的原理有興趣,可以參考一下這些文章:
- WSL interoperability with Windows
- Windows and Ubuntu Interoperability
DrvFs 文件權限問題
雖然 WSL 中可以直接訪問 Windows 磁盤的內容,但如果你曾經這么做過,你應該對這樣綠油油一片的?ls?不會感到陌生。為什么 NTFS 文件系統中的文件到 WSL 下權限就全部成?0777?了呢?
這主要是 DrvFs 中 Linux 文件權限的實現導致的。
在 WSL 中,Microsoft 實現了兩種文件系統,用于支持不同的使用場景:
- VolFs
著力于在 Windows 文件系統上提供完整的 Linux 文件系統特性,通過各種手段實現了對 Inodes、Directory entries、File objects、File descriptors、Special file types 的支持。比如為了支持 Windows 上沒有的 Inodes,VolFs 會把文件權限等信息保存在文件的 NTFS Extended Attributes 中。記得我上面警告過你不要在 Windows 中修改 WSL 里的文件嗎?就是因為 Windows 中新建的文件缺少這個擴展參數,VolFs 無法正確獲取該文件的 metadata,而且有些 Windows 上的編輯器會在保存時抹掉這些附加參數。
WSL 中的?/?使用的就是 VolFs 文件系統。
- DrvFs
著力于提供與 Windows 文件系統的互操作性。與 VolFs 不同,為了提供最大的互操作性,DrvFs 不會在文件的 NTFS Extended Attributes 中儲存附加信息,而是從 Windows 的文件權限(Access Control Lists,就是你右鍵文件 > 屬性 > 安全選項卡中的那些權限配置)推斷出該文件對應的的 Linux 文件權限。
所有 Windows 盤符掛載至 WSL 下的?/mnt?時都是使用的 DrvFs 文件系統。
由于 DrvFs 的文件權限繼承機制很微妙,最后導致的結果就是所有文件的權限都變成了?0777。而且由于早期的 DrvFs 不支持 metadata,所以你無法給這些文件 chown/chmod,只能對著綠油油的?ls?干瞪眼。不過好消息是,Windows Insider Build 17063 之后,DrvFs 也像 VolFs 一樣支持給文件寫入 metadata 了。
要啟用 DrvFs 的 metadata 支持,你需要添加參數重新掛載磁盤:
# 修改成你自己的盤符 $ sudo umount /mnt/e $ sudo mount -t drvfs E: /mnt/e -o metadata不過如果僅僅是執行了這個,雖然支持了文件權限的修改,但磁盤下的文件權限默認依然還是?0777,除非你給它們整個?chmod?一遍。如果你不想這么做,也可以指定其他的 mount 參數:
$ sudo mount -t drvfs E: /mnt/e -o metadata,uid=1000,gid=1000,umask=22,fmask=111這樣磁盤下的文件的默認權限就是?0644,ls?也不會再是綠油油一片啦。
?不過每次使用時都要重新掛載未免也太煩,我們可以通過另一個新特性?Automatically Configuring WSL?實現自動掛載。在 WSL 中創建?/etc/wsl.conf,在其中填寫如下內容:
[automount] enabled = true root = /mnt/ options = "metadata,umask=22,fmask=111" mountFsTab = true# 這個文件里還可以添加其他配置項,有興趣的可以看看上面的鏈接重啟終端,所有的盤符就會使用上面的配置自動掛載啦(可以使用?mount -l?查看)。
另外,如果你想要給不同的盤符設定不同的掛載參數(上面的方法對所有盤符都有效,如果你想在 WSL 中運行 Windows 下的應用程序,就得每次都?chmod +x?一下,所以我一般都會把?C:?排除掉),就需要手動修改?/etc/fstab。首先確保?wsl.conf?中的?mountFsTab?為?true,然后編輯?/etc/fstab,添加如下內容:
# 不在此列表中的盤符會使用 wsl.conf 中的參數掛載 # 格式可以自己去查 fstab 的幫助文檔 E: /mnt/e drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=111 0 0其他關于 WSL 的折騰
雖然 Microsoft 開發 WSL 出來主要是著重于命令行環境的使用,但經過測試,WSL 是可以通過 X Server 執行 GUI 應用程序的,甚至還可以在 WSL 里面用 Wine 執行 Windows 程序……(??)
也有人試過在 WSL 中運行完整的 DE,體驗似乎還不錯,有興趣的同學可以去試試。
另外,你也可以通過某些神秘的方法用上 Microsoft Store 未提供的 Linux 發行版,比如?Arch Linux。
如果你對 WSL 的底層實現有興趣,也可以去圍觀一下 WSL 的官方博客:
- https://blogs.msdn.microsoft....
- https://blogs.msdn.microsoft....
總結
雖然 WSL 很不錯,但是其比起真正的 Linux 系統還是有很多不足(Docker 等涉及未實現的內核特性的軟件無法使用,Raw socket 相關的操作依然容易出錯,I/O 性能相比之下較為孱弱等)。如果你日常開發中需要使用到那些 WSL 未提供的 Linux 特性,那么還是乖乖跑 VM 或者裝 Linux 吧。
對我來說,WSL 最大的意義就是,讓我能夠用我熟悉的 Linux 那一套去操作 Windows。
如果你和我的需求一樣,那么比起 Cygwin、VM 等解決方案,WSL 有著完整的 Linux 環境、強大的互操作性、更低的資源占用。離不開 Windows,卻又羨慕 Linux 下強大命令行工具的各位,相信你們會喜歡 WSL 的。
而且最近幾年 Microsoft 在籠絡開發者方面的努力大家有目共睹,這里就容我夸上一句:
Microsoft,干得漂亮!
wsl 命令
wsl --help 顯示wsl幫助 wsl --list --online 查看有哪些可用的系統 wsl --list 查看所有安裝的發行版 wsl -l -v 查看已安裝的Linux子系統 wsl --list --running 查看正在運行的發行版 wsl --install -d Ubuntu 安裝系統Ubuntu wsl -d Ubuntu 多個子系統時 ,-d 指定啟動 wsl -s Ubuntu 設置默認發行版 wsl 啟動默認發行版 wsl --unregister Ubuntu-20.04 刪除 某個 wsl 子系統,例如 Ubuntu-20.04 wsl -t Ubuntu #或者 wsl --terminate Ubuntu 讓某個子系統關機在CMD中直接運行Linux命令,使用方法很簡單:wsl + Linux 命令 wsl free -m 查看電腦內存 wsl ls 打印文件夾 wsl top 運行TOP命令用 Windows 資源管理器打開 Linux 文件系統 首先運行 wsl 進入 WSL 環境,運行explorer.exe . (注意不要忘了"點")總結
以上是生活随笔為你收集整理的windows 的 wsl 命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过一个例子介绍 IDA pro 的简单
- 下一篇: C++常用字符串分割方法