利用WSL打造Arch開發環境

一、前言

作為有史以來最優秀的Linux發行版,Win10結合WSL是很美好的使用方式。

Windows和WSL可以互相訪問對方的文件系統,甚至可以直接執行對方的可執行程序……直接秒wine、cygwin、msys啥的十八條街了。

目前除了驅動層的一些超底層API和設備用起來不太對,上層應用已經毫無差異了,比如開機自啟動服務,比如web那一套啊,比如c/c++/java/go神馬的完美運行。最大的缺陷是,docker暫時還不支持。

而且目前版本性能問題也顯著改善了,至少我安裝部署過程中,幾個GB的軟體包安裝沒感覺有問題。

至於界面性能么……我寫了個顯示海量數據(一千萬x一千萬的表格)的Qt程序,在X Server里編譯跑起來居然比Windows流暢……不知道是不是因為X Server使用OpenGL渲染,而Windows下的Qt Widgets用CPU繪製的問題。

關於部署桌面環境和各項功能擴展,網上有諸多文章介紹過了,我也就不多贅述了,這篇文章主要針對的是如何在WSL上部署Arch Linux。

沒錯,Windows應用商店裡提供的Linux發行版中,並沒有Arch系的,但這種頂級真香的發行版怎麼能不用呢?

於是我遍尋各大中文博客,在下面兩篇文章里找到了比較完美的實現方案。兩篇文章各有各的缺點,害得我折騰了好幾天,所以自己寫一篇集合版,儘可能做到傻瓜式部署。

此處對於Arch的發行版,選擇了在distrowatch上流行度排名第一的發行版Manjaro。

WSL使用小結:從ArchLinux到Manjaro - 星雲的彼岸 - 博客園?

www.cnblogs.com圖標

這篇是整個操作的主體指導,但裡面對於Manjaro的鏡像源部分有問題——直接配置之後,安裝manjaro-keyring時是無法驗證通過Manjaro的GPG Key的,網上搜到的各種重置GPG的解決方案也一律無效,很容易卡死在這步,這部分是靠第二篇文章搞定的。

然後還有Manjaro的軟體包列表,原文的列表可能時間比較早了,其中的一些軟體包已經在倉庫里找不到了,並且有兩個軟體包(thunar和engrampa)存在衝突,所以我手動修正了軟體包列表。

最後是X Server部分,我選用了第二篇的VcXsrv,因為後者支持高分屏。但第二篇文章里沒說怎麼使用,怎麼配置啟動環境,所以我找了一堆用其他X Server工具的博客,自己整理了方案。

WSL+Manjaro+Xfce打造完美開發環境?

www.tiger2doudou.com

這篇算是對第一篇的修正版,但有個很大的缺點——作者只裝了base-devel和xfce4,導致系統裝好後大量本該有的東西都沒有,比如界面太丑dock太爛啦,比如top、grep這些指令居然特么都用不了啦等等等等,所以我還是決定以第一篇的為主。

然後,還需要感謝 @韋易笑 大佬,我參考他的攻略,部署了nano配置、zsh環境和一些輔助工具。

整套流程沒搞通時,我在筆記本上折騰了好幾天。搞通之後,回宿舍在台式機上一小時搞定——耗時只取決於manjaro那幾個G的軟體包裝的有多塊。

話不多說,下面進入正題。

二、安裝WSL

2.1 啟用WSL

* 先決條件:Windows10

/* ======== 據說這段不需要了,注釋掉 ======== */

設置——更新和安全——針對開發人員——啟用「開發人員模式」

/* ======== 據說這段不需要了,注釋掉 ======== */

設置——應用——應用和功能——右側「程序功能」——啟用或關閉Windows功能-——適用於Linux的Windows子系統

2.2 安裝Ubuntu

WSL子系統中,其實是微軟人工實現了一個Windows上的Linux內核,做到對Linux標準內核的二進位兼容,然後加上一些類似VMWare輔助工具的輔助包,來支持運行Linux系統。

在這套黑科技甚至保證了兩個系統的文件系統互相可見,互相調用,我們甚至可以在Linux shell里調用執行exe程序,或者在Windows cmd里執行Linux程序!

所以這也是這篇文章騷操作的基礎——我們裝一個WSL已支持的Linux發行版,再把它的內核軟體包替換成Arch即可。

