开始用Ubuntu 20.04 server,但是发现g++版本是9.4,不够NS-3的最低要求

根据这个回答
https://askubuntu.com/questions/1500553/how-to-install-g12-on-ubuntu-20-04-6
最好还是直接升级到ubuntu 22.04然后升级g++

因为之后可能需要可视化网络拓扑,所以server还得装上桌面,感觉不如一开始直接安装ubuntu desktop版本。看网上视频教程有推荐用server的,不过没说原因。

总之系统搞定了就要装依赖和软件了。很多NS-3安装教程都有些年头了,但是从3.36版本开始,NS-3的构建工具改成了CMake,之前的安装教程都不适用了。

不过还是找到了一个新一点的教程:
https://youtu.be/BpfF-ZaFSJ8?si=5lnVLBHkV7eYMTWS

  1. 先安装一些依赖,虽然不一定都用得上。
1
$ sudo apt install g++ python3 cmake ninja-build git gir1.2-goocanvas-2.0 python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython3 tcpdump wireshark sqlite sqlite3 libsqlite3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev doxygen graphviz imagemagick python3-sphinx dia imagemagick texlive dvipng latexmk texlive-extra-utils texlive-latex-extra texlive-font-utils libeigen3-dev gsl-bin libgsl-dev libgslcblas0 libxml2 libxml2-dev libgtk-3-dev lxc-utils lxc-templates vtun uml-utilities ebtables bridge-utils libxml2 libxml2-dev libboost-all-dev ccache

这之后其实跟着官方教程走就行
https://www.nsnam.org/docs/tutorial/html/quick-start.html

  1. 下载NS-3的release版本,也就是官网上的tar包版本。

解压之后的目录下类似这样

1
2
~/ns-allinone-3.43$ ls
bake build.py constants.py netanim-3.109 ns-3.43 README.md util.py
  1. 配置构建系统

进入ns-3.43目录,可以看到类似内容

1
2
3
4
5
~/ns-allinone-3.43/ns-3.43$ ls
AUTHORS build-support CMakeLists.txt doc LICENSES pyproject.toml scratch src utils
bindings CHANGES.md contrib examples ns3 README.md setup.cfg test.py utils.py
build cmake-cache CONTRIBUTING.md LICENSE __pycache__ RELEASE_NOTES.md setup.py testpy-output VERSION

配置构建系统

1
$ ./ns3 configure --enable-examples --enable-tests
  1. build

这一步可能要花很久

1
$ ./ns3 build
  1. 运行测试

这一步也可能要花很久,这一步不是必须的,只是检查编译完的程序有没有问题

1
$ ./test.py
  1. 运行例程
1
$ ./ns3 run first

如果成功运行可以看到类似如下输出

1
2
3
4
5
6
[0/2] Re-checking globbed directories...
ninja: no work to do.
At time +2s client sent 1024 bytes to 10.1.1.2 port 9
At time +2.00369s server received 1024 bytes from 10.1.1.1 port 49153
At time +2.00369s server sent 1024 bytes to 10.1.1.1 port 49153
At time +2.00737s client received 1024 bytes from 10.1.1.2 port 9

more about build

如果切换了build profile,在重新build之前最好先clean一下。但是实测完整的build需要花二三十分钟,当然这跟处理器性能有关。

1
$ ./ns3 clean

build profile

build有几种profile,debug,default(default好像就是debug),release,optimized。

Feature debug default release optimized
Enabled Features NS3_BUILD_PROFILE_DEBUG NS3_BUILD_PROFILE_DEBUG NS3_BUILD_PROFILE_RELEASE NS3_BUILD_PROFILE_OPTIMIZED
NS_LOG... NS_ASSERT... NS_LOG... NS_ASSERT...
Code Wrapper Macro NS_BUILD_DEBUG(code) NS_BUILD_DEBUG(code) NS_BUILD_RELEASE(code) NS_BUILD_OPTIMIZED(code)
Compiler Flags -Og -g -Os -g -O3 -O3 -march=native -mtune=native

官方也建议在开发的时候先用debug,之后重复跑模拟再用optimized。

