注意:以下内容仅供参考,如有错误请多赐教,不胜感激
(知乎那个SHIRAKAGE也是我[>_<])
为什么叫“某不科学的'使用Visual Studio Code与虚拟机搭配进行Linux驱动开发的环境搭建教程'”捏?原因很简单,因为我老笨蛋了。
好,废话少说,咱得把掺了水的干货拿出来晾晾对吧。那就开始吧。当然,这次是讲Windows平台。
Visual Studio Code的官方网址: code.visualstudio.com/
VSCode的安装就先跳过吧,和正常游戏安装差不多(误),那么接下来是个人感觉最好装上的VSCode插件:

中文包为了新手看界面方便找功能,剩下插件是为了让VSCode识别C/C++和CMake然后显示出不同的颜色,还有自动补全、语法感知这些功能的插件。(要实际上根据需要进行取舍)那么与虚拟机有两种沟通方案。接下来会针对两种方案进行针对性的描述。
这个方案下需要的Visual Studio Code扩展插件:Remote - SSH

虚拟机以VirtualBox下安装的Fedora Server 33为例。首先,我们为了虚拟机和物理机网络上互相连通,应该使用桥接方式连接。比如我使用无线网卡上网,为了让物理机和虚拟机都能连接网络而且互连,那我的网卡设置应该是这样的:

P.S.Intel(R)Wi-Fi 6 AX200 160MHz是我使用的无线网卡然后单击“OK”保存并启动虚拟机。在Fedora上我们至少需要安装以下两个包:
openssh-server
gcc根据自己使用的系统使用命令安装。(这里我使用的是yum install)
在安装完成之后,以root权限使用编辑器修改ssh的配置文件。(这里我使用的是nano编辑器)# nano /etc/ssh/sshd_config

进入sshd_config后显示如图下界面:

找到“#Port 22”把注释“#”去掉,按Ctrl+O保存,出现如下图提示后直接回车,不要改名(改名会变成另存为),然后按Ctrl+X退出nano文本编辑器。

接下来在虚拟机内输入指令ifconfig(如果提示不存在,请尝试安装net-tools,实际server启动时提示的带:9090的那个IP地址就是)查看当前虚拟机的IP:

比如我虚拟机现在的IP就是 192.168.1.105,这个是我们需要之后在VSCode中配置Remote - SSH使用的。接下来我们启动VSCode,在远程资源管理器栏目中选中SSH Targets,大致如图所示(我的已经配置完成了):

点击此处的+号(Add New)开始添加新的SSH Remote连接信息:

在之后弹出的窗口中输入SSH连接指令,像这样(ssh 用户名@虚拟机所在地址),个人感觉最好不要用root账户:

回车确定之后会弹出下一个界面,提示选择要更新本地的ssh配置文件(我这里选择C:\Users\stude.ssh\config):

添加成功

右键单击,在弹出的窗口中选择在当前窗口连接或者在新窗口进行连接

在之后弹出的提示窗中,选择“Linux"

之后会弹出一个确认窗口,确认连接密钥,OK进行下一步。在接下来窗口中输入账户的密码。


连接成功
此时打开"资源管理器",单击"打开文件夹"

之后在弹出的界面里输入要访问虚拟机的目录:

选中后单击"确定"

再次输入密码

连接成功。按住Ctrl+Shift+·开启终端(访问虚拟机),在终端输入指令,在资源管理器中修改文件即可。
跑个screenfetch庆祝下
到这儿有的兄弟就该说了,说:“老弟啊,你不讲武德啊,欺负我十几年前Kernel 2.6的老同志,来,骗,来,偷袭。我啪的一下,很快啊,就点进来了,然后我大意了,VSCode的Remote - SSH不支持连接老系统,没有闪,用不了,你说咋办?”别急啊,下面第二种方法就不限制Linux发行版版本了啊。

献给全人类的Ubuntu 10.04 在2013年4月暂停支持(但是学校老师还要求用也没办法)
这个方案下需要的Visual Studio Code扩展插件:SFTP

就是这个东西:SFTP然后虚拟机端以VMware Workstation Pro 16 + Ubuntu 10.04 LTS 32位为例,同样的,我们需要将虚拟机网络改成桥接模式:

