netplan#001#编译安装

Ubuntu通过netplan来配置网卡,为了研究netplan的使用方法和实现原理,我们首先通过编译安装的方法,重新定制netplan。
本文记录编译netplan的方法。

安装依赖

netplan有众多的依赖,成功安装依赖是重中之重。在编译netplan之前,请读者按如下方法安装所有依赖。

首先,安装基本软件包以及开发库

1
2
3
$ sudo apt install -y meson make gcc
$ sudo apt install -y python3-pip
$ sudo apt install -y libglib2.0-dev libyaml-dev libsystemd-dev libcmocka-dev

然后,安装必要的Python模块 pytest

使用如下命令安装pytest:

1
2
3
$ pip3 install pytest
$ echo 'export PATH="/home/mancode/.local/bin:$PATH"' >> ~/.bashrc
$ ln -s /home/mancode/.local/bin/pytest /home/mancode/.local/bin/pytest3

命令执行过程如下图所示:

然后,安装必要的Python模块 coverage

使用如下命令安装coverage:

1
2
$ pip3 install coverage
$ ln -s /home/mancode/.local/bin/coverage /home/mancode/.local/bin/coverage-3

命令执行过程如下图所示:

编译安装

为了研究netplan最终安装了哪些可用文件,我们将文件安装到指定目录 /home/mancode/apps/netplan ,这样利于我们研究生成的文件。

首先,修改Makefile,修改内容如下图所示:

然后,开始编译,使用如下命令:

1
$ make

然后,编译成功之后,使用如下命令安装文件到 /home/mancode/apps/netplan 目录:

1
$ make DESTDIR=/home/mancode/apps/netplan install

最后,安装成功之后,我们看下最终文件目录结构:

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
mancode@manos:~/apps/netplan$ tree .
.
├── include
│   └── netplan
│   ├── netdef.h
│   ├── netplan.h
│   ├── parse.h
│   ├── parse-nm.h
│   ├── state.h
│   ├── types.h
│   └── util.h
├── lib
│   ├── python3
│   │   └── dist-packages
│   │   └── netplan
│   │   ├── __init__.py
│   │   ├── netdef.py
│   │   ├── _netplan_cffi.cpython-310-x86_64-linux-gnu.so
│   │   ├── parser.py
│   │   ├── state.py
│   │   └── _utils.py
│   ├── systemd
│   │   └── system-generators
│   │   └── netplan -> ../../../libexec/netplan/generate
│   └── x86_64-linux-gnu
│   ├── libnetplan.so -> libnetplan.so.1
│   ├── libnetplan.so.1
│   └── pkgconfig
│   └── netplan.pc
├── libexec
│   └── netplan
│   ├── generate
│   └── netplan-dbus
├── sbin
│   └── netplan -> ../share/netplan/netplan.script
├── share
│   ├── dbus-1
│   │   ├── system.d
│   │   │   └── io.netplan.Netplan.conf
│   │   └── system-services
│   │   └── io.netplan.Netplan.service
│   ├── doc
│   │   └── netplan
│   │   └── examples
│   │   ├── bonding_router.yaml
│   │   ├── bonding.yaml
│   │   ├── bridge_vlan.yaml
│   │   ├── bridge.yaml
│   │   ├── dhcp_wired8021x.yaml
│   │   ├── dhcp.yaml
│   │   ├── direct_connect_gateway_ipv6.yaml
│   │   ├── direct_connect_gateway.yaml
│   │   ├── dummy-devices.yaml
│   │   ├── infiniband.yaml
│   │   ├── ipv6_tunnel.yaml
│   │   ├── loopback_interface.yaml
│   │   ├── modem.yaml
│   │   ├── network_manager.yaml
│   │   ├── offload.yaml
│   │   ├── openvswitch.yaml
│   │   ├── route_metric.yaml
│   │   ├── source_routing.yaml
│   │   ├── sriov_vlan.yaml
│   │   ├── sriov.yaml
│   │   ├── static_multiaddress.yaml
│   │   ├── static_singlenic_multiip_multigateway.yaml
│   │   ├── static.yaml
│   │   ├── virtual-ethernet.yaml
│   │   ├── vlan.yaml
│   │   ├── vrf.yaml
│   │   ├── vxlan.yaml
│   │   ├── windows_dhcp_server.yaml
│   │   ├── wireguard.yaml
│   │   ├── wireless_adhoc.yaml
│   │   ├── wireless_wpa3.yaml
│   │   ├── wireless.yaml
│   │   ├── wpa3_enterprise.yaml
│   │   └── wpa_enterprise.yaml
│   └── netplan
│   ├── netplan_cli
│   │   ├── cli
│   │   │   ├── commands
│   │   │   │   ├── apply.py
│   │   │   │   ├── generate.py
│   │   │   │   ├── get.py
│   │   │   │   ├── info.py
│   │   │   │   ├── __init__.py
│   │   │   │   ├── ip.py
│   │   │   │   ├── migrate.py
│   │   │   │   ├── set.py
│   │   │   │   ├── sriov_rebind.py
│   │   │   │   ├── status.py
│   │   │   │   └── try_command.py
│   │   │   ├── core.py
│   │   │   ├── __init__.py
│   │   │   ├── ovs.py
│   │   │   ├── sriov.py
│   │   │   ├── state_diff.py
│   │   │   ├── state.py
│   │   │   └── utils.py
│   │   ├── configmanager.py
│   │   ├── _features.py
│   │   ├── __init__.py
│   │   └── terminal.py
│   └── netplan.script
└── usr
└── share
└── bash-completion
└── completions
└── netplan

28 directories, 80 files
mancode@manos:~/apps/netplan$

错误

1
2
3
4
5
6
7
8
9
mancode@manos:~/objs/netplan-1.0$ make
meson compile -C _build --verbose

ERROR: Current directory is not a meson build directory: `/home/mancode/objs/netplan-1.0/_build`.
Please specify a valid build dir or change the working directory to it.
It is also possible that the build directory was generated with an old
meson version. Please regenerate it in this case.
make: *** [Makefile:7: default] Error 1
mancode@manos:~/objs/netplan-1.0$

解决方法:先执行make clean,然后再make即可解决。