利用WSL打造Arch开发环境

利用WSL打造Arch开发环境

一、前言

作为有史以来最优秀的Linux发行版,Win10 结合 WSL 是很美好的使用方式。

Windows 和 WSL 可以互相访问对方的文件系统,甚至可以直接执行对方的可执行程序,输入输出管道也是互通的……直接秒 wine、cygwin、msys 啥的十八条街了。

WSL调用Windows

WSL2:甚至直接共享 Win32 的环境变量搜索路径了,可以直接输入 notepad.exe 启动记事本。

Windows调用WSL

更凶残的:可以实现类似 VMWare 的 Unity 模式,运行 Linux 图形应用,并且和 Windows 无缝结合。

窗口应用无缝结合

目前除了驱动层的一些超底层API和设备用起来不太对,上层应用已经毫无差异了,比如开机自启动服务,比如 web 那一套啊,比如 c/c++/java/go 神马的完美运行。最大的缺陷是,docker 暂时还不支持。

WSL2:由于 WSL2 是通过 Hyper-V 虚拟机实现的,理论上和标准 Linux 已经无差异,实际目前还有一些缺陷待改进,但已经可以使用 docker 了。


而且目前版本性能问题也显著改善了,至少我安装部署过程中,几个 GB 的软件包安装没感觉有问题。

WSL2:据官方测试,I/O 性能有了显著提升,解压缩提升20倍,常规文件操作提升5-6倍。无需担心虚拟机性能开销,因为开启 Hyper-V 后,win32 也是运行在虚拟机里的……


至于界面性能么……我写了个显示海量数据(一千万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 关于 WSL2

自 20H1 预览版(Build 18917)开始,可以使用 WSL2 了,详见 WSL 2

命令行直接使用wsl --set-version <Distro> 2即可将已有的发行版无缝升级到 WSL2,哪怕是这篇文章里的魔改版本……

也可以用wsl --set-default-version 2将以后新安装的发行版默认安装为 WSL2。

但目前麻烦的是,在目前版本中 WSL2 和 Win32不使用同一套IP地址(之后会修复),所以网络工具,包括 X Server 配置,都需要进行调整。


2.3 安装 Arch 内核

WSL 子系统中,其实是微软人工实现了一个 Windows 上的 Linux 内核,做到对 Linux 标准内核的二进制兼容,然后加上一些类似辅助包,来支持运行 Linux 系统。

(注:在WSL2中,是通过 Hyper-V 运行原装的 linux 内核了,不会再有奇奇怪怪的问题,但二进制调用互通文件系统互访问依旧支持!!!)

在这套黑科技甚至保证了两个系统的文件系统互相可见,互相调用,我们甚至可以在 Linux shell 里调用执行 exe 程序,或者在 Windows cmd 里执行 Linux 程序!

所以这也是这篇文章骚操作的基础——我们装一个 WSL 已支持的 Linux 发行版,再把它的内核软件包替换成 Arch 即可。

上述骚操作,已经有人打包好了,安装 yuk7/ArchWSL 即可。


2.4 安装 Manjaro

重新打开 WSL,安装 Nano 或者 Vim(必须这步安装,否则下一步把国内镜像源替换掉后就不好装了)。

手动修改/etc/pacman.d/mirrorlist,将其他源注释或删掉,配置清华镜像源:

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


依次执行下列操作更新镜像源和 Arch 内核:

pacman-key --init # 初始化key
pacman -Syy 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 # 强制更新软件源索引列表,并更新系统软件包

若更新刚开始时提示更换 mirror,则选n,否则会进入速度很慢的官方 mirror。

更新过程中一路回车,其中询问 Linux 内核包时随便选一个(因为没啥卵用,WSL 锁定了,可以用uname -a查看版本)。


更新完后,镜像源设置会被刷新,加了一堆国外的源。这时候需要手动修改/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
yay
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中),按照官方的 pacman 教程安装:

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

这一步大约有 1G 的下载量,安装后大约 4G,安装过程一路回车就行。使用清华镜像源的话,速度还是可以接受的。

若刚开始时提示更换 mirror,则选n,否则会进入速度很慢的官方 mirror。

若提示有冲突,则一律按照推荐选择进行。


创建用户:

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 LC_CTYPE=zh_CN.UTF-8
export LANG="zh_CN.UTF-8" 
export LC_ALL="zh_CN.UTF-8" 

export DISPLAY=localhost:0
export PULSE_SERVER=tcp:127.0.0.1

WSL2:WSL2 是使用虚拟机实现的,和 Win32 系统有不同的ip了,export DISPLAYPULSE_SERVER中的 IP 地址需要进行修改,格式如下:

export DISPLAY=`cat /etc/resolv.conf | grep nameserver | awk '{print $2}'`:0
export PULSE_SERVER=`cat /etc/resolv.conf | grep nameserver | awk '{print $2}'`


PULSE_SERVER一句是关于 PulseAudio 声音支持的,不需要可以删掉。

然后为了保险,执行下面指令以恢复.bashrc的运行权限:

sudo chmod 644 ~/.bashrc