廢話不多說,在Win10應用商店裡搜索「Linux」,然後在結果列表裡打開Ubuntu並安裝。

*注意:安裝後啟動會提醒你輸入用戶名和密碼,這一步要跳過。關閉後重新打開,進入root登陸的環境。

2.3 替換Arch內核

Windows:在Windows資源管理器中打開Ubuntu的/根目錄:

%localappdata%PackagesCanonicalGroupLimited.UbuntuonWindows_*LocalState
ootfs

從這個目錄可以訪問WSL的文件,但盡量不要新建/編輯,因為修改過的文件會變成Windows文件系統的文件,在WSL中再操作時,文件屬性就不對了。

從清華的Arch Linux鏡像中下載最新的Arch內核:archlinux-bootstrap-xxxx.xx.xx-x86_64.tar.gz,將其放在根目錄的LocalState
ootfs
oot下。

Linux:打開Ubuntu,在命令行中將其解壓

$ tar -zxvf archlinux-bootstrap-xxxx.xx.xx-x86_64.tar.gz

【PS:解壓archlinux-bootstrap時在root目錄,外面可能會出問題】

【PS2:不能在Windows中解壓,否則文件屬性全部都不對】

Linux:在 ~/root.x86_64/etc/pacman.d/mirrorlist 文件中,添加Manjaro的清華鏡像:

## Country : China
Server = https://mirrors.tuna.tsinghua.edu.cn/manjaro/stable/$repo/$arch

這步要先操作,因為替換後的arch內核貌似nano vim都沒有……不先換好源的話,待會兒在arch裡面裝這倆太慢了。

Linux:刪除/etc/resolv.conf文件,讓WSL下次啟動時自動生成:

rm -rf ~/root.x86_64/etc/resolv.conf

Windows:退出所有打開的WSL窗口,在資源管理器中重新進入Linux目錄,在LocalState
ootfs 中刪除 bin, etc, lib, lib64, sbin, usr, var。然後從rootfs
oot
oot.x86_64移動(不要複製)相同的文件到 rootfs。

上述操作請在資源管理器圖形界面內完成,請勿使用命令行。刪除目錄時,最好用shift+delete徹底刪除。我折騰了幾次都是這麼操作,還沒出錯過。

移動出來時,請使用剪切粘貼,不要簡單拖動或者複製,拖動不保險,複製必然出錯。

一定要看清楚,不要刪錯/拷錯了,比如不要把bin搞錯成dev……

Arch的bin lib lib64 sbin是軟鏈接,在windows上看起來就是個文件,這個不是bug。

這一步就是將Ubuntu核心替換為Arch。

不用管glibc-wsl和fakeroot-tcp——前者已經被微軟爸爸修復,後者僅在Yaourt安裝AUR包時使用,之後再處理。

2.4 安裝Manjaro

重新打開WSL,安裝Nano或者Vim(必須這步安裝,否則下一步把國內鏡像源替換掉後就不好裝了)。

依次執行下列操作更新鏡像源和Arch內核:

pacman-key --init # 初始化key
pacman -S manjaro-keyring # 嘗試安裝manjaro-keyring軟體包,是否導入key選擇y,會安裝失敗,是否選擇刪除已下載文件時選n
pacman -U 上一步提示的下載文件路徑 # 強制安裝,導入Manjaro的key
pacman-key --init # 再次初始化key
pacman-key --populate archlinux manjaro # 下載Arch和Manjaro的key
pacman -Syyu # 強制更新軟體源索引列表,並更新系統軟體包

更新過程中一路回車,其中詢問Linux內核包時隨便選一個(因為沒啥卵用,WSL鎖定了)。

更新完後,鏡像源設置會被刷新,加了一堆國外的源。這時候需要手動修改/etc/pacman.d/mirrorlist,將其他源注釋或刪掉,重新配置鏡像源:

## Country : China
Server = https://mirrors.tuna.tsinghua.edu.cn/manjaro/stable/$repo/$arch

【註:這一步必須此時完成,否則下一步等死你……】

Arch更新完成後,繼續安裝Manjaro發行版,我把第一篇文章作者的包列表中無效或有衝突的產出了,最新可用的packages.txt如下:

