文章目录

  • 1. 安装操作系统
  • 2. 登录后
    • 2.1 修改 root 用户密码
    • 2.2 vim
    • 2.3 OpenSSH
    • 2.3 更新
      • 2.3.1 选择软件源
      • 2.3.2 更新
    • 2.4 挂载硬盘
  • 3. 必备软件安装
    • 3.1 git
    • 3.2 zsh 和 oh my zsh
    • 3.3 其他软件
      • 3.3.1 KDiff3
  • 4. 常见问题
    • 4.1 dhcp 更新 ip
    • 4.2 Connecting to raw.githubusercontent.com failed
    • 4.3 GnuTLS recv error (-110): The TLS connection was non-properly terminated
    • 4.4 执行shell脚本可能遇到与预期不符的情况
    • 4.5 合上笔记本盖子导致系统休眠
  • 5. 环境搭建
    • 5.1 编程语言
      • 5.1.1 C/C++
      • 5.1.2 Golang
      • 5.1.3 Python
    • 5.2 源码编译
      • 5.2.1 OpenSSL
      • 5.2.2 Nginx
      • 5.2.3 RPC 环境
        • 5.2.3.1 Golang 语言 protobuf + gRPC
          • 5.2.3.1.1 protobuf
          • 5.2.3.1.2 protocol 编译器的 Go 扩展
          • 5.2.3.1.3 获取 grpc-go 代码
        • 5.2.3.2 C 语言 protobuf + protobuf-c + protobuf-c-rpc
    • 5.3 虚拟化环境
      • 5.3.1 Docker
        • 5.3.1.1 安装 Docker
        • 5.3.1.2 在 Linux 上安装后的优化步骤
          • 以非 root 用户身份管理 Docker
      • 5.3.2 kvm
  • 6. 配置
    • 6.1 环境变量设置

1. 安装操作系统

Ubuntu 22.04 LTS
安装过程可参考 CentOS/RHEL:Linux就该这么学-第1章 动手部署一台Linux操作系统

2. 登录后

2.1 修改 root 用户密码

$ passwd root

测试用的虚拟机,我喜欢将密码改回123,以免忘记

2.2 vim

  1. 安装

    • Ubuntu

      $ apt install vim
      

      如果报错:

      正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。
      

      可能是因为系统正在更新其他程序,等更新完。。。

  2. 配置
    修改 vim 的配置文件 ~/.vimrc:

    set number
    syntax on
    set tabstop=4
    set shiftwidth=4
    

2.3 OpenSSH

  1. 安装

    $ apt install openssh-server
    $ systemctl start ssh
    

    CentOS-7-x86_64-Minimal 好像已经包含 OpenSSH 了

  2. 配置

    Port 22
    PermitRootLogin yes
    PubkeyAuthentication yes
    AuthorizedKeysFile      .ssh/authorized_keys
    PasswordAuthentication yes
    
    • Port:设置 sshd 服务的监听端口
    • PermitRootLogin:允许 root 用户登录
    • PasswordAuthentication:使用账号密码方式登录

2.3 更新

2.3.1 选择软件源

  • 清华源清华大学开源软件镜像站 - Ubuntu 镜像使用帮助

  • 阿里源阿里云官方镜像站

  • 中科大镜像说明

2.3.2 更新

  1. 更新本地数据库

    $ apt update
    
  2. 更新所有已安装的包
    $ apt upgrade
    
  3. 自动移除不需要的包
    $ apt autoremove
    

2.4 挂载硬盘

Ubuntu挂载硬盘

3. 必备软件安装

3.1 git

  1. 安装

    $ apt install git
    
  2. 用户设置

    $ git config --global user.name "renz2048"
    $ git config --global user.email "191162792@qq.com"
    
  3. 创建 SSH Key

    $ ssh-keygen -t rsa -C "191162792@qq.com"
    

    也可以使用固定的 SSH key,将以及添加到 Github或者GitLab 的 SSH key拷贝到 ~/.ssh/目录下

3.2 zsh 和 oh my zsh