Recommended practice is to develop your scenario in debug mode, then conduct repetitive runs (for statistics or changing parameters) in optimized build profile.

1
$ ./ns3 configure --build-profile=debug --enable-examples --enable-tests

可以对不同的profile设置不同的output文件夹,这样的话切换profile不用重新编译所有文件了。

1
2
3
4
5
6
$ ./ns3 configure --build-profile=debug --out=build/debug
$ ./ns3 build
...
$ ./ns3 configure --build-profile=optimized --out=build/optimized
$ ./ns3 build
...

设置简介

主机操作系统是windows 10。使用VMWare workstation虚拟机安装Ubuntu Server 20.04。VS Code安装一些插件,SSH连接到ubuntu虚拟机进行ESP32的开发。VS Code只负责编辑代码,其他操作(创建项目、配置、编译、烧录等)使用ESP-IDF的命令行命令。

参考了B站教程 https://www.bilibili.com/video/BV1eRg7exEcT/

虚拟机安装ubuntu server

开始是用VirtualBox安装ubuntu,结果遇到了网络设置的问题。网络配置好了,又遇到了ESP开发板USB连接电脑后虚拟机不能正常识别的问题。教程里用的是VMWare,本来觉得虚拟机软件应该没多大影响的,还是再试试VMWare吧,结果试了之后发现确实省了不少事……

不过最开始没用VMWare,是因为直接去VMWare官网,都不知道下载的地方在哪,得先在google搜索vmware workstation才能到下载相关的网页,但是下载之前要先注册账号。而VirtualBox进入官网就可以直接下载了。

从官网下载VMWare Workstation

看了下VMWare的历史,也是几经易手,现在是属于Broadcom了。先直接搜索“vmware workstation download”,第一个结果就是,进去之后点击"download fusion or workstation"。Fusion是Mac OS用的,Windows用workstation。
下载workstation要先注册broadcom账号,登录之后在搜索栏里搜索“workstation”就能找到下载的页面了。现在pro版本对个人也已经免费了,直接用pro版就好。

c40427d278147fc980011be21896b98f.png

2cf7d62bbc7aee50f338e1bbae85e69c.png

a5d83828411860886bc32f3ea117eceb.png

Ubuntu下载安装

安装Ubuntu server额教程。主要是注意硬盘空间分配,默认的设置不会利用所有空间,不过如果这里忘了配置后面也有补救的方法。

https://www.cnblogs.com/yeyouqing/articles/17021253.html

ubuntu.22.04-server版详细安装方法安装

搜索“ubuntu server 20.04 LTS”,进入红色框框起来的网页,下载server版本镜像。
ca89458f1485c8b3f43a75bf9839c7f1.png
虚拟机配置如下图所示。处理器数量根据主机实际处理器选择。硬盘空间,我开始选的是20G,因为想着只是用来学习ESP32的,等后面如果要着手做项目了再增加容量。后来发现就算只是用来学习20G也不够用,所以建议30G以上。但是硬盘空间不够不一定是设置里分配的空间不够,而是ubuntu server可能没有把分配的空间全部用上,详见最后一节“可能遇到的问题”。
c8c20d4af30002b03768bd19d24e6d5c.png

安装时记得勾选安装SSH。
456364f94e560b3c7c5768aa6cf298b9.png
不要安装任何更新。
0d03ded083f783b3bb0d690e96d7a1c6.png

查看ubuntu server的IP地址

参考另一篇关于配置VirtualBox中ubuntu网络的博客
241216 VirtualBox 和 ubuntu server 20.04 配置网络

在ubuntu上安装ESP-IDF

参考官方安装教程
https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/linux-macos-setup.html

将idf.py命令永久加入环境变量

虽然官方文档并不推荐这么做,因为这样之后每次启动一个console都会加载idf.py命令环境。对于正常使用linux操作系统来说应该只在需要使用idf.py的时候才载入,不过我们安装这个ubuntu server就只是为了学习esp32的开发,几乎只要打开console就会用到idf,所以加入环境变量正合适。

在home目录下使用ls -al命令可以看到一个隐藏文件.profile。使用任意编辑器修改这个文件,在最后一行加入source esp/esp-idf/export.sh。如果使按着官方文档步骤安装的IDF,那么就是这个路径esp/esp-idf/export.sh,如果安装到了别的文件夹就要改成相应的路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vm@vmwareubserver2004:~$ ls -al
total 64
drwxr-xr-x 10 vm vm 4096 Dec 18 12:42 .
drwxr-xr-x 3 root root 4096 Dec 16 20:05 ..
-rw------- 1 vm vm 2857 Jan 8 17:39 .bash_history
-rw-r--r-- 1 vm vm 220 Feb 25 2020 .bash_logout
-rw-r--r-- 1 vm vm 3771 Feb 25 2020 .bashrc
drwx------ 5 vm vm 4096 Dec 16 21:04 .cache
drwxrwxr-x 3 vm vm 4096 Dec 16 21:04 .dotnet
drwxrwxr-x 4 vm vm 4096 Dec 16 20:54 esp
drwxrwxr-x 5 vm vm 4096 Dec 16 20:46 .espressif
drwxrwxr-x 3 vm vm 4096 Dec 17 09:19 .local
drwxrwxr-x 11 vm vm 4096 Jan 8 17:11 myproject
-rw-r--r-- 1 vm vm 839 Dec 17 09:22 .profile
drwx------ 2 vm vm 4096 Dec 17 09:35 .ssh
-rw-r--r-- 1 vm vm 0 Dec 16 20:10 .sudo_as_admin_successful
drwxr-x--- 5 vm vm 4096 Jan 10 14:35 .vscode-server
-rw-rw-r-- 1 vm vm 183 Jan 6 09:19 .wget-hsts
-rw------- 1 vm vm 128 Dec 18 12:42 .Xauthority

保存修改之后新打开一个console,IDF的环境就会生效了。

安装和使用VS Code相关插件

本地插件

  • Remote SSH

remote插件

这里是SSH连接到ubuntu server之后,在ubuntu上安装的VS Code插件

  • C/C++
  • ESP-IDF

ESP-IDF插件本来是需要配置ESP-IDF的安装目录的,但是好像是因为先安装了ESP-IDF,插件自动找到了安装目录,所以插件装好后就可以直接用。

设置Remote SSH插件

安装了Remote SSH插件之后左边栏会有插件图标,点击进入能看到之前连接过的机器。右上角有一个齿轮图标,点击之后可以选择config文件。
d0d5404fe2b9d0d4cc0b7d60a84cd035.png

一般是使用User\<用户名>\ssh\config这个文件。
df86e8c2f12f6303b15da912b0f3bc67.png

打开之后可以添加如下内容。Host可以填虚拟机的名字,HostName填虚拟机的IP地址,User就是ubuntu server的用户名。

1
2
3
Host ubuntu_server_2004
HostName 192.168.183.128
User vm

之后每次连接就会需要输入密码。如果想省略输入密码这一步,可以在虚拟机ubuntu里加入主机的SSH公钥。如何生成一个公钥参考https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

简略的步骤:

  • 在命令行里输入
1
ssh-keygen -t ed25519-sk -C "your_email@example.com"
  • 在windows系统里生成的密钥默认在路径c/Users/YOU/.ssh/id_ALGORITHM
  • 打开以.pub结尾的文件,复制里面的内容
  • 粘贴到ubuntu的~/.ssh/authorized_keys文件里,保存

这样以后再用SSH连接到虚拟机Ubuntu就不用输入密码了。

使用ESP-IDF命令行和VS Code开发项目

https://docs.espressif.com/projects/esp-idf/zh_CN/v5.4/esp32/api-guides/tools/idf-py.html#selecting-idf-target

ESP32,芯片,模组,开发板

在开发项目之前,有几个概念需要搞清楚。参考https://www.bilibili.com/video/BV1tY4y1L7HV

芯片 模组 开发板

  • 芯片就是单独的芯片,不包括无线功能
  • 模组,包括芯片,会加入一些WIFI、蓝牙等无线收发器,存储器等
  • 开发板,模组装在开发板上,加了更多外设,USB、按钮,以及引出IO针脚

芯片、模组、开发板的详细参数,需要根据型号找对应的datasheet,一般很容易就能搜索到。

ESP32系列

“ESP32系列”就是一个单独系列,不包括ESP32-S2系列, ESP32-C3系列, ESP32-S3系列等。但是初学看到“ESP32系列”这个词很容易混淆,以为EPS32系列包含了所有ESP32开头的芯片

以Hello World为例,开发一个ESP32项目的简单流程

首先VS Code使用SSH连接到虚拟机Ubuntu,然后打开命令行。

创建项目

选择或者一个文件夹用来存放创建的项目,比如myproject,然后使用以下命令:
idf.py create-project helloworld

创建成功之后,在VS Code中打开文件夹,然后在弹出的窗口中选择刚创建的文件夹。VS Code就切换到helloworld项目的文件夹了。
1906a5f2210e4818e71c5088b2e795d8.png

9c6cb099f8ade5c5001324c2bcc3a8ab.png

引入IDF源码路径

编程时引用ESP-IDF源码的头文件,VS Code需要知道IDF源码在哪。设置方法:
Crtl + Shift + P,调出VS Code命令框,输入ESP-IDF: Add vscode Configuration Folder

b62a253931e5396835c92a4fe3d3c555.png

在开始编写程序之前先构建一次项目

idf.py build
这一步主要是因为有时候会出现include IDF头文件时报错,先构建一次之后就不会报错了。

Hello world代码

main/helloworld.c中加入如下代码

1
2
3
4
5
6
7
#include <stdio.h>
#include "esp_log.h"

void app_main(void)
{
ESP_LOGI("HelloWorld", "Hello, world!");
}

选择目标芯片

在VS Code中打开命令行,使用命令:
idf.py set-target esp32

如果不执行set-target这一步,构建系统默认使用esp32

配置工程

使用命令:
idf.py menuconfig

命令行里会出现:
36c92aac140d726fee65341dfaafb28c.png
可以设置的参数太多,这里举一些例子。

Flash size

进入Serial flasher config,再进入Flash size,可以设置flash大小。
11d4ff9e3c793b9acc585e8633263835.png

不知道Flash的大小?

我在这遇到了一个问题。我用的模组,从模组上的印刷文字来开,是ESP32-WROVER-IE,但是这个模组根据储存器大小细又分了好几个不同型号,而我并没有更详细的信息。于是抱着试试看的心态,启用了Detect flash size when flashing bootlodaer,发现真的可以用。

ESP PSRAM

我使用的模组还带有PSRAM,想启用PSRAM,需要以下设置:
进入Component Config->ESP PSRAM,选中
c5c4e20e2c744d30df030e3003c0c9b9.png

CPU frequency

默认的频率是160MHz,我的模组最高支持240MHz,通过以下方式修改:
进入Component config->ESP System Settings,再进入CPU frequency就可以修改频率了。
60d8b542ad397702e5eca486757c16da.png

最后记得保存。

构建工程

idf.py build

烧录工程

如果没安装驱动首先需要安装驱动。开发板USB连接到电脑上时,VMWare workstation会弹出一个对话框,让我们选择连接到主机还是虚拟机,我们当然选虚拟机。
不过如果这里选错了,之后也可以更改:
9d0fec0d2fe7306374a370852f9981de.png
连接好之后使用命令:
idf.py flash

以下是输出结果,可以看到Auto-detected Flash size: 8MB,刚才设置的自动检测flash大小生效了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Executing action: flash
Serial port /dev/ttyUSB0
Connecting.....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting.....
Detecting chip type... ESP32
Running ninja in directory /home/vm/myproject/helloworld/build
Executing "ninja flash"...
[1/5] cd /home/vm/myproject/helloworld/build/esp-idf/esptool_py && /home/vm/.espressif/python_env/idf5.2_py...ect/helloworld/build/partition_table/partition-table.bin /home/vm/myproject/helloworld/build/helloworld.bin
helloworld.bin binary size 0x36e60 bytes. Smallest app partition is 0x100000 bytes. 0xc91a0 bytes (79%) free.
[1/1] cd /home/vm/myproject/helloworld/build/bootloader/esp-idf/esptool_py && /home/vm/.espressif/python_en...ck_sizes.py --offset 0x8000 bootloader 0x1000 /home/vm/myproject/helloworld/build/bootloader/bootloader.bin
Bootloader binary size 0x6840 bytes. 0x7c0 bytes (7%) free.
[2/3] cd /home/vm/esp/esp-idf/components/esptool_py && /usr/bin/cmake -D IDF_PATH=/home/vm/esp/esp-idf -D "...ORY=/home/vm/myproject/helloworld/build -P /home/vm/esp/esp-idf/components/esptool_py/run_serial_tool.cmake
esptool.py --chip esp32 -p /dev/ttyUSB0 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader/bootloader.bin 0x10000 helloworld.bin 0x8000 partition_table/partition-table.bin
esptool.py v4.8.1
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32-D0WD-V3 (revision v3.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 10:97:bd:d4:32:b0
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 8MB
Flash will be erased from 0x00001000 to 0x00007fff...
Flash will be erased from 0x00010000 to 0x00046fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash params set to 0x0230
Compressed 26688 bytes to 16308...
Writing at 0x00001000... (100 %)
Wrote 26688 bytes (16308 compressed) at 0x00001000 in 0.8 seconds (effective 278.4 kbit/s)...
Hash of data verified.
Compressed 224864 bytes to 111865...
Writing at 0x00041714... (100 %)
Wrote 224864 bytes (111865 compressed) at 0x00010000 in 2.6 seconds (effective 682.9 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.1 seconds (effective 419.6 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Done

打开IDF监视器

idf.py monitor

输出如下。可以看到I (190) esp_psram: Found 8MB PSRAM device,检测到了8MB的PSRAM。
I (1234) HelloWorld: Hello, world!代码里的Hello World也成功打印出来了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Executing action: monitor
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting....
Detecting chip type... ESP32
Running idf_monitor in directory /home/vm/myproject/helloworld
Executing "/home/vm/.espressif/python_env/idf5.2_py3.8_env/bin/python /home/vm/esp/esp-idf/tools/idf_monitor.py -p /dev/ttyUSB0 -b 115200 --toolchain-prefix xtensa-esp32-elf- --target esp32 --revision 0 /home/vm/myproject/helloworld/build/helloworld.elf -m '/home/vm/.espressif/python_env/idf5.2_py3.8_env/bin/python' '/home/vm/esp/esp-idf/tools/idf.py'"...
--- esp-idf-monitor 1.5.0 on /dev/ttyUSB0 115200
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:7172
load:0x40078000,len:15540
load:0x40080400,len:4
--- 0x40080400: _init at ??:?

ho 8 tail 4 room 4
load:0x40080404,len:3904
entry 0x40080640
I (31) boot: ESP-IDF v5.2.3 2nd stage bootloader
I (31) boot: compile time Jan 10 2025 17:05:00
I (31) boot: Multicore bootloader
I (35) boot: chip revision: v3.0
I (39) boot.esp32: SPI Speed : 40MHz
I (44) boot.esp32: SPI Mode : DIO
I (48) boot.esp32: SPI Flash Size : 8MB
I (53) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (62) boot: ## Label Usage Type ST Offset Length
I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (77) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (84) boot: 2 factory factory app 00 00 00010000 00100000
I (92) boot: End of partition table
I (96) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=0d814h ( 55316) map
I (116) esp_image: segment 1: paddr=0001d83c vaddr=3ffb0000 size=022a0h ( 8864) load
I (118) esp_image: segment 2: paddr=0001fae4 vaddr=40080000 size=00534h ( 1332) load
I (124) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=17204h ( 94724) map
I (151) esp_image: segment 4: paddr=0003722c vaddr=40080534 size=0fc24h ( 64548) load
I (176) boot: Loaded app from partition at offset 0x10000
I (176) boot: Disabling RNG early entropy source...
I (187) cpu_start: Multicore app
I (188) quad_psram: This chip is ESP32-D0WD
I (190) esp_psram: Found 8MB PSRAM device
I (190) esp_psram: Speed: 40MHz
I (194) esp_psram: PSRAM initialized, cache is in low/high (2-core) mode.
W (201) esp_psram: Virtual address not enough for PSRAM, map as much as we can. 4MB is mapped
I (1116) esp_psram: SPI SRAM memory test OK
I (1124) cpu_start: Pro cpu start user code
I (1124) cpu_start: cpu freq: 240000000 Hz
I (1124) cpu_start: Application information:
I (1127) cpu_start: Project name: helloworld
I (1132) cpu_start: App version: 1
I (1137) cpu_start: Compile time: Jan 10 2025 17:04:43
I (1143) cpu_start: ELF file SHA256: 729bcc1d8...
I (1148) cpu_start: ESP-IDF: v5.2.3
I (1153) cpu_start: Min chip rev: v0.0
I (1158) cpu_start: Max chip rev: v3.99
I (1163) cpu_start: Chip rev: v3.0
I (1168) heap_init: Initializing. RAM available for dynamic allocation:
I (1175) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (1181) heap_init: At 3FFB2BE0 len 0002D420 (181 KiB): DRAM
I (1188) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (1194) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1201) heap_init: At 40090158 len 0000FEA8 (63 KiB): IRAM
I (1207) esp_psram: Adding pool of 4096K of PSRAM memory to heap allocator
I (1216) spi_flash: detected chip: generic
I (1219) spi_flash: flash io: dio
I (1224) main_task: Started on CPU0
I (1234) esp_psram: Reserving pool of 32K of internal memory for DMA/internal allocations
I (1234) main_task: Calling app_main()
I (1234) HelloWorld: Hello, world!
I (1244) main_task: Returned from app_main()

配置过程中可能遇到的问题

Ubuntu硬盘空间不够

Ubuntu可能没有使用所有的硬盘空间
https://www.moralok.com/2023/06/24/Ubuntu-server-20-04-not-all-disk-space-was-allocated-after-installation/

烧录时提示Could not open /dev/ttyUSB*

出现这个错误的时候命令行里也有提示怎么做,使用这个命令
sudo usermod -aG dialout <usrname>,其中username需要替换成我们在ubuntu使用的用户名。

看小红书上很多帖子是从国内申请法国签证,从比利时这申请的也搜到了一篇,不过那一篇里申请的应该是学生签证,PhD申请的签证种类不太一样,那么我也分享一下从比利时申请法国PhD的签证经历。

时间线:

  • 10月9号收到Convention d’Accueil,当天在网上提交了签证申请
  • 10月14号早上去布鲁塞尔法国领事馆递签
  • 10月17号收到签证通过邮件
  • 10月30号下午去领事馆贴签

需要的申请材料:

  • Pre-requisites
    • A travel document, issued less than 10 years ago, containing at least two blank pages, with a period of validity at least 3 months longer than the date on which you intend to leave the Schengen Area or, in the case of a long stay, at least three months longer than the expiry date of the visa requested. Be sure to transmit (scan) ALL PAGES of your travel document containing visas, entry and exit stamps or any other inscription.
    • ID photograph.
    • If you are not a national of your country of residence: proof that you are legally resident in that country (e.g. residence permit).
    • If you have an official travel document, a note verbale is required.
  • Purpose of travel/stay
    • Agreement to host a researcher or teacher-researcher issued by an accredited organization.
    • Diploma of a Master’s degree or higher.

要提交的文件并不多,护照,照片,协议,硕士学位证书。这里面“Agreement to host a researcher”对我来说就是实验室给的“Convention d’Accueil”


下面是详细的经历,可能有些啰嗦……

9月30号收到zrr审核通过的结果之后,就开始准备申请法国签证了。法国签证申请有一个官方网站(france-visas.gouv.fr),用起来还挺方便的。从“Do I need a visa?”这里开始,填上自己的信息,最后就能看到需要提交哪些材料申请签证。
不过在选择签证类型的时候有点不确定,就发邮件问了下领事馆,得到的答复是,如果有“Convention d’Accueil”,那就要申请“Talent Passport, Scientist - Researcher/Talent”。

2024-11-03 21_59_59-inquiry visa type.png

2024-11-03 22_02_46-Visa wizard - France-Visas supporting documents.png

到10月9号收了实验室发来的Convention d’Accueil。但是我在整个申请过程中正好搬了次家,而且就拿到convention一周多以前去市政厅更新了地址,于是我的地址就跟convention里的不一样了。
毕竟申请签证还是个挺严肃的事情,我怕会有什么问题,就同时发邮件问了实验室和领事馆,没想到实验室那边很快就给我回信帮我改了文件里的地址,必须好评。

当天就在网上填完了签证申请表单然后提交了。网上提交了是一回事,线下提交申请文件还需要单独预约时间。一开始预约到了10月16号,后来12号偶然看预约系统里放出来了14号的空位,于是马上就预约了14号的,取消了16号的。
这个预约系统也挺好用的,可以同时预定多个时间,取消好像也没限制,所以其实可以先预定着,等拿到文件就能马上去递签了。

17号登录签证网站上看的时候发现申请状态已经变成“your passport is ready to be collected.”。不会这么快吧,我也没有收到领事馆的邮件啊。不过还是发邮件问了下,过了一会就收到了签证通过的邮件。但是!要等到30号才能去拿签证。

2024-11-03 21_45_49-Re_ La délivrance de votre visa - Yandi Liu - Outlook — Mozilla Firefox.png

30号下午两点半不到我就去了领事馆。到了门口,办事员就直接问我是来领签证的吗,我还什么都没说,她就说领签证要等到三点半。如果能发表情我当时应该脑子上都是问号。我给她看了邮件上说是两点半过来领签证,她还是说是的是的三点半来领,有点无语。
还好,后面正好又来了个人领签证,那个人把护照交给了办事员,我马上明白了,赶紧跟她说,我护照还没给你们,怎么领签证啊……

之后要等一个小时,没事做,去旁边布鲁塞尔公园坐了一会晒太阳,学学多邻国法语。
Anyway,最后是顺利拿到了签证。

法国PhD申请,zrr通过经历

背景:南科大CS本,KU Leuven CS硕,比利时工作两年
申请项目:CNRS的funding,thesis是做无线传感器网络能效优化,会涉及一些AI的应用
实验室地点:法国中南部乡下
时间线:8月29号下午收到大学的ZRR申请邮件通知;30号提交了申请;9月30号收到通过的结果

之前在小红书上看了很多关于法国的PhD安全审查的负面消息,所以也很担心,不过最后还是过了,可能是因为学校和实验室都没什么名气吧(

2024-11-03 20_10_27-Re_ ZRR - Accès Avis favorable sur la demande d'accès en ZRR n°2024_306 - Yand.png

[ɛ]

1. e在闭音节中

  • fermage
  • rester
  • Germaine
  • travers
  • alerter
  • connecter

2. e在两个相同辅音字母之前

  • messe
  • elle
  • belle
  • cette
  • celle
  • tinette

3. ê, è, ë

  • même
  • tête
  • dès
  • père
  • Noël
  • Joëlle

4. et在词末

  • paquet
  • ticket
  • sommet
  • buffet
  • cadet
  • navet

ei

  • neige
  • Seine
  • seize
  • peine
  • reine
  • freiner

[e]

1. é

  • épée
  • été
  • fatigué
  • café
  • fumée
  • échapper

2. er, ez在词末

  • créer
  • quitter
  • cacher
  • habitez
  • nez
  • réfléchissez

3. es结尾的单音节词

  • les
  • ces
  • des
  • mes

4. dess, ess, eff在词首

  • dessiner
  • dessert
  • essai
  • essette
  • effet
  • effacé

[ə]

1. e在单音节词词末

  • ce
  • me
  • le
  • je
  • se
  • de

2. e在词首开音节

  • repas
  • venir
  • petite
  • semer
  • recette
  • repos

3. e在“辅辅e辅”结构中

辅指辅音音素,e指字母

  • partenaire
  • mercredi
  • vendredi
  • appartement

不发音

e在词末

没有任音符的e

  • gare
  • Chine
  • latine
  • seize
  • inutile
  • archive

e在元音前或后

元音指元音音素

  • Jeanne
  • remerciement
  • gaiement

e在“元辅e辅元”结构中

元、辅都指元音音素、辅音音素,e指字母e

  • Catherine
  • samedi

[a]

少数词中 e + mm, nn

  • femme
  • solennel
0%