在 Windows 系统命令行中,用下面的指令设置 WSL 默认登陆用户:

arch config --default-user 用户名


执行以下指令修复libQt5Core.so的文件链接,以免打不开基于 Qt 的程序:

sudo strip --remove-section=.note.ABI-tag /usr/lib64/libQt5Core.so.5

2.5 启用X Server图形环境

这部分比较坑,前面两篇文章都语焉不详,我这里写我自己摸索的解决方案。


2.5.1 启用桌面图形环境

Windows 系统中,在 SourceForge 上下载 VcXsrv 最新版,安装后,执行xlaunch快捷方式。


选择第四项(或者不习惯的话选择其他项也行),一路下一步
若使用 WSL2,则需开启 Disable access control
最后一步确认前,先选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或者yay安装。


如果 WSL 中没有刷出各种彩色的运行记录,而是一二十行就报错结束,X Server 依旧黑屏的话——很抱歉,图形环境部署失败。

  1. 部署失败后,请按如下步骤清理所有数据,从头再来:
  2. 关闭所有 X Server 和 WSL 窗口,任务管理器——详细信息 中,确保没有残留的wslhost.exe进程;
  3. 在 Windows 开始界面中,右键卸载 Arch 软件;
  4. 重启电脑,删除C:\Program Files\WindowsApps\yuk7.archwsl_19.10.11.0_x64__35zwpb4sx6e50%localappdata%\Packages\yuk7.archwsl_*目录;
  5. 重新按照上文步骤安装并部署 Arch。


2.5.2 启用多窗口图形环境

其实,完整的桌面版图形环境并不方便,因为需要在 Win 和 Linux 两个桌面里左右横跳。

更方便的,是以窗口为单位启动 Linux 程序,然后这个窗口会无缝融合到 Windows 的窗口系统中,等价于 VMWare 的 Unity 模式

VcXsrv 设置

如图,启动 VcXsrv 时,使用Multiple windows模式,并在设置里关闭Native opengl,然后你会发现并没有出现任何新窗口,而是以任务栏右下角按钮的方式启动。

然后,在 WSL 控制台中,带export DISPLAY环境变量启动 GUI 程序,你会发现它们不再启动失败,而是在 Windows 中打开了应用窗口。

打开 Mousepad

不过,该指令会阻塞当前终端,所以建议在指令末尾添加&,使其在后台终端运行,而不阻塞当前终端。

当然,每次都这么手动敲指令设置环境变量会比较麻烦,所以更好的办法是写一个脚本,自动配置环境变量,并执行用户输入的后续指令,如:

#!/bin/bash
export PULSE_SERVER=tcp:$(grep nameserver /etc/resolv.conf | awk '{print $2}'); export DISPLAY=`cat /etc/resolv.conf | grep nameserver | awk '{print $2}'`:0; export GTK_IM_MODULE=fcitx; export QT_IM_MODULE=fcitx; $@;

此处填的是 WSL2 的代码, WSL1 的环境变量设置详见前文。

如果已经在将这两个环境变量设置到全局了的话,也可以直接在命令行启动程序。


将其保存到/usr/bin/win,并使用chmod a+x /usr/bin/win添加执行权限即可。

sudo和后续命令行参数均有效

不过,VcXsrv 有一个小 bug,就是这种方式启动的 GUI 程序,有时无法开启新的窗口(如文件对话框)。

如果对这个用法很有需求的话,建议在 Windows 应用商店下载 X410 ,这是目前最好用的 X Server,并且不存在上述 bug,包含功能如下:

  • 显示方式:
    • 独立窗口显示应用;
    • 单一窗口显示桌面;
    • 全屏显示桌面;
  • 附加设置:
    • 允许远程连接(Allow public access),等同于 VcXsrv 的Disable access control;
    • 共享剪贴板,并且可开启设置,在 Linux 选择后,就自动拷贝至 Windows 剪贴板;
    • 启动 DPI 缩放,兼容 HiDPI 的 Windows桌面设置。



前半篇结束。

这半篇步骤尽可能简化,抛弃一切不必要的内容(如 archlinuxcn),以尽快完成 Manjaro 和图形环境的部署,确保部署成功后再做后续工作。



三、使用优化配置

3.1 配置 Archlinux CN

中文社区仓库是由 Arch Linux 中文社区驱动的非官方用户仓库。包含中文用户常用软件、工具、字体/美化包等。

以 sudo 权限在/etc/pacman.conf 文件末尾添加以下两行:

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

然后执行以下指令导入 GPG key:

yay -Syy archlinuxcn-keyring # 加yy强制更新软件列表缓存

最后直接安装 Archlinux CN 仓库里的 fakeroot-tcp(比原文作者高大上多了好不,不需要自己编译,直接就是最新版):

yay -S fakeroot-tcp


3.2 安装输入法

根据 Arch Wiki 页面引导说明安装 Fcitx 输入引擎,指令如下,有选项就一路回车:

yay -S fcitx-im # Fcitx框架
yay -S fcitx-sogoupinyin # 搜狗拼音,也可安装wiki中的其他输入法
yay -S fcitx-configtool # 可视化配置工具
yay -S fcitx-ui-light # Fcitx的轻量 UI
yay -S fcitx-table-extra # Fcitx的一些额外码表支持,包括仓颉3, 仓颉5, 粤拼, 速成, 五笔, 郑码等等
yay -S fcitx-table-other # Fcitx的一些更奇怪的码表支持,包括 Latex, Emoji, 以及一大堆不明字符等等


执行以下指令,配置自启动:

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


~/.pam_environment~/.bashrc文件中加入下列代码,配置输入法环境变量:

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.bat,内容如下:

start "" /B "C:\Program Files (x86)\PulseAudio\bin\pulseaudio.exe" -D
start config.xlaunch
bash -c "export PULSE_SERVER=tcp:127.0.0.1; export DISPLAY=127.0.0.1:0.0; export LC_CTYPE=zh_CN.UTF-8; export LANG=zh_CN.UTF-8; export LC_ALL=zh_CN.UTF-8; export GTK_IM_MODULE=fcitx; export QT_IM_MODULE=fcitx; export XMODIFIERS=fcitx; startxfce4;"
taskkill /IM pulseaudio.exe /F /T

WSL2export DISPLAY一句同样改成~/.bashrc中的写法。

在 Manjaro.vbs,用文本编辑器录入下述代码:

set wshshell = createobject("wscript.shell")
wshshell.run "Manjaro.bat",0

该代码会启动 X Server,通过 PulseAudio 启动声音支持(详见后续章节,若不需要可删除 PulseAudio 对应代码),并通过 WSL 命令行预设图形相关的环境变量,启动 xfce4,隐藏命令行窗口。

缺点是,关闭 X Server时,后台的 WSL 进程(wslhost.exe)并不会退出。

哪怕修改脚本代码,把 WSL 命令行窗口显示出来,人工关闭,后台进程依旧不会退出……

不过影响不大,因为关闭 X Server 后,这个隐藏的后台进程里的 xfce4 会自动退出,进程只剩下大约 800kb 的内存占用和 0%的 CPU 占用——话说,退出之前,WSL 里的 Linux 进程你居然可以在 Windows 任务管理器里看到和控制!


然后我们做一个快捷方式到 Manjaro.vbs,给它换一个漂亮的图标

Manjaro Logo —— 知乎你特么不支持png吗?为什么编辑时又是透明背景了?

这个快捷方式没办法右键固定到开始屏幕,但问题不大,我们将其拷贝到C:\ProgramData\Microsoft\Windows\Start Menu\Programs目录下,它就出现在开始屏幕的程序列表里,然后就可以将其右键固定到磁贴上了。


3.4 配置Nano高亮

如果用不来Vim(比如我……),或者习惯了 nano 的,那么需要配置一下,因为 Manjaro 的 nano 是默认配置,没有高亮也没有行号等等。

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

韦易笑:Nano 编辑器可以做些什么?zhuanlan.zhihu.com图标

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


3.5 安装声音支持

根据如下文章步骤,安装并配置 PulseAudio:

Enabling sound in WSL / Ubuntu - Let It Sing! - Choung Networkstoken2shell.com图标

即可启动声音支持。

为与上文的启动脚本匹配,请将 PulseAudio 软件解压至C:\Program Files (x86)\PulseAudio目录中。

3.6 安装辅助工具

安装 tldr,说人话的,用户友好的 man page:

yay -S tldr
tldr-pages/tldrgithub.com图标


安装 bro,由社区投票贡献,以用例为主的帮助系统:

yay -S ruby
yay -S ruby-dev
gem install bropages
bro


安装 bat,带语法高亮的 cat:

yay -S bat
sharkdp/batgithub.com图标


下面几个来自@韦易笑 大佬的回答

有哪些命令行的软件堪称神器?www.zhihu.com图标


安装 cppman,命令行直接用类似man的方式查看 cppreference 手册:

yay -S cppman
aitjcize/cppmangithub.com图标

可以命令行参数将 cppreference 内容永久缓存下来,并且添加到 man 里。


安装 icdiff,分屏显示 diff 的工具

yay -S icdiff
diff
icdiff
jeffkaufman/icdiffgithub.com图标

修改 git 设置,将其配置为 git diff 默认工具(也可以直接git icdiff):

git config --global icdiff.options '--highlight --line-numbers'

编辑~/.git-icdiff.sh,设置 icdiff 指令:

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


安装 Nerd Fonts,扩展了 Powerline、FontAwesome 等特殊符号的字体包,以便于fish等各类shell主题使用:

yay -S nerd-fonts-complete

安装 glances,更强大的 htop / top 代替者

yay -S glances
glances


安装 dstat,vmstat 代替者:

yay -S dstat
dstat


安装 mcedit,终端下面的 NotePad++ 和 Total Commander:

yay -S mc
mcedit
mc

3.7 安装zsh

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

为什么说 zsh 是 shell 中的极品?www.zhihu.com图标

配置完毕后,可以通过chsh将默认 shell 切换为 zsh。


下半篇结束,诸君,使用愉快!

编辑于 2019-12-10