个人觉得 oh my zsh 很好用,因此放在必备软件中
安装过程参考:https://github.com/ohmyzsh/ohmyzsh#getting-started

  1. 查看内置的shell:cat /etc/shells,如果列表中没有 zsh,需要安装:

    $ apt install zsh
    
  2. 将 zsh 设置为系统默认 shell:

    $ chsh -s /bin/zsh
    
  3. 退出用户并重新登录

  4. 查看是否修改成功:echo $SHELL,成功则显示 /bin/zsh

  5. 安装 oh-my-zsh:

    $ sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"# 或者也可以选择手动安装
    $ git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh
    $ cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
    
  6. 插件安装

    • autojump:(本人未使用)

    • zsh-autosuggestions:键入命令时的历史命令建议
      克隆仓库到 ~/.oh-my-zsh/custom/plugins

      $ git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
      

      打开 ~/.zshrc 文件,将扩展名添加到 Oh My Zsh 的扩展列表(不要删除原有扩展项)

      plugins=( [plugins...] zsh-autosuggestions)
      
    • zsh-syntax-highlighting:命令行语法高亮
      克隆仓库到 ~/.oh-my-zsh/custom/plugins

      $ git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
      

      打开 ~/.zshrc 文件,将扩展名添加到 Oh My Zsh 的扩展列表(不要删除原有扩展项)

      plugins=( [plugins...] zsh-syntax-highlighting)
      

3.3 其他软件

$ apt install unzip automake libtool

3.3.1 KDiff3

代码合并工具

  1. 安装

    • ubuntu

      $ apt install kdiff3
      
    • centos(推测,未实验过)

      $ yum install kdiff3
      
  2. 配置

    git config --global --add merge.tool kdiff3
    git config --global --add mergetool.kdiff3.path "/usr/bin/diff3"
    git config --global --add mergetool.kdiff3.trustExitCode falsegit config --global --add diff.guitool kdiff3
    git config --global --add difftool.kdiff3.path "/usr/bin/diff3"
    git config --global --add difftool.kdiff3.trustExitCode false
    
  3. 使用

    # 将某个文件的当前版本和代码库中的版本做比较
    git difftool main.c# 将某个文件的当前版本,和某个分支中这个文件的版本做比较
    git difftool some-branch script.js# 将两个tag中的某个文件做比较
    git difftool tag1..tag2 style.css# 比较两个分支
    git difftool branch1 branch2
    

4. 常见问题

4.1 dhcp 更新 ip

如果使用 ip a 看到网卡状态为 up,并可以看到 mac 地址等信息,但是没有 ip 地址,可以使用下面命令从 DHCP 服务器重新获取:

$ dhclient ens33

4.2 Connecting to raw.githubusercontent.com failed

问题背景:

Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 0.0.0.0, ::
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|0.0.0.0|:443... failed: Connection refused.
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|::|:443... failed: Connection refused.

据说是 github 的一些域名的 DNS 解析被污染,导致 DNS 解析过程无法通过域名取得正确的IP地址。

解决方法:

打开 https://www.ipaddress.com/ 输入访问不了的域名,查到 raw.githubusercontent.com

Q: What IP addresses does raw.githubusercontent.com resolve to?

A: raw.githubusercontent.com resolves to 4 IPv4 addresses and 4 IPv6 addresses:

  • 185.199.108.133
  • 185.199.109.133
  • 185.199.110.133
  • 185.199.111.133
  • 2606:50c0:8000::154
  • 2606:50c0:8001::154
  • 2606:50c0:8002::154
  • 2606:50c0:8003::154

根据查到的ip地址,在 /etc/hosts 文件添加一行:

185.199.108.133 raw.githubusercontent.com

4.3 GnuTLS recv error (-110): The TLS connection was non-properly terminated

问题背景:

fatal: unable to access 'https://github.com/ohmyzsh/ohmyzsh.git/': GnuTLS recv error (-110): The TLS connection was non-properly terminated.
/root
Error: git clone of oh-my-zsh repo failed

报错无法使用TLS,需要安装 apt-transport-https

解决方法:

看网上有很多教程教关闭 TLS 验证,emmm…

$ apt install apt-transport-https

4.4 执行shell脚本可能遇到与预期不符的情况

异常情况:

  • let: not found
  • 大小判断失败

这些是由于 Ubuntu 默认使用 /bin/dash 解释器(阉割版 bash,例如不支持 let 和 i++ 功能)

禁止dash可以解决这个问题:

sudo dpkg-reconfigure dash

选择 no,禁用 dash

4.5 合上笔记本盖子导致系统休眠

编辑文件 /etc/systemd/logind.conf,设置 HandleLidSwitch 参数为 ignore,即:

HandleLidSwitch=ignore

5. 环境搭建

5.1 编程语言

5.1.1 C/C++

  • ubuntu

    GNU 编译工具集 和 cgdb 调式工具

    $ apt install build-essential cgdb
    
  • centos

    Development Tools 包组包含 GCC 编译器以及编译软件涉及的其他库和实用程序:

    $ yum group install "Development Tools"
    

    安装 GNU/Linux 开发手册:

    $ yum install man-pages
    