a52dec
aalib
accountsservice
acl
acpi
acpid
adwaita-icon-theme
alsa-firmware
alsa-lib
alsa-plugins
alsa-utils
android-tools
android-udev
appstream-glib
apr
apr-util
archlinux-appstream-data
archlinux-keyring
aria2
aspell
at-spi2-atk
at-spi2-core
atk
atkmm
attr
audacious
audacious-plugins
autoconf
automake
avahi
b43-fwcutter
babl
bash
bc
binutils
bison
blas
blueman
bluez
bluez-libs
boost
boost-libs
breath-wallpaper
btrfs-progs
bzip2
c-ares
ca-certificates
ca-certificates-mozilla
ca-certificates-utils
cairo
cairomm
cantarell-fonts
catfish
cblas
cdparanoia
celt
cfitsio
chromaprint
cifs-utils
ckbcomp
clang
clucene
cmake
colord
compositeproto
coreutils
cpupower
cracklib
crda
cronie
cryptsetup
cups
cups-filters
cups-pdf
cups-pk-helper
curl
daala
damageproto
db
dbus
dbus-glib
dconf
desktop-file-utils
device-mapper
dhclient
dhcpcd
diffutils
ding-libs
djvulibre
dmidecode
dmraid
dnsmasq
dnssec-anchors
dosfstools
dotnet-host
double-conversion
e2fsprogs
ecryptfs-utils
enchant
engrampa
exfat-utils
exiv2
exo
expat
f2fs-tools
faac
faad2
fakeroot
farstream
ffmpeg
ffmpegthumbnailer
ffms2
fftw
file
filesystem
findutils
firefox
fixesproto
flac
flex
fontconfig
fontsproto
foomatic-db-engine
freeglut
freetype2
fribidi
ftgl
fuse-common
fuse2
galculator-gtk2
gamin
garcon
gawk
gc
gcab
gcc
gcc-libs
gconf
gcr
gd
gdbm
gdk-pixbuf2
geoclue2
gettext
ghostscript
giflib
gimp
git
gksu
gl2ps
glew
glib-networking
glib2
glibc
glibmm
glu
gmp
gnome-icon-theme
gnome-icon-theme-symbolic
gnome-keyring
gnome-menus
gnome-themes-standard
gnupg
gnutls
gobject-introspection-runtime
gparted
gpgme
gpm
gptfdisk
graphene
graphite
graphviz
grep
groff
grub
gsettings-desktop-schemas
gsfonts
gsl
gsm
gssproxy
gst-libav
gst-plugins-bad
gst-plugins-base
gst-plugins-base-libs
gst-plugins-good
gst-plugins-ugly
gstreamer
gtk-engine-murrine
gtk-theme-breath
gtk-update-icon-cache
gtk-xfce-engine
gtk2
gtk3
gtk3-print-backends
gtkmm
gtkmm3
gtksourceview2
gtksourceview3
gtkspell
gts
gufw
guile
gv
gvfs
gvfs-afc
gvfs-gphoto2
gvfs-mtp
gvfs-nfs
gvfs-smb
gzip
harfbuzz
harfbuzz-icu
haveged
hdf5
hdparm
hexchat
hicolor-icon-theme
hplip
hspell
htop
hunspell
hwids
hwinfo
hyphen
iana-etc
icu
ijs
ilmbase
imagemagick
imlib2
inetutils
iniparser
inotify-tools
inputproto
intel-tbb
intel-ucode
intltool
inxi
iproute2
iptables
iputils
ipw2100-fw
ipw2200-fw
ipython
iso-codes
iw
jack
jansson
jasper
java-environment-common
java-runtime-common
jbig2dec
jdk8-openjdk
jfsutils
jre8-openjdk
jre8-openjdk-headless
json-glib
jsoncpp
jupyter
jupyter-nbformat
jupyter-notebook
jupyter-widgetsnbextension
jupyter_console
kauth
kbd
kbproto
kcoreaddons
keyutils
kitemmodels
kmod
kplotting
krb5
l-smash
ladspa
lame
lapack
lcms2
ldb
ldns
leptonica
less
libabw
libaio
libarchive
libass
libassuan
libasyncns
libatasmart
libatomic_ops
libavc1394
libblockdev
libbluray
libbsd
libburn
libbytesize
libcaca
libcanberra
libcanberra-pulse
libcap
libcap-ng
libcddb
libcdio
libcdio-paranoia
libcdr
libcmis
libcroco
libcups
libdaemon
libdatrie
libdc1394
libdca
libdnet
libdrm
libdv
libdvbpsi
libdvdcss
libdvdnav
libdvdread
libe-book
libebml
libedit
libelf
libepoxy
libetonyek
libevdev
libevent
libexif
libexttextcat
libfbclient
libfdk-aac
libffi
libfontenc
libgadu
libgcrypt
libglade
libglvnd
libgme
libgnome-keyring
libgpg-error
libgphoto2
libgsf
libgtop
libgudev
libguess
libgusb
libical
libice
libid3tag
libidn
libiec61883
libimobiledevice
libinput
libiodbc
libisofs
libixion
libjpeg-turbo
libkate
libksba
liblangtag
libldap
liblouis
liblqr
libmad
libmariadbclient
libmatroska
libmbim
libmm-glib
libmms
libmng
libmnl
libmodplug
libmp4v2
libmpc
libmpcdec
libmpd
libmpeg2
libmspack
libmspub
libmtp
libmwaw
libndp
libnetfilter_conntrack
libnewt
libnfnetlink
libnfs
libnftnl
libnghttp2
libnice
libnl
libnm
libnm-glib
libnotify
libodfgen
libofa
libogg
libomxil-bellagio
libopenraw
liborcus
liborigin2
libpagemaker
libpaper
libpcap
libpciaccess
libpgm
libpipeline
libplist
libpng
libproxy
libpsl
libpthread-stubs
libpulse
libpurple
libqmi
libraqm
libraw1394
librevenge
librsvg
libsamplerate
libsasl
libseccomp
libsecret
libshout
libsidplay
libsigc++
libsigsegv
libsm
libsndfile
libsodium
libsoup
libsoxr
libspectre
libspiro
libsrtp
libssh
libssh2
libstemmer
libsynctex
libsystemd
libtar
libtasn1
libteam
libthai
libtheora
libtiff
libtiger
libtirpc
libtommath
libtool
libunique
libunistring
libunwind
libupnp
liburcu
libusb
libusbmuxd
libutil-linux
libuv
libva
libvdpau
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwbclient
libwebp
libwmf
libwnck
libwnck3
libwpd
libwpg
libwps
libx11
libx264
libx86emu
libxau
libxaw
libxcb
libxcomposite
libxcursor
libxdamage
libxdmcp
libxext
libxfce4ui
libxfce4util
libxfixes
libxfont
libxfont2
libxft
libxi
libxinerama
libxkbcommon
libxkbcommon-x11
libxkbfile
libxklavier
libxml2
libxmu
libxp
libxpm
libxrandr
libxrender
libxres
libxshmfence
libxslt
libxss
libxt
libxtst
libxv
libxxf86misc
libxxf86vm
libyaml
libzmf
licenses
light-locker
lightdm
lightdm-gtk-greeter
lightdm-gtk-greeter-settings
linux-api-headers
lldb
llvm-libs
lm_sensors
logrotate
lpsolve
lsb-release
lttng-ust
lua
lvm2
lz4
lzo
m4
make
man-db
man-pages
manjaro-base-skel
manjaro-browser-settings
manjaro-documentation-en
manjaro-firmware
manjaro-hello
manjaro-hotfixes
manjaro-icons
manjaro-keyring
manjaro-release
manjaro-settings-manager
manjaro-settings-manager-notifier
manjaro-system
manjaro-wallpapers-17.0
manjaro-xfce-settings
mdadm
memtest86+
menulibre
mesa
mesa-demos
mhwd
mhwd-amdgpu
mhwd-ati
mhwd-catalyst
mhwd-db
mhwd-nvidia
mhwd-nvidia-340xx
mime-types
minizip
mjpegtools
mkinitcpio
mkinitcpio-busybox
mkinitcpio-openswap
mlocate
mobile-broadband-provider-info
modemmanager
mousepad
mozilla-common
mpfr
mpg123
mtdev
mtpfs
mugshot
muparser
nano
ncurses
neon
net-snmp
netcdf
nettle
network-manager-applet
networkmanager
networkmanager-dispatcher-ntpd
networkmanager-openconnect
networkmanager-openvpn
networkmanager-pptp
networkmanager-vpnc
nfs-utils
nfsidmap
nm-connection-editor
npth
nspr
nss
nss-mdns
ntfs-3g
ntp
numlockx
ocl-icd
open-vm-tools
openal
openconnect
opencore-amr
openexr
openjpeg2
openmotif
openresolv
openssh
openssl
openssl-1.0
openvpn
opus
orage
orc
os-prober
p11-kit
p7zip
pa-applet
package-query
pacman
pacman-mirrors
pam
pamac
pambase
pango
pangomm
parted
patch
patchutils
pavucontrol
pciutils
pcre
pcre2
pcsclite
perl
perl-clone
perl-dbi
perl-error
perl-file-basedir
perl-file-desktopentry
perl-file-mimeinfo
perl-ipc-system-simple
perl-parse-yapp
perl-uri
perl-xml-libxml
perl-xml-namespacesupport
perl-xml-parser
perl-xml-sax
perl-xml-sax-base
pidgin
pinentry
pixman
pkcs11-helper
pkg-config
po4a
polkit
polkit-gnome
polkit-qt5
poppler
poppler-data
poppler-glib
poppler-qt5
popt
postgresql-libs
potrace
powertop
ppp
pptpclient
printproto
procps-ng
protobuf
protobuf-c
psmisc
pulseaudio
pulseaudio-alsa
pulseaudio-bluetooth
pulseaudio-ctl
pulseaudio-zeroconf
pygobject-devel
pygobject2-devel
pygtk
pyqt5-common
python
python-appdirs
python-cairo
python-dateutil
python-dbus
python-dbus-common
python-decorator
python-distutils-extra
python-docopt
python-gobject
python-ipykernel
python-ipywidgets
python-jinja
python-jsonschema
python-jupyter_client
python-jupyter_core
python-keyutils
python-markupsafe
python-mistune
python-npyscreen
python-numpy
python-olefile
python-packaging
python-pexpect
python-pickleshare
python-pillow
python-pip
python-prompt_toolkit
python-psutil
python-ptyprocess
python-pygments
python-pyparsing
python-pyqt5
python-pyzmq
python-reportlab
python-setuptools
python-sip
python-six
python-terminado
python-tornado
python-traitlets
python-wcwidth
python-xdg
python-yaml
python2
python2-cairo
python2-dbus
python2-gobject2
python2-sip
python2-six
qbs
qpdf
qpdfview
qrencode
qt-assistant-compat
qt4
qt5-base
qt5-declarative
qt5-location
qt5-quickcontrols
qt5-quickcontrols2
qt5-script
qt5-styleplugins
qt5-svg
qt5-tools
qt5-webchannel
qt5-webengine
qt5-x11extras
qt5-xmlpatterns
qt5ct
qtcreator
qtiplot
qwt5
qwtplot3d
randrproto
raptor
rasqal
readline
recordproto
redland
reiserfsprogs
renderproto
rest
rfkill
rhash
rpcbind
rsync
rtkit
rtmpdump
run-parts
s-nail
samba
sbc
schroedinger
scrnsaverproto
sdl
sdl2
sdl_image
sed
serf
shadow
shared-mime-info
sidplay2-libs
sip
slang
smbclient
snappy
sndio
sound-theme-freedesktop
soundtouch
spandsp
speex
speexdsp
splix
sqlite
startup-notification
subversion
sudo
sysfsutils
systemd
systemd-sysvcompat
t1lib
taglib
talloc
tamu-anova
tar
tcc
tcl
tdb
terminus-font
tesseract
tevent
tex-gyre-fonts
texinfo
texlive-bin
thin-provisioning-tools
thunar
thunar-archive-plugin
thunar-media-tags-plugin
thunar-volman
tlp
tslib
ttf-bitstream-vera
ttf-dejavu
ttf-droid
ttf-inconsolata
ttf-indic-otf
ttf-liberation
tumbler
tzdata
udiskie
udisks2
ufw
unace
unixodbc
unrar
unzip
upower
uriparser
usb_modeswitch
usbmuxd
usbutils
util-linux
v4l-utils
v86d
vertex-maia-icon-theme
vertex-maia-themes
vi
vibrancy-colors
vid.stab
videoproto
viewnior
vlc-nightly
volume_key
vpnc
vte-common
vte3
vulkan-icd-loader
wavpack
wayland
wayland-protocols
webkit2gtk
webrtc-audio-processing
wget
which
wildmidi
wireless-regdb
wpa_supplicant
wxgtk-common
wxgtk3
x265
xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xcursor-breeze
xcursor-simpleandsoft
xcursor-vanilla-dmz-aa
xdg-su
xdg-user-dirs
xdg-utils
xextproto
xf86-input-elographics
xf86-input-evdev
xf86-input-keyboard
xf86-input-libinput
xf86-input-mouse
xf86-input-vmmouse
xf86-input-void
xf86-video-vmware
xf86miscproto
xf86vidmodeproto
xfburn
xfce4-appfinder
xfce4-battery-plugin
xfce4-clipman-plugin
xfce4-cpufreq-plugin
xfce4-cpugraph-plugin
xfce4-dict
xfce4-diskperf-plugin
xfce4-fsguard-plugin
xfce4-genmon-plugin
xfce4-mailwatch-plugin
xfce4-mount-plugin
xfce4-mpc-plugin
xfce4-netload-plugin
xfce4-notes-plugin
xfce4-notifyd
xfce4-panel
xfce4-power-manager
xfce4-screenshooter
xfce4-sensors-plugin
xfce4-session
xfce4-settings
xfce4-smartbookmark-plugin
xfce4-systemload-plugin
xfce4-taskmanager
xfce4-terminal
xfce4-time-out-plugin
xfce4-timer-plugin
xfce4-verve-plugin
xfce4-wavelan-plugin
xfce4-weather-plugin
xfce4-whiskermenu-plugin
xfce4-xkb-plugin
xfconf
xfdesktop
xfsprogs
xfwm4
xfwm4-themes
xineramaproto
xkeyboard-config
xmlrpc-c
xmlstarlet
xorg-bdftopcf
xorg-font-util
xorg-font-utils
xorg-fonts-alias
xorg-fonts-encodings
xorg-fonts-misc
xorg-iceauth
xorg-mkfontdir
xorg-mkfontscale
xorg-server
xorg-server-common
xorg-setxkbmap
xorg-twm
xorg-xauth
xorg-xinit
xorg-xkbcomp
xorg-xkill
xorg-xmodmap
xorg-xrdb
xorg-xset
xplot
xproto
xvidcore
xz
yajl
yaourt
yelp
yelp-xsl
zenity
zeromq
zimg
zip
zita-alsa-pcmi
zita-resampler
zlib
zsh
zvbi
zziplib