然后单击”确定“并启动虚拟机。然后启动虚拟机的终端对需用的软件进行安装。(停止服务的Linux发行版如何换旧仓库源这里先不做说明)
需用的软件:
vsftpd
gcc(Ubuntu 10.04默认安装)
在事先我已经安装完成,所以出现这样的提示安装之后,需要对Ubuntu的FTP服务进行配置,这里我还是要拥抱我最爱的nano编辑器,$ sudo nano /etc/vstftpd.conf 然后出现如下界面:

在配置文件内至少要添加(或取消注释并修改)以下内容,其余的酌情更改:
anonymous_enable=YESanon_root=你要设置的ftp根目录(比如我将Ubuntu的根目录设置为ftp的根目录,这条就是anon_root=/)
虚拟机端姑且设置这些,Ctrl+O保存,Ctrl+X退出编辑。ifconfig查询虚拟机IP。

接下来我们回到Visual Studio Code的资源管理器,单击“打开文件夹”。

打开的这个文件夹最好是专门用来放开发项目的文件夹,就像这样:

按住Ctrl+Shift+P打开命令面板输入”SFTP“,选择”SFTP:Config“,会自动在文件夹下面生成sftp.json并打开编辑。
sftp.json的文件结构如下:
{
"name": "My Server", ---------------连接服务器的名称
"host": "localhost", ---------------连接服务器的地址
"protocol": "sftp", ---------------使用的协议
"port": 22, ---------------服务器开放FTP的端口
"username": "username", ---------------访问时使用的用户名
"remotePath": "/", ---------------远程数据的路径
"uploadOnSave": true, ---------------上传时是否保存
"algorithms": {
"kex": [ "ecdh-sha2-nistp256", "ecdh-sha2-nistp384", "ecdh-sha2-nistp521", "diffie-hellman-group14-sha1" ],
"cipher": [ "aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm", "aes128-gcm@openssh.com", "aes256-gcm", "aes256-gcm@openssh.com" ],
"serverHostKey": [ "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521" ],
"hmac": [ "hmac-sha2-256", "hmac-sha2-512", "hmac-sha1" ]
}
} *VSCode更新之后需要添加这些内容避免SFTP插件崩溃。我的sftp.json大概这样:
{
"name": "Ubuntu 10.04",
"host": "192.168.1.104",
"protocol": "sftp",
"port": 22,
"username": "linux",
"remotePath": "/",
"uploadOnSave": true,
"algorithms": {
"kex": [ "ecdh-sha2-nistp256", "ecdh-sha2-nistp384", "ecdh-sha2-nistp521", "diffie-hellman-group14-sha1" ],
"cipher": [ "aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm", "aes128-gcm@openssh.com", "aes256-gcm", "aes256-gcm@openssh.com" ],
"serverHostKey": [ "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521" ],
"hmac": [ "hmac-sha2-256", "hmac-sha2-512", "hmac-sha1" ]
}
}好,保存,进行下一步。此时VSCode左侧工具栏应该出现了一个新的图标,点他:

就是这个靓仔
然后点中新出现的这个显示着服务器名的栏目,然后会提示输入密码:

在这里输入密码并敲回车,即可完成FTP连接:

上文提到过一个智能补全和内容感知的插件,在这里为了图方便,实际上Windows下面也可以给Linux下C语言编程提供自动补全和内容感知。为了做到这个效果,我们还需要一个插件-Include Autocomplete:

好,加上最开始的那些插件,理论上可以做到大部分自动补全和内容感知。但是假设,以Linux Kernel模块开发为例:Windows下面并没有Linux Kernel下面的依赖库头文件这些。如果用到需要拷贝一份include文件夹和它下面包含的所有文件到Windows系统下面。
这个include文件夹从哪来呢?有两种途径:
下载Linux Kernel
从虚拟机内的/usr/include拷贝这时候假设我们把include文件夹拷贝到这个位置:

之后,我们需要打开VSCode的设置,使用 在"settings.json"中编辑 编辑设置文件,添加以下内容:
"[cpp]": {
"editor.quickSuggestions": true --------------开启针对C++的快速建议
},
"[c]": {
"editor.quickSuggestions": true --------------开启针对C语言的快速建议
},
"C_Cpp.default.includePath": [
"D:/Program Files/Linux/Ubuntu/include/x86_64-linux-gnu**",
"${workspaceFolder}/**",
"D:/Program Files/Linux/Ubuntu/include/**",
"D:/Program Files/Linux/Ubuntu/include",
],"C_Cpp.default.includePath"里的内容即为存储include文件夹所在的位置。修改后保存,然后可以新建C语言源文件进行测试。