本文围绕计算机操作系统,概述了当下各种生信分析的工作环境。

一文掌握Conda软件安装:虚拟环境、软件通道、加速solving、跨服务器迁移

01

Linux子系统

  Windows下的Linux子系统,即WSL(Windows Subsystem for Linux)。基于Win10的WSL技术目前可使用的是Ubuntu子系统,后者是一个完整的Ubuntu终端环境,可以使用Linux环境下的任何软件和文件而不用离开Windows。WSL是一个在Win10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层,它是由微软与Canonical公司合作开发。WSL基于Windows NT内核虚拟了Linux内核接口,其能够运行大部分的Linux软件,但图形化界面无法运行


  WSL包含内核态驱动(lxss.sys和 lxcore.sys),以协调Linux系统调用的请求与Windows NT内核。驱动不包含Linux内核代码,但是是一个全新实现的Linux兼容的内核接口。在原生的Linux上,用户态程序请求一个系统调用,系统调用请求由Linux内核处理。在WSL,当一个系统调用由同一个可执行文件请求时,Windows NT内核把请求发送给lxcore.sys。当可能时,lxcore.sys将Linux系统调用翻译成等价的Windows NT的调用,由它来完成繁重的工作。当没有可能的等价转换时,Windows内核态驱动需要直接处理请求。比如说,Linux中的fork()系统调用没有直接的等价的Windows版本。当一个fork系统调用由Windows Subsystem for Linux产生时,lxcore.sys需要做一些复制进程的准备工作,然后调用Windows NT内核APIs来产生一个进程来正确实现fork操作,完成为新进程复制额外的数据。


  文件系统。WSL提供了两种文件系统,VolFs 和 DriveFs,VolFs提供了完整的Linux文件系统的特性,包括符号链接和权限管理等;DriveFs兼容Windows下的文件格式,所有的Windows磁盘使用DriveFs挂载在/mnt/目录下,即访问C、D、E盘的位置。在Ubuntu子系统终端中输入命令:

explorer.exe .

会弹出Windows的文件资源管理器,便可轻松访问Linux子系统中的文件。

02

比较:Linux子系统、双系统、虚拟机与Docker

  双系统的名字有一定的误导。实际上安装双系统的计算机在开机时可以进入Windows或Linux中的任何一个,但不能同时进入、同时存在。双系统的安装比较困难。尤其是Linux系统:下载系统镜像、以U盘或光驱来作为启动媒介、通过BIOS界面进入系统安装等等。安装流程十分复杂、耗时,但用户体验非常好。不管进入哪一个系统,都拥有完整的操作系统环境和硬件资源。然而在某些情况下需要联合两个系统一起使用时,两个系统之间的切换很麻烦,需要记住文件存放的位置、关机、启动,再进入另一个操作系统。

  虚拟机可以直接在宿主机上虚拟出新的操作系统。下载VM虚拟机(VMware Workstation)软件后按照操作说明即可安装虚拟的Linux系统。切换操作系统时像打开一款软件一样方便。安装起来简单,两个系统也能同时存在。但是虚拟出来的Linux系统使用体验很差,例如系统启动略耗时,使用时又卡顿,因为虚拟出来的硬件资源和操作系统由于内存和硬盘资源利用率低,即使在为它分配了较多CPU和内存资源的情况下也很难提升性能,而这对于常见的生信信息学大文本数据的分析来说无疑是难以忍受的

  Linux子系统的安装也像安装一个Windows软件一样简单,除了需要做一些必要的系统升级和权限设置。相关的安装教程网络上也已经非常多了。子系统几乎是原生的Linux系统,例如可以使用Anaconda管理各种生信类软件(已通过测试,这是一个很大的特性)、安装Linux版的RStudio并被远程访问(未测试)、作为云端搭建网站(未测试)。这与Windows下的Git bash完全不同,后者仅仅是模拟了一些Bash命令而不是操作系统。此外Windows下的RStudio也可以通过其Terminal直接访问Linux子系统。因此通过WSL,两个系统可以同时存在,缺点只是Linux子系统没有图形化界面(这可能在后续的版本中被解决)。然而生信分析的实践中很少用到Linux系统的图形化界面,主要是使用Linux服务器的运算能力、命令行脚本、生信软件、流程化分析和多用户管理等,这些在子系统中都可能实现,因此对于我们来说无法图形化也不算缺点了。笔者近期在Linux子系统中安装了全外显子分析的多个软件,均可以成功运行,如同在使用一个Linux服务器(借助这个特性,我们团队正在谋划一个更大的计划,随后会与大家分享!)。

  Docker作为一种容器虚拟技术是一种轻量级的虚拟机技术,不虚拟硬件和内核资源,在软件服务层面上完全可以替代虚拟机。它和Ubuntu子系统都具有轻量级的特性,都能从软件层面上解决操作系统环境的问题。有兴趣的读者可以探索一下相关的使用方法。