將其下載到磁碟上保存為packages.txt文件(需要是LF換行,而不是CR-LF),然後在WSL中進入所在目錄(若下載在Windows分區,則進入/mnt/c到/mnt/z中),執行以下指令安裝:

yaourt -Syy `cat packages.txt` --needed # 加yy強制刷新上一步重設的鏡像源

也可以按照官方的pacman教程安裝:

pacman -S --needed $(comm -12 <(pacman -Slq | sort) <(sort packages.txt))

這一步大約有1G的下載量,安裝後大約4G,安裝過程一路回車就行。使用清華鏡像源的話,速度還是可以接受的。

創建用戶:

passwd # 初始化root密碼
useradd -m -s /bin/bash 用戶名 # 創建用戶
passwd 用戶名 # 初始化用戶密碼

編輯/etc/sudoers文件,在root一行(大約79行)之下添加下列代碼,設置sudo許可權:

用戶名 ALL=(ALL) ALL

後續操作都是在用戶賬戶里操作了,執行下面指令切換至用戶賬戶:

su 用戶名

修改/etc/locale.gen文件,取消下面兩行的注釋:

en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8

然後執行下面的代碼初始化語言環境:

sudo locale-gen

修改文件~/.bashrc,加入以下幾行,初始化環境變數:

export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
export DISPLAY=:0

