Ubuntu20.04上软件安装笔记

1.opencv

  • (1)安装依赖
1
>> apt install -y libgtk-3-dev ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev libtbb-dev libopenblas-dev libatlas-base-dev liblapack-dev
  • (2)源码安装:默认根目录在/root/software
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
# 1.下载源码
>> wget https://github.com/opencv/opencv/archive/refs/tags/3.4.20.zip
# 2.解压源码
>> unzip 3.4.20.zip
# 3.重命名
>> mv opencv-3.4.20 opencv
# 4.下载contrib模块
>> wget https://github.com/opencv/opencv_contrib/archive/refs/tags/3.4.20.zip
>> unzip 3.4.20.zip && mv opencv_contrib-3.4.20 opencv_contrib
# 5.编译
>> cd opencv && mkdir build
>> cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_JASPER=OFF \
-DBUILD_OPENEXR=OFF \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PROTOBUF=OFF \
-DBUILD_opencv_apps=OFF \
-DBUILD_opencv_dnn=OFF \
-DBUILD_opencv_ml=OFF \
-DBUILD_opencv_python_bindings_generator=OFF \
-DENABLE_CXX11=ON \
-DENABLE_FAST_MATH=ON \
-DWITH_EIGEN=ON \
-DWITH_FFMPEG=ON \
-DWITH_TBB=ON \
-DWITH_OPENMP=ON \
-DOPENCV_EXTRA_MODULES_PATH=/root/software/opencv_contrib/modules \
..
>> make -j 18 && make install
# 6.添加环境变量
>> vim /etc/ld.so.conf.d/opencv.conf
/usr/local/lib
# 7.更新系统动态库链接缓存
>> ldconfig

2.pangolin

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
# 1.安装依赖项
>> apt install -y libglew-dev
# 2.下载源码
>> git clone https://github.com/stevenlovegrove/Pangolin.git && cd Pangolin && git checkout eab3d3449a33a042b1ee7225e1b8b593b1b21e3e
# 3.编译安装
>> mkdir build && cd build
>> cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_EXAMPLES=OFF \
-DBUILD_PANGOLIN_DEPTHSENSE=OFF \
-DBUILD_PANGOLIN_FFMPEG=OFF \
-DBUILD_PANGOLIN_LIBDC1394=OFF \
-DBUILD_PANGOLIN_LIBJPEG=OFF \
-DBUILD_PANGOLIN_LIBOPENEXR=OFF \
-DBUILD_PANGOLIN_LIBPNG=OFF \
-DBUILD_PANGOLIN_LIBTIFF=OFF \
-DBUILD_PANGOLIN_LIBUVC=OFF \
-DBUILD_PANGOLIN_LZ4=OFF \
-DBUILD_PANGOLIN_OPENNI=OFF \
-DBUILD_PANGOLIN_OPENNI2=OFF \
-DBUILD_PANGOLIN_PLEORA=OFF \
-DBUILD_PANGOLIN_PYTHON=OFF \
-DBUILD_PANGOLIN_TELICAM=OFF \
-DBUILD_PANGOLIN_UVC_MEDIAFOUNDATION=OFF \
-DBUILD_PANGOLIN_V4L=OFF \
-DBUILD_PANGOLIN_ZSTD=OFF \
..
>> make -j 16 && make install
# 4.更新系统动态库链接缓存
>> ldconfig

3.g2o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1.安装依赖
>> apt install -y libatlas-base-dev libsuitesparse-dev
# 2.下载源码
>> git clone https://github.com/RainerKuemmerle/g2o.git && cd g2o && git checkout 20230223_git
# 3.编译安装
>> mkdir build && cd build
>> cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_UNITTESTS=OFF \
-DG2O_USE_CHOLMOD=OFF \
-DG2O_USE_CSPARSE=ON \
-DG2O_USE_OPENGL=OFF \
-DG2O_USE_OPENMP=OFF \
-DG2O_BUILD_APPS=OFF \
-DG2O_BUILD_EXAMPLES=OFF \
-DG2O_BUILD_LINKED_APPS=OFF \
..
>> make -j 16 && make install
# 4.更新系统动态库链接缓存
>> ldconfig

4.cloc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1.工具安装
>> apt -y install cloc
# 2.使用方法: cloc path/to/project
>> cloc ./
346 text files.
322 unique files.
112 files ignored.

github.com/AlDanial/cloc v 1.82 T=0.31 s (772.8 files/s, 376372.4 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 83 3507 2956 85001
C/C++ Header 105 2775 4334 9713
CMake 34 293 437 1624
make 4 820 379 1543
C 2 121 75 539
Bourne Shell 5 153 402 148
Markdown 2 37 0 73
XML 1 0 0 13
-------------------------------------------------------------------------------
SUM: 236 7706 8583 98654
-------------------------------------------------------------------------------

5.hiredis

1
2
3
4
5
6
7
8
9
# 1.下载源码
>> git clone https://github.com/redis/hiredis.git
# 2.编译安装
>> cd hiredis && make -j 16 && make install
# 3.更新系统动态库链接缓存
>> ldconfig
# 4.版本号验证
>> pkg-config --modversion hiredis
1.3.0

6.redis

6.1 redis安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1.安装依赖库
>> apt install -y tcl tcl-dev
# 2.下载源码
>> wget https://download.redis.io/releases/redis-7.2.4.tar.gz
# 3.解压源码
>> tar -zxvf redis-7.2.4.tar.gz && mv redis-7.2.4 redis
# 4.编译及测试
>> cd redis && make -j 16 && make test
# 5.安装到系统路径
>> make PREFIX=/usr/local/redis install
# 6.添加系统环境变量
>> vim ~/.zshrc
export REDIS="/usr/local/redis/bin"
export PATH=$PATH:$REDIS
>> source ~/.zshrc

6.2 redis配置

1
2
3
4
5
6
7
8
9
10
# 1.创建配置文件目录
>> mkdir -p /usr/local/redis/conf
>> mkdir -p /usr/local/redis/data
>> mkdir -p /usr/local/redis/log
# 2.复制并修改配置
>> cp /root/software/redis/redis.conf /usr/local/redis/conf/
# 3.修改配置文件,修改内容见后面的表
>> vim /usr/local/redis/conf/redis.conf
# 4.启动服务
>> redis-server /usr/local/redis/conf/redis.conf

 找到以下配置行,修改为对应值(注释掉的去掉 #,值不对的修改):

配置项 修改后的值 说明
daemonize yes 后台运行 Redis(否则终端关闭后 Redis 停止)
bind 0.0.0.0 允许所有 IP 访问(测试 / 单机场景,生产需改为具体内网 IP)
protected-mode no 关闭保护模式(否则仅本地可访问)
port 6379 Redis 端口(默认 6379,保持不变即可)
dir /usr/local/redis/data Redis 数据存储目录(对应步骤 5.1 创建的目录)
logfile /usr/local/redis/log/redis.log 日志文件路径(方便排查问题)
requirepass your_password (可选)设置 Redis 密码(生产环境必加,测试可省略)

修改完成后,按 Ctrl+O 保存,Ctrl+X 退出 nano。

6.3 redis使用

  • (1)验证启动状态
1
2
3
4
5
6
7
8
# 方式一:查看redis进程
>> ps -ef | grep redis-server
root 183727 174987 0 16:32 ? 00:00:00 redis-server 0.0.0.0:6379
root 183851 174991 0 16:33 pts/11 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox --exclude-dir=.venv --exclude-dir=venv redis-server
# 2.客户端连接测试
>> redis-cli
127.0.0.1:6379> PING
PONG
  • (2)停止redis
1
2
3
4
# 1.未设置密码
>> redis-cli shutdown
# 2.设置了密码
>> redis-cli -a <your_password> shutdown

6.4 redis-cluster配置

6.4.1 主机配置

  • (1) 生成基础配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1.创建文件夹
>> mkdir redis-cluster && cd redis-cluster
# 2.拷贝一份配置文件
>> cp /usr/local/redis/conf/redis.conf ./
# 3.修改配置
>> vim redis.conf
dir .
bind 0.0.0.0
requirepass 123456
protected-mode no
port 8400
pidfile redis-8400.pid
logfile redis-8400.log
cluster-enabled yes
cluster-config-file nodes-8400.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
maxmemory 10g
  • (2) bash批量生成对应配置
1
2
3
4
5
6
7
8
9
for port in 8400 8401 8402 8403 8404 8405; do
cp redis.conf redis-${port}.conf;
if [ $port -ne 8400 ]; then
sed -i "s/8400/${port}/g" redis-${port}.conf;
fi;
/usr/local/redis/bin/redis-server redis-${port}.conf;
done

/usr/local/redis/bin/redis-cli --cluster create 127.0.0.1:8400 127.0.0.1:8401 127.0.0.1:8402 127.0.0.1:8403 127.0.0.1:8404 127.0.0.1:8405 --cluster-replicas 1 -a 123456

 执行后:

1
2
3
4
5
Can I set the above configuration? (type 'yes' to accept): yes
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  • (3) 测试一下
1
2
3
4
5
6
7
8
9
10
11
# 1.登录8400节点
>> redis-cli -c -h 192.168.89.64 -p 8400 -a '123456'
192.168.89.64:8400> set mirror 123
-> Redirected to slot [15439] located at 127.0.0.1:8402
OK
# 2.退出连接后,更换一个节点来获取结果
127.0.0.1:8402> exit
>> redis-cli -c -h 192.168.89.64 -p 8401 -a '123456'
192.168.89.64:8401> get mirror
-> Redirected to slot [15439] located at 127.0.0.1:8402
"123"
  • (4) 停止服务
1
2
3
4
5
6
7
8
for port in 8400 8401 8402 8403 8404 8405; do
redis-cli -c -h 192.168.89.64 -p $port -a '123456' shutdown
done
rm *.log
rm *.pid
rm nodes-*.conf
rm *.rdb
rm -rf appendonlydir

6.4.2 docker部署

  • (1) 创建配置存放路径
1
2
3
4
5
6
7
8
9
# 1.创建资源根目录
>> mkdir redis-cluster && cd redis-cluster && chmod -R 777 ./
# 2.获取路径
>> pwd
/data/project/jingyu/redis-cluster
# 3.创建虚拟网卡
>> docker network create redis-network
# 如果需要删除网卡,可以使用如下命令
>> docker network rm redis-network
  • (2) 生成配置文件

 创建create.sh文件,并将下面内容拷贝进去,并运行:

1
>> chmod +x create.sh && ./create.sh

create.sh文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for port in $(seq 6379 6384); 
do
mkdir -p /data/project/jingyu/redis-cluster/redis/node-${port}/conf
touch /data/project/jingyu/redis-cluster/redis/node-${port}/conf/redis.conf
cat << EOF > /data/project/jingyu/redis-cluster/redis/node-${port}/conf/redis.conf
port ${port}
requirepass 1234
bind 0.0.0.0
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 10.124.132.23
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
EOF
done

 有两个地方需要注意:cluster-announce-ip需要改成你主机的ip,daemonize需要改为no,否则容器内redis后台启动,docker会认为进程已退出,直接触发容器重启。创建文件目录结构如下:

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
>> tree
.
├── create.sh
├── redis
│   ├── node-6379
│   │   ├── conf
│   │   │   └── redis.conf
│   │   └── data
│   │   ├── appendonlydir [error opening dir]
│   │   └── nodes.conf
│   ├── node-6380
│   │   ├── conf
│   │   │   └── redis.conf
│   │   └── data
│   │   ├── appendonlydir [error opening dir]
│   │   └── nodes.conf
│   ├── node-6381
│   │   ├── conf
│   │   │   └── redis.conf
│   │   └── data
│   │   ├── appendonlydir [error opening dir]
│   │   └── nodes.conf
│   ├── node-6382
│   │   ├── conf
│   │   │   └── redis.conf
│   │   └── data
│   │   ├── appendonlydir [error opening dir]
│   │   └── nodes.conf
│   ├── node-6383
│   │   ├── conf
│   │   │   └── redis.conf
│   │   └── data
│   │   ├── appendonlydir [error opening dir]
│   │   └── nodes.conf
│   └── node-6384
│   ├── conf
│   │   └── redis.conf
│   └── data
│   ├── appendonlydir [error opening dir]
│   └── nodes.conf
  • (3) 启动对应节点

 创建start.sh脚本文件,并运行:

1
>> chmod +x start.sh && ./start.sh

start.sh文件内容如下:

1
2
3
4
5
6
7
8
for port in $(seq 6379 6384); \
do \
docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
--privileged=true -v /data/project/jingyu/redis-cluster/redis/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--privileged=true -v /data/project/jingyu/redis-cluster/redis/node-${port}/data:/data \
--restart always --name redis-${port} --net redis-network \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
done

 注意挂载路径和你创建的路径保持一致

  • (4) 创建集群
1
2
3
4
# 1.进入容器
>> docker exec -it redis-6379 bash
# 2.创建集群
>> redis-cli -a 1234 --cluster create 10.124.132.23:6379 10.124.132.23:6380 10.124.132.23:6381 10.124.132.23:6382 10.124.132.23:6383 10.124.132.23:6384 --cluster-replicas 1

6.4.3 docker多机部署

 和前面不同,虚拟网卡仅存在于单台 Docker宿主机内部,不同机器上的容器无法通过该网桥互相通信,这时可以使用宿主机网络Host模式:现在假设需要在两台主机上部署6个节点,每台机器上需要部署3个节点:

  • (1) 创建网络配置
1
2
3
4
5
6
7
8
9
# 1.创建配置存放路径:
>> mkdir redis-cluster && cd redis-cluster && chmod -R 777 ./
# 2.获取配置存放根目录,方便后续映射路径
>> pwd
/data/project/jingyu/redis-cluster
# 3.创建脚本
>> vim create.sh && chmod +x create.sh
# 4.生成配置
>> ./create.sh

create.sh脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for port in $(seq 6379 6381); 
do
mkdir -p /data/project/jingyu/redis-cluster/redis/node-${port}/conf
touch /data/project/jingyu/redis-cluster/redis/node-${port}/conf/redis.conf
cat << EOF > /data/project/jingyu/redis-cluster/redis/node-${port}/conf/redis.conf
port ${port}
requirepass 1234
bind 0.0.0.0
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 10.124.132.23
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
EOF
done
  • (2) 启动三个节点
1
2
3
4
# 1.创建脚本
>> vim start.sh && chmod +x start.sh
# 2.启动节点
>> ./start.sh

start.sh脚本内容如下:

1
2
3
4
5
6
7
8
for port in $(seq 6379 6381); \
do \
docker run -it -d \
--privileged=true -v /data/project/jingyu/redis-cluster/redis/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--privileged=true -v /data/project/jingyu/redis-cluster/redis/node-${port}/data:/data \
--restart always --name redis-${port} --net host \
redis redis-server /usr/local/etc/redis/redis.conf
done

 由于使用host模式,这里无需做port映射。

  • (3) 同样的方式在另外一台服务器上启动三个节点
  • (4) 创建集群
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
# 1.进入容器
>> docker exec -it redis-6379 bash
# 2.创建集群
>> redis-cli -a 1234 --cluster create 10.124.132.23:6379 10.124.132.23:6380 10.124.132.23:6381 10.124.132.16:6379 10.124.132.16:6380 10.124.132.16:6381 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.124.132.16:6381 to 10.124.132.23:6379
Adding replica 10.124.132.23:6381 to 10.124.132.16:6379
Adding replica 10.124.132.16:6380 to 10.124.132.23:6380
M: a79eeb4564c564b93043e6a2b3187f931bf1f11f 10.124.132.23:6379
slots:[0-5460] (5461 slots) master
M: 32945c041c174632c5d448143fc440da91a67e5a 10.124.132.23:6380
slots:[10923-16383] (5461 slots) master
S: 345e489c0aa0e84644ffb853b0bb6381a92872c4 10.124.132.23:6381
replicates 6cbf25f8f3de92b6a135bc0caf2daf5192858979
M: 6cbf25f8f3de92b6a135bc0caf2daf5192858979 10.124.132.16:6379
slots:[5461-10922] (5462 slots) master
S: 1c834fb401e8a1fe4fd5273731224088c915e9c7 10.124.132.16:6380
replicates 32945c041c174632c5d448143fc440da91a67e5a
S: 1c295466bf89a355b6f9455600e04e15ea9a651e 10.124.132.16:6381
replicates a79eeb4564c564b93043e6a2b3187f931bf1f11f
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 10.124.132.23:6379)
M: a79eeb4564c564b93043e6a2b3187f931bf1f11f 10.124.132.23:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 1c834fb401e8a1fe4fd5273731224088c915e9c7 10.124.132.16:6380
slots: (0 slots) slave
replicates 32945c041c174632c5d448143fc440da91a67e5a
M: 6cbf25f8f3de92b6a135bc0caf2daf5192858979 10.124.132.16:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 1c295466bf89a355b6f9455600e04e15ea9a651e 10.124.132.16:6381
slots: (0 slots) slave
replicates a79eeb4564c564b93043e6a2b3187f931bf1f11f
M: 32945c041c174632c5d448143fc440da91a67e5a 10.124.132.23:6380
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 345e489c0aa0e84644ffb853b0bb6381a92872c4 10.124.132.23:6381
slots: (0 slots) slave
replicates 6cbf25f8f3de92b6a135bc0caf2daf5192858979
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 这样就成功了。

  • (5) 验证集群
1
2
3
4
5
6
7
8
>> redis-cli -c -h 10.124.132.23 -p 6379 -a 1234
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.124.132.23:6379> set mirror cjy
-> Redirected to slot [15439] located at 10.124.132.23:6380
OK
10.124.132.23:6379> get mirror
-> Redirected to slot [15439] located at 10.124.132.23:6380
"cjy"

7.mysql

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
# 1.拉取镜像
>> docker pull mysql:8.0
# 2.挂载数据卷
>> docker volume create mysql-data
# 3.启动容器
>> docker run -d \
--name mysql \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_ROOT_HOST=% \
-e TZ=Asia/Shanghai \
--restart=always \
mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# 4.进入mysql
>> docker exec -it mysql bash
# 容器内登录MySQL,输入之前设置的密码
>> mysql -uroot -p
# 5.创建一个表
mysql> CREATE DATABASE IF NOT EXISTS dev_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.03 sec)
# 6.查看所有数据库
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| dev_db |
| information_schema |
| mysql |
| performance_schema |
| sys |
| webdb |
+--------------------+
6 rows in set (0.00 sec)
# 7.指定数据库
mysql> USE dev_db;
# 8.创建表格
mysql> DROP TABLE IF EXISTS `user`;
mysql> CREATE TABLE `user` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户唯一主键,自增',
`username` VARCHAR(64) NOT NULL COMMENT '用户名,唯一',
`password` VARCHAR(128) NOT NULL COMMENT 'crypt加密后的密码(SHA-512加密后约94位,留余量)',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间,默认当前时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间,自动更新',
`is_deleted` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删,1-已删',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_username` (`username`) USING BTREE COMMENT '用户名唯一索引,防止重复注册',
KEY `idx_create_time` (`create_time`) USING BTREE COMMENT '创建时间索引,方便按时间查询'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户信息表';