03

一些注意事项

    1) Windows的版本以及对于Ubuntu子系统的支持

        目前Win10的比较新的版本是支持Ubuntu子系统的,但是否在相当长的时间内一直支持下去,我们不得而知。微软最近不是说要停止对IE的支持吗?那么连IE都可以停止,别说其它很多软件了。但我们相信一个东西一旦被开发出来了,它就可能永远以某种形式存在下去。这一点还得使用它的人多多反馈和支持,不能光享受它带来的好处而不有所贡献。软件最好是收费的,因为免费的东西更加不会长久。

    2) WSL的版本

        以往使用的WSL建议升级到WSL2,而如果要使用WSL2,Win10需要更新至目前的最新版本。WLS版本的相关设置可以通过Win10的Powershell中wsl.exe指令进行。

    3) 系统迁移

        Ubuntu子系统默认安装在系统的C盘中,如果想要迁移的话可以参照:。但需要注意:最好给Ubuntu分配到固态硬盘上,可以明显提升其流畅性。

    4) IP地址

        WSL1中Ubuntu子系统的IP和Win10的IP是一样的,在网络适配器中更改Win10的IP地址也会改变Ubuntu子系统的地址。WSL2中已经为子系统和宿主机虚拟出了新的网卡端口。而宿主机中出现的交换机vEthernet(Default Switch)是开启Hyper-V才有的。WSL2的IP映射方式类似虚拟机网卡的NAT模式,也就是在宿主机中模拟出新的网卡和子系统相连,而并没有将子系统直接放在宿主机所在的网端上。同时Ubuntu子系统/etc/network/目录下已经没有了interfaces文件,该文件是用于Ubuntu系统的网络配置,转而是该位置的另外两个文件夹,它们的下面都有名叫ethtool的脚本文件。

    5) 软件共享

        两个系统的软件可以共享!例如Win10的VSCode软件可被Linux子系统访问。在安装子系统的同时,如果你装了VSCode文本编辑器,那么VSCode会提示我们安装一个名叫"Remote WSL"的插件。该插件可以让你通过子系统直接使用在Win10系统下的软件(VSCode)而无需重新安装,并且此时开启的VSCode使用的是Linux下的编译环境,比如C语言使用的是/usr/bin/gcc。很多软件,Win10中安装过后子系统就不需要再重复安装,我们只是习惯在不同的操作系统环境中使用这些软件。所以Ubuntu子系统极大的解决了我们在不同环境下使用同一软件应用的需求。这个情况也适用于Docker,即在Win10和Ubuntu子系统中均可被调用。借助这个功能,读者可以测试一些Win10中有发行版、而Linux中没有的软件,例如:vsearch(还是哪个来着?)、plink(好像也有Linux版的)等等,测试时看看是否需要安装"Remote WSL"插件。

    6) 配合WSL-Terminal使用

        由于WSL自带的终端模拟器存在一些问题(例如代码复制、不同类型文件名的颜色等),外观也不是很美观,所以推荐将WSL结合WSL-terminal一起使用。具体可以参考这篇博文:《WSL – 配合wsl-terminal使用效果更佳》()。

04

结束语

  从虚拟机到双系统,再到现在的子系统,虽然操作系统的理论研究没有大的突破,但技术层面一直在进步。期待相关应用的进一步发展,以惠及我们所处的某个小领域的大需求。

本文的相关指引详见:

    《Windows10下使用Ubuntu子系统》();

    《Windows10 Linux子系统安装/迁移到非系统盘》();

    《WSL – 配合wsl-terminal使用效果更佳》()。

一览生信分析的各种工作环境—Linux子系统、双系统、虚拟机和Docker_java