然後為了保險,執行下面指令以恢復.bashrc的運行許可權:

sudo chmod 644 ~/.bashrc

在Windows系統命令行中,用下面的指令設置WSL默認登陸用戶:

ubuntu config --default-user 用戶名

重啟Windows系統——WSL伴隨系統啟動而啟動,關閉窗口後依舊保持運行,需要重啟Windows才能真·重啟。

2.5 啟用X Server圖形環境

這部分比較坑,前面兩篇文章都語焉不詳,我這裡寫我自己摸索的解決方案。

Windows系統中,在SourceForge上下載VcXsrv最新版,安裝後,執行xlaunch快捷方式。

選擇第四項(或者不習慣的話選擇其他項也行),一路下一步

最後一步確認前,先選Save configuration將本次配置保存,下次就可以直接雙擊配置文件啟動X Server

確認後,啟動X Server,這時候窗口內會是一片黑屏,不要驚慌——打開WSL,執行下述指令啟動圖形環境:

startxfce4

【註:不要sudo,否則會進到root里。用戶許可權登陸進去的桌面和主題是配置好的,root進去的是很醜陋的原型】

與Windows結合良好的Linux圖形界面

如果你看到WSL中刷出一堆彩色的運行記錄,然後X Server窗口裡顯示類似上面這樣的桌面環境出現,那麼恭喜你,Manjaro已經安裝成功了,後續章節可以酌情查閱。