5.1.2 Golang

参考:Download and install

  1. 下载(省略)

  2. 安装

    解压下载的归档文件到 /usr/local

    如果之前已经安装过,需要删除 /usr/local/go 中的文件

    $ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.1.linux-amd64.tar.gz
    

    添加 /usr/local/go/bin 到环境变量 PATH 中:

    # 编辑 `~/.zshrc` 文件,可能可以设置 /etc/zshenv
    export PATH=$PATH:/usr/local/go/bin
    

    执行 source ~/.zshrc

    验证 go version

  3. 设置 go 代理(参考 Goproxy.cn)

    $ echo "export GO111MODULE=on" >> ~/.zshrc
    $ echo "export GOPROXY=https://goproxy.cn" >> ~/.zshrc
    $ source ~/.zshrc
    
  4. vscode

    习惯于使用 vscode 的 remote系列插件,因此我的 Go 插件都安装在 vscode 服务端

    $ go get -v golang.org/x/tools/gopls
    $ go get -v github.com/ramya-rao-a/go-outline
    $ go get -v golang.org/x/tools/cmd/goimports
    

    后来发现这些都可以在 vscode 上点击 install all 全部安装。

5.1.3 Python

[TODO]

5.2 源码编译

准备工作目录

$ cd ~
$ mkdir work
$ cd work

5.2.1 OpenSSL

不同版本的 openssl 编译参数略有不同

  1. 下载源码

    • OpenSSL 1.1.1

      $ git clone --branch OpenSSL_1_1_1-stable git@github.com:openssl/openssl.git
      $ cd openssl
      
    • OpenSSL 1.0.2

      $ git clone --branch OpenSSL_1_0_2-stable git@github.com:openssl/openssl.git
      $ cd openssl
      
  2. config 配置

    • OpenSSL 1.1.1

      $ ./config \
      --prefix=/usr/local \
      --libdir=lib \
      --openssldir=/usr/local/ssl \
      -DOPENSSL_TLS_SECURITY_LEVEL=2 \
      enable-ec_nistp_64_gcc_128 \
      '-Wl,-rpath,$(LIBRPATH)' \
      --debug
      
    • OpenSSL 1.0.2

      $ ./config \
      --prefix=/usr/local \
      --openssldir=/usr/local/ssl \
      enable-ec_nistp_64_gcc_128 \
      '-Wl,-rpath,$(LIBRPATH)'
      
    • 配置参数:

      • --prefix 安装目录,Unix 和 linux 下默认为 /usr/local。为避免与系统提供的版本冲突,也可以设置为 /opt/openssl

      • --openssldir=/usr/local/ssl OpenSSL 配置文件的目录,也作为默认证书和 key store 目录。默认值为 /usr/local/ssl

      • no-shared 强制静态链接,并制作自包含的命令行工具

        如果没有使用这个参数,则将为 libcrypto 和 libssl 编译为动态库(一般命名为 libcrypto.so.1.1、libssl.so.1.1),使用命令行工具和库时需添加 LD_LIBRARY_PATH=/opt/openssl/lib 参数。

        libcrypto 库和 libssl 库作为两个经常被使用的库,编译成动态库更省空间,以后进行替换升级也比较放方便。

      • no-asm 不使用汇编代码,用于调式、查找问题的时候,生产环境建议不开启该选项。

      • enable-ec_nistp_64_gcc_128

      • --debug 编译后的 OpenSSL 包含调试符号,零优化。(OpenSSL 1.0.2 没有这个选项,使用 -g -O0 来禁止编译时优化)

  3. 编译

    $ make && make install
    
  4. 环境变量配置

    配置文件在 bash 中对应 /etc/profile; 在 zsh 中对应 ~/.zshrc

    $ vim ~/.zshrc
    

    添加内容如下:

    ## 动态库搜索路径:程序加载运行期间查找动态链接库
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
    ## 静态库搜索路径:程序编译期间查找静态链接库时指定查找共享库的路径
    export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
    ## 执行程序搜索路径
    # export PATH=$PATH:/usr/local/bin
    ## c 程序头文件搜索路径
    export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include
    ## c++ 程序头文件搜索路径
    export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include
    

    保存后执行

    $ source ~/.zshrc
    
  5. man 手册

    如果 prefix 配置在 man 手册默认找不到的位置,则需要修改 /etc/man_db.conf 文件,并添加一行:

    MANDATORY_MANPATH           /usr/local/ssl/share/man
    
  6. 使用 OpenSSL 头文件

    由于安装目录的原因可能会出现找不到 OpenSSL 头文件的情况,可以通过在编译的时候指定头文件的位置来解决:

    • 使用 C_INCLUDE_PATH

      $ C_INCLUDE_PATH=/usr/local/ssl/include gcc -fPIC -o rpc_engine.o -c rpc_engine.c
      
    • 使用 -I
      $ gcc -fPIC -o rpc_engine.o -c rpc_engine.c -I/usr/local/ssl/include
      
  7. 使用 OpenSSL 库

    • 使用 -L

      $ gcc -shared -o rpc_engine.so -lcrypto rpc_engine.o -L/opt/openssl/lib
      