通過X Server啟動的Manjaro圖形界面有一個缺點——軟體管理器(pamac-manager)無法安裝或更新軟體,因為它沒辦法獲取root許可權。即使在命令行中root開啟,也無法正確運行。

因此只能在軟體管理器里瀏覽軟體列表,然後將其包名稱(軟體名後面括弧內)放到終端里使用pacman或者yaourt安裝。

如果WSL中沒有刷出各種彩色的運行記錄,而是一二十行就報錯結束,X Server依舊黑屏的話——很抱歉,圖形環境部署失敗。

  1. 部署失敗後,請按如下步驟清理所有數據,從頭再來:
  2. 關閉所有X Server和WSL窗口,任務管理器——詳細信息 中,確保沒有殘留的wslhost.exe進程;
  3. 在Windows開始界面中,右鍵卸載Ubuntu軟體;
  4. 重啟電腦,刪除%localappdata%PackagesCanonicalGroupLimited.UbuntuonWindows_*目錄;
  5. 重新按照上文步驟安裝Ubuntu並部署Arch。

前半篇結束。

這半篇步驟儘可能簡化,拋棄一切不必要的內容(如archlinuxcn),以儘快完成Manjaro和圖形環境的部署,確保部署成功後再做後續工作。

三、使用優化配置

3.1 配置Archlinux CN

中文社區倉庫是由 Arch Linux 中文社區驅動的非官方用戶倉庫。包含中文用戶常用軟體、工具、字體/美化包等。

以sudo許可權在/etc/pacman.conf文件末尾添加以下兩行:

[archlinuxcn]
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch

然後執行以下指令導入GPG key:

sudo yaourt -Syy archlinuxcn-keyring # 加yy強制更新軟體列表緩存

最後直接安裝Archlinux CN倉庫里的fakeroot-tcp(比原文作者高大上多了好不,不需要自己編譯,直接就是最新版):

sudo yaourt -S fakeroot-tcp

3.2 安裝輸入法

根據Arch Wiki頁面引導說明安裝Fcitx輸入引擎,若提示AUR包不應sudo安裝,則去除sudo前綴,指令如下,有選項就一路回車:

sudo yaourt -S fcitx-im # Fcitx框架
sudo yaourt -S fcitx-sogoupinyin # 搜狗拼音,也可安裝wiki中的其他輸入法
sudo yaourt -S fcitx-configtool # 可視化配置工具
sudo yaourt -S fcitx-ui-light # Fcitx的輕量 UI
sudo yaourt -S fcitx-table-extra # Fcitx的一些額外碼錶支持,包括倉頡3, 倉頡5, 粵拼, 速成, 五筆, 鄭碼等等
sudo yaourt -S fcitx-table-other # Fcitx的一些更奇怪的碼錶支持,包括 Latex, Emoji, 以及一大堆不明字元等等

執行以下指令,配置自啟動:

cp /etc/xdg/autostart/fcitx-autostart.desktop ~/.config/autostart/

在~/.pam_environment文件中加入下列代碼,配置非桌面環境支持:

GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx

修改~/.xinitrc文件,在文件末尾加入下列代碼,以確保自啟動:

fcitx &

完成上述操作後,重啟計算機,再次進入Manjaro圖形界面,稍等幾秒,任務欄右下角應該會初始化好拼音工具。右鍵屬性,將不需要的輸入法刪除即可。

注意,X Server和虛擬機不同,雖然會透明轉發所有鍵盤操作和剪貼板,但並沒有屏蔽Windows的操作,所以有的快捷鍵需要注意別和Windows的重複了,避免使用時出現意外。

3.3 配置Manjaro圖形界面快速啟動

通過上述操作啟動X Server圖形界面有點麻煩,需要手動輸入命令行,而且還會保留一個很醜陋的,沒法繼續操作的WSL終端窗口,所以我們決定優化下,做一個一鍵啟動工具。

找到之前保存的config.xlaunch配置文件,在同目錄下建立Manjaro.vbs,用文本編輯器錄入下述代碼:

set wshshell = createobject("wscript.shell")
wshshell.run "cmd /c start config.xlaunch & bash -c DISPLAY=:0 LC_CTYPE=zh_CN.UTF-8 LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx startxfce4 ",0

該代碼會啟動X Server,並通過WSL命令行預設圖形相關的環境變數,啟動xfce4,隱藏命令行窗口。

缺點是,關閉X Server時,後台的WSL進程(wslhost.exe)並不會退出。

哪怕修改腳本代碼,把WSL命令行窗口顯示出來,人工關閉,後台進程依舊不會退出……

不過影響不大,因為關閉X Server後,這個隱藏的後台進程里的xfce4會自動退出,進程只剩下大約800kb的內存佔用和0%的CPU佔用——話說,退出之前,WSL里的Linux進程你居然可以在Windows任務管理器里看到和控制!

然後我們做一個快捷方式到Manjaro.vbs,給它換一個漂亮的圖標。

Manjaro Logo —— 知乎你特么不支持png嗎?為什麼編輯時又是透明背景了?

這個快捷方式沒辦法右鍵固定到開始屏幕,但問題不大,我們將其拷貝到C:ProgramDataMicrosoftWindowsStart MenuPrograms目錄下,它就出現在開始屏幕的程序列表裡,然後就可以將其右鍵固定到磁貼上了。

3.4 配置Nano高亮

如果用不來Vim(比如我……),或者習慣了nano的,那麼需要配置一下,因為Manjaro的nano是默認配置,沒有高亮也沒有行號等等。

這部分,抄@韋易笑 大佬的這篇文章就行了

韋易笑:Nano 編輯器可以做些什麼??

zhuanlan.zhihu.com圖標

注意,root用戶的nano配置文件是在/root/.nanorc

3.5 安裝輔助工具

安裝bat,帶語法高亮的cat:

sudo yaourt -S bat

https://github.com/sharkdp/bat

下面幾個來自@韋易笑 大佬的回答

有哪些命令行的軟體堪稱神器??

www.zhihu.com圖標

安裝cppman,命令行直接用類似man的方式查看cppreference手冊:

sudo yaourt -S cppman

https://github.com/aitjcize/cppman

可以命令行參數將cppreference內容永久緩存下來,並且添加到man里。

安裝icdiff,分屏顯示diff的工具

sudo yaourt -S icdiff

diff

icdiff

修改~/.gitconfig,將其配置為git diff默認工具(也可以直接git icdiff):

[diff]
external = ~/.git-icdiff.sh

[icdiff]
options = --highlight --line-numbers

[alias]
diff = icdiff

編輯~/.git-icdiff.sh,設置icdiff指令:

#!/bin/bash
/usr/bin/icdiff $2 $5

3.6 安裝zsh

配置zsh,這部分照抄@韋易笑 大佬的回答就行

為什麼說 zsh 是 shell 中的極品??

www.zhihu.com圖標

配置完畢後,可以通過chsh將默認shell切換為zsh。

下半篇結束,諸君,使用愉快!

========

繼續uxij噴pen @知乎小管家 亂碼luanmalualul問題 wenti went wen we 持續了- chixule"一百個egiabiy版本nebnab了el,還iah不改iagub???

========

@知乎小管家 @黃繼新 你們哪隻眼睛看到這篇文章政治敏感?我寫篇工具手冊都不讓,你們的敏感點怕不是low穿地心吧???


推薦閱讀:

TAG:Linux | Windows10 | ArchLinux |