5.2.2 Nginx

[TODO]

5.2.3 RPC 环境

5.2.3.1 Golang 语言 protobuf + gRPC

5.2.3.1.1 protobuf

选择 protobuf 发布版本 下载 protoc-3.18.0-linux-x86_64.zip

解压:

$ unzip protoc-3.18.0-linux-x86_64.zip -d $HOME/.local

更新 PATH 环境变量:

$ export PATH="$PATH:$HOME/.local/bin"

验证 protoc --version

5.2.3.1.2 protocol 编译器的 Go 扩展

安装:

$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1

更新 PATH 环境变量:

$ export PATH="$PATH:$(go env GOPATH)/bin"
5.2.3.1.3 获取 grpc-go 代码
git clone git@github.com:grpc/grpc-go.git

运行 grpc-go/examples/helloworld 下的示例程序:

$ go run greeter_server/main.go# 在另一个终端运行 client
$ go run greeter_client/main.go
Greeting: Hello world

5.2.3.2 C 语言 protobuf + protobuf-c + protobuf-c-rpc

5.3 虚拟化环境

5.3.1 Docker

5.3.1.1 安装 Docker

卸载旧版本:

$ sudo apt remove docker docker-engine docker.io containerd runc

设置仓库

  1. 允许 apt 通过 HTTPS 访问软件库:

    $ sudo apt update
    $ sudo apt install \ca-certificates \curl \gnupg \lsb-release
    
  2. 添加 Docker 的官方 GPG 密钥:

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
  3. 设置 apt 仓库:

    echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

安装 Docker Engine

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

运行 hello-world 镜像

$ sudo docker run hello-world

5.3.1.2 在 Linux 上安装后的优化步骤

以非 root 用户身份管理 Docker

创建 docker 组,并添加用户

  1. 创建 docker

    $ sudo groupadd docker
    
  2. 将用户添加到 docker

    $ sudo usermod -aG docker $USER
    
  3. 退出当前用户并重新登录,如果是在虚拟机环境,需要重启虚拟机。

设置 Docker 开机启动

$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service

5.3.2 kvm

安装 kvm

$ sudo apt install qemu-kvm libvirt-daemon bridge-utils virtinst libvirt-daemon-system

安装虚拟机管理工具

$ sudo apt install virt-top libguestfs-tools libosinfo-bin  qemu-system virt-manager

安装 vhost_net 模块

sudo modprobe vhost_net

查看安装模块是否启用:

$ renzheng@ubuntu22:~$ lsmod | grep vhost
vhost_net              32768  0
vhost                  53248  1 vhost_net
vhost_iotlb            16384  1 vhost
tap                    24576  1 vhost_net

创建网桥
参考 Netplan configuration examples - Configuring network bridges
编辑 netplan 配置文件 /etc/netplan/01-network-manager-all.yaml 如下:

# Let NetworkManager manage all devices on this system
network:version: 2renderer: NetworkManagerethernets:enp0s31f6:dhcp4: nobridges:br0:dhcp4: yesinterfaces:- enp0s31f6

应用netplan修改:

$ sudo netplan apply

6. 配置

6.1 环境变量设置

  • 如果使用 zsh,则可以在 ~/.zshrc/etc/zshenv 中设置 PATH 的值
  • 如果使用 bash,则可以在~/.profile/etc/profile.d/下设置 PATH 的值

after Ubuntu 22.04 LTS相关推荐

  1. Ubuntu 22.04 LTS apt-get update 报 Key is stored in legacy trusted.gpg keyring 警告解决方案

    背景介绍 在 Ubuntu 22.04 LTS 下更新源 apt-get update 遇到了Key is stored in legacy trusted.gpg keyring (/etc/apt ...

  2. Ubuntu 22.04 LTS 是史诗级的版本?

    导读 Canonical 最新的代号为"Jammy Jellyfish"的 Ubuntu LTS 版本,受到全球用户的好评.有数百个新的小功能和一些不太大众化的功能并没有引起太多关 ...

  3. Ubuntu 22.04 LTS 现在可供下载

    现在可以从Ubuntu 网站下载Ubuntu 22.04 LTS. Ubuntu 22.04 进行了大量改进,包括新的水平工作区切换器和应用程序启动器.新的 UI 强调色.开箱即用的 RDP 支持和L ...

  4. 如何安装 Ubuntu 22.04 LTS 桌面版 ?

    Canonical 在 2022年4月21日发布了期待已久的 Ubuntu 22.04 LTS 桌面操作系统.Ubuntu 22.04 的代号是 Jammy Jellyfish,它是一个 LTS (长 ...

  5. 为什么说 Ubuntu 22.04 LTS 是史诗级的版本

    下面是 Ubuntu 22.04 LTS 的一些次要特性,这些特性使它成为迄今为止最好的 LTS 版本之一. Canonical 最新的代号为"Jammy Jellyfish"的 ...

  6. Ubuntu 22.04 LTS 中文桌面/服务器正式版发布 (内含 ISO 镜像下载)

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 迫不及待地想尝试 Ubuntu 22.04 LTS?现在,它终于可以下载和升级了. 该版本在之前的 LTS 版本基 ...

  7. 双系统安装ubuntu 22.04 LTS(一步到位)

    作为一个拥有两次都是一次成功安装好双系统的经验的人,我觉得我可以借这个文章仔细讲述一下,让大家都可以双系统安装都是一次成功.为什么有着两次安装经验呢,第一次安装完成后由于电脑的内存不太够了,然后重新装 ...

  8. ubuntu 22.04 lts 安装步骤(vmware)

    ubuntu 22.04 lts 安装步骤(vmware) ubuntu 22.04 lts 安装步骤(vmware) 下载镜像 安装步骤 创建虚拟机 安装 ubuntu 22.04 lts 配置 u ...

  9. Ubuntu 22.04 LTS下安装1030 GPU 的驱动(图文详解)

    文章目录 Ubuntu 22.04 LTS下安装1030 GPU 的驱动 法一:命令获取推荐驱动直接安装(简单有效) 1.检查你的操作系统,如下图: 2.查看是否有[GPU](https://so.c ...

  10. Ubuntu 22.04 LTS安装Modelsim SE 2020.4

    前言 教程中的部分内容参考自易特创芯论坛,鉴于论坛相关资料有些零散.安装步骤繁琐或是存在错误.部分原理性问题未解释清楚人云亦云.导致为入门者带来了困难等原因,为此梳理出一篇相对完整的教程 准备工作 · ...

最新文章

  1. qt能使用logback_Spring boot使用logback实现日志配置
  2. MySQL必知必会教程:深入理解MySQL技术内幕
  3. Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-下
  4. 关键词 global 和 nonlocal
  5. mfc 消息消息队列概念_必看入门秘籍——解密原理:消息中间件之RabbitMQ
  6. Python的__getattribute__ vs __getattr__的妙用
  7. 有子对象的派生类的构造函数
  8. .NET 6新特性试用 | 隐式using指令
  9. 嫌学校 App 太“烂”,极客父母做了开源版本,却遭官方报警?
  10. 技术领导者携力为数据中心和其它市场带来开放的加速架构
  11. 【基础教程】基于matlab图像质量评价综述【含Matlab源码 075期】
  12. luoguP4709 信息传递 置换 + 多项式exp
  13. C++字符读入函数(getchgetchar)
  14. hysys动态模拟教程_学习记录-过程模拟实训-Aspen HYSYS教程
  15. CF卡镜像备份及恢复系统
  16. 服务器的垃圾清扫系统指令,怎么用dos命令系统清理垃圾
  17. class balanced loss pytorch 实现
  18. lodop打印html上下居中,lodop打印横向纵向
  19. 人工神经网络课后题答案,人工神经网络原理答案
  20. 7种常见的APPUI界面设计布局风格欣赏

热门文章

  1. SAXParseException;前言中不允许有内容
  2. 性能优化之 线程优化
  3. Android App卡顿慢优化之多线程优化
  4. 项目管理的四大模型,PM必懂的事半功倍模型!
  5. 使用TPOT自动选择scikit-learn机器学习模型和参数
  6. 2023年第三届长三角高校数学建模竞赛】A 题 快递包裹装箱优化问题 详细数学建模过程
  7. 女子支持父亲与丈夫一起变性 三人成闺密
  8. IT日语术语整理(一)
  9. HTML元素的分类及特点,HTML元素的分类
  10. 利用汇编语言实现串口的通讯(一)(BISO调用)