Ubuntu 20.04 部署笔记

一键 dd 脚本

脚本内容及安全性笔者不作保证,请自行判断

https://github.com/fcurrk/reinstall/tree/master

apt 换源

如果服务器在国内,可以考虑换源,下面是清华源 

https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
sudo vim /etc/apt/sources.list

替换文件内容为以下内容

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse

# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

apt 二连

sudo apt-get update
sudo apt-get upgrade

配置 ssh

开启防爆破

wget --no-check-certificate https://raw.githubusercontent.com/FunctionClub/Fail2ban/master/fail2ban.sh && bash fail2ban.sh 2>&1 | tee fail2ban.log

常用命令

# 查看运行状态
systemctl status fail2ban
fail2ban-client
# 查看封禁ip
cat /etc/fail2ban/jail.local
fail2ban-client status ssh-iptables

调整超时设置

sudo vim /etc/ssh/sshd_config

在末尾添加(ssh 客户端设置定时发送哑命令即可保持连接)

TCPKeepAlive yes
ClientAliveInterval 600
ClientAliveCountMax 3

重启sshd

systemctl reload sshd
systemctl restart sshd

开启 bbr

Ubuntu20.04 已经支持 bbr ,不用再打补丁了

vim /etc/sysctl.conf

在文件末尾添加

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

使变更生效

sysctl -p

检查以下命令返回值中是否含有 bbr 或者 fq

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
lsmod | grep bbr

开启 ufw

sudo apt-get install ufw
ln -s /usr/sbin/ufw /usr/bin/ufw
ufw start
ufw enable

常用命令,需要自行放行需要的端口

# 添加开放端口
ufw allow 22
# 删除开放端口
ufw delete 22
# 查看端口状态
ufw status

安装搜狗输入法

桌面版的话可以装,服务器就不用了,安装过程挺反人类的,官网说明也不是很清晰

https://shurufa.sogou.com/linux/guide

先安装依赖库

sudo apt install fcitx-bin fcitx-table libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2 libgsettings-qt1

下载后安装(替换为对应文件名)

dpkg -i sogoupinyin_4.2.1.145_amd64.deb

设置 - 区域和语言 - 管理已安装的语言 - 键盘输入法系统,设置为 fcitx ,然后点击应用到整个系统

设置 fcitx 为开机启动

sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/

删除自带的 ibus (不必须)

sudo apt purge ibus

解决 Mac 键盘兼容问题后重启

echo options hid_apple fnmode=2 | sudo tee -a /etc/modprobe.d/hid_apple.conf
sudo update-initramfs -u -k all
reboot

 右上角点击输入法图标,点击配置,如果没有搜狗输入法点击左下角添加,有的话可以上移顺序,其他的输入法不需要的话可以删除

如果重启后总是无法打开,可以尝试 

# 方法1
右上角点击输入法图标,点击重新启动
# 方法2
killall fcitx
fcitx

挂载硬盘

查看硬盘挂载路径(任一即可)

lsblk -f
sudo lshw -c disk

确认路径后格式化硬盘(任一即可),下面以/dev/sda为例

sudo mkfs -t ext4 /dev/sda
sudo mkfs.ext4 /dev/sda

查看硬盘的 uuid 

blkid

设置开机自动挂载

sudo gedit /etc/fstab

先创建挂载文件夹,按需修改文件夹所有权

sudo mkdir /挂载路径/

添加以下内容,uuid 不需要带引号

UUID=硬盘标识符 /挂载路径/ ext4 defaults 0 0

不重启的话先手动挂载

mount -a

查看是否挂载成功,如果/dev/sda所在行的挂载点为上面设置的挂载路径且容量显示正确则正确挂载

df -h

安装 Anaconda3

安装依赖包

sudo apt install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6

获取安装脚本,脚本文件可能很大,网络不好的话可以下载好再传到服务器上

https://www.anaconda.com/download#downloads

也可以复制链接地址在服务器直接下载当前最新脚本

wget https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh

一路确认完成安装

bash ./Anaconda3-2023.07-2-Linux-x86_64.sh

更新bash环境

source ~/.bashrc

系统自带的是 python3.8 ,占用了软链 python3 ,为了避免修改导致的问题,链接到 python 上,当然其他名字也是可以的(后面安装其他服务时可能会覆盖这个软链)

ln -s /root/anaconda3/bin/python /usr/bin/python

如果想管理多个版本,可以用这个命令链接,最后的数字为优先级

update-alternatives --install /usr/bin/python python /root/anaconda3/bin/python 1

调整使用的版本可以用下面命令

update-alternatives --config python

查看 python 路径和版本

# linux 限定
whereis python
python -V
# 用 python 命令查看
python -c "import sys; print(sys.executable)"
python -c "import sys; print(sys.version)"

如果 pip 无法使用则启用 pip

python -m ensurepip

同理,国内可以考虑换源,下为清华源

https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
python -m pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

安装 uWSGI

最后一个包的版本号根据实际情况调整

sudo apt-get install gcc build-essential python-dev
conda install uwsgi

安装 NGINX

centos 下 yum 安装的 nginx 还不支持 ssl ,需要自己编译, debian 直接装就好了

sudo apt-get install nginx

编辑配置文件,添加 HTTP server 和 HTTPS server 部分,ssl 证书路径需根据实际路径填写,其他部分可以按需更改

vim /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 1024;
	# multi_accept on;
}

http {
	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 120;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;
	
	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;

	# HTTP server
	server {
		listen	        80;
		server_name     localhost;
		rewrite ^(.*)$  https://$host$1 permanent;

		location / {
			root   html;
			index  index.html index.htm;
		}
	}

	# HTTPS server
	server {
		listen	     443 ssl;
		server_name  localhost;

		ssl_certificate      /root/cert/cloudflare.pem;
		ssl_certificate_key  /root/cert/cloudflare.key;

		ssl_session_cache    shared:SSL:10m;
		ssl_session_timeout  10m;

		ssl_ciphers    ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		ssl_protocols  TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
		ssl_prefer_server_ciphers  on;


		location / {
			include     uwsgi_params;
			uwsgi_pass  127.0.0.1:8000;
			root        html;
			index       index.html index.htm;
		}
	}
}


#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#	server {
#		listen	 localhost:110;
#		protocol   pop3;
#		proxy	  on;
#	}
# 
#	server {
#		listen	 localhost:143;
#		protocol   imap;
#		proxy	  on;
#	}
#}

检查格式是否正确

nginx -t

重启服务命令

nginx -s reload

配置 supervisor

sudo apt-get install supervisor

编辑配置文件,添加 [inet_http_server] 部分可以开启网页监控,其他部分可以不修改

vim /etc/supervisor/supervisord.conf

查看代码

[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

[supervisord]
logfile=/var/log/supervisor/supervisord.log
childlogdir=/var/log/supervisor
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
silent=false
minfds=1024
minprocs=200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[include]
files = /etc/supervisor/conf.d/*.conf

[inet_http_server]
port=0.0.0.0:9001
username=xxxx
password=xxxx

重启服务并设置开机自启

systemctl start supervisor
systemctl enable supervisor

挂载 uWSGI ,相关字段含义可以自行查询,文件夹路径为 /etc/supervisord.d/*.ini

[program:supervisor_uwsgi]
stdout_logfile=/root/log/supervisor_uwsgi.log
command=/root/anaconda3/bin/uwsgi --ini /root/flask/uwsgi.ini
user=root
autostart=true
autorestart=true
redirect_stderr=true
startsecs=10
stopasgroup=true
killasgroup=true

重新加载任务

supervisorctl reload

配置logrotate

vim /etc/logrotate.d/my_rotate

路径可以同时有多个,每行一个

/root/log/supervisor_uwsgi.log
{
    daily
    copytruncate
    rotate 60
    dateext
    dateformat -%Y-%m-%d
    missingok
    notifempty
    nocompress
    postrotate
    endscript
}

修改 logrotate 命令为强制执行

vim /etc/cron.daily/logrotate
#!/bin/sh

# skip in favour of systemd timer
if [ -d /run/systemd/system ]; then
    exit 0
fi

# this cronjob persists removals (but not purges)
if [ ! -x /usr/sbin/logrotate ]; then
    exit 0
fi

/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit $EXITVALUE

安装mysql8.0

sudo apt-get install mysql-server-8.0

如果需要关闭大小写敏感,需要先配置一次,因为 8.0 后安装完成就无法修改配置了,因此需要重新初始化一次

systemctl stop mysql
rm -rf /var/lib/mysql/*

/etc/mysql/mysql.conf.d[mysqld]范围内添加lower_case_table_names=1(默认文件的话在末尾添加即可),然后初始化

mysqld --initialize --user=mysql --lower_case_table_names=1

启动服务并设置开机启动

systemctl start mysql
systemctl enable mysql

获取临时密码

grep 'temporary password' /var/log/mysql/error.log

登录后修改密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

查看是否修改成功

mysql> show global variables like '%lower_case%';

备份和导入数据库

# 备份全部数据库
mysqldump -uroot -p --all-databases > /路径/名字.sql
# 导入全部数据库(进入 mysql 操作)
source /路径/名字.sql

# 备份指定数据库
mysqldump -uroot -p 数据库名 > /路径/名字.sql
# 导入到指定数据库(进入 mysql 操作)
create database 数据库名; # 如果不存在的话创建一个
use 数据库名
source /路径/名字.sql

安装 redis

sudo apt install redis-server

开启密码和远程访问,取消注释 requirepass 和 bind 所在行,如果要远程访问需要改为 0.0.0.0

vim /etc/redis/redis.conf

重启服务并设置开机自启

systemctl restart redis
systemctl enable redis

安装 docker

sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装portainer,原装命令里还映射了 8000 端口,但不启用似乎也问题不大

docker volume create portainer_data
docker run -d -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

常用命令(有 portainer 了的话用 GUI 多好呢)

# 查看容器状态
docker ps -a
# 启动容器
docker start 容器名
# 停止容器
docker stop 容器名
# 删除容器(先停止)
docker container rm 容器名

安装 git

sudo apt-get install git git-lfs

生成密钥

ssh-keygen -t rsa -b 4096 -C "备注"

初始化用户名和邮箱

git config --global user.name "用户名"
git config --global user.email "邮箱"

配置 crontab

crontab -e

每行一个任务,下面为每日指定时间和间隔一定时间执行任务的范例

minute hour day month dayofweek command
5      1    *   *     *         your_command
*/5    *    *   *     *         your_command    

如果想在输出到的日志文件名中加入日期,则可以添加以下内容到末尾

>> /path_to_log/$(date +"\%Y-\%m-\%d").log 2>&1

如果需要打开 crontab 服务的日志,将下面文件中的cron.* /var/log/cron.log所在行的注释去掉

sudo vim /etc/rsyslog.d/50-default.conf

重启服务

sudo service rsyslog restart
sudo service cron restart

如果执行的是 python 脚本的话,建议先 cd 到目录然后执行,并且含有中文时需要在文件第一行指定字符集

# -*- coding: utf-8 -*

安装 NVidia 驱动

sudo gedit /etc/default/grub

修改 grub 添加 nomodeset

grub_cmdline_linux_default="quiet splash nomodeset"

更新 grub

sudo update-grub

禁用 nouveau

sudo gedit /etc/modprobe.d/blacklist.conf 

在末尾添加

blacklist nouveau
options nouveau modeset=0

更新后重启

sudo update-initramfs -u
reboot

查看是否有 nouveau 输出,无输出则修改成功

lsmod | grep nouveau

查看显卡型号

lspci -k | grep -A 2 -i "VGA" 

查看是否已安装驱动

nvidia-smi

若已安装驱动,想卸载重新安装则先查看安装方式

sudo apt list --installed|grep -i nvidia
sudo apt list --installed|grep -i cuda

如果有 apt 安装的可以直接用 apt 卸载

sudo apt-get purge "*nvidia*" "*cuda*"

dpkg 能查看到也可以用对应命令卸载

dpkg -l|grep -i nvidia
sudo dpkg -P xxxx

/usr/local/下删除 cuda 相关文件夹,如

rm -rf /usr/local/cuda-11.4

可以再通过 apt 安装,先搜索最新的驱动版本

aptitude search nvidia-driver-

然后安装当前最新版本如

sudo apt-get install nvidia-driver-535

也可以到官网下载 run 安装

https://www.nvidia.com/download/index.aspx

下载后安装(替换为对应文件名)

sudo bash ./NVIDIA-Linux-x86_64-535.104.05.run

这种安装方式的卸载命令为

sudo /usr/bin/nvidia-uninstall
sudo /usr/local/cuda/bin/cuda-uninstaller

安装 CUDA

如果要安装其他版本 cuda ,需先安装 nvidia 驱动,然后用上述命令卸载当前 cuda (不卸载似乎也可以),然后到官网下载 run 安装包,以 11.4 为例

https://developer.nvidia.com/cuda-11-4-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=runfile_local

下载后安装(替换为对应文件名)

sudo bash ./cuda_11.4.0_470.42.01_linux.run

取消勾选驱动(否则会有各种奇怪的问题出现),选择 Install 安装

添加环境

sudo vim ~/.bashrc

末尾添加(替换为对应文件夹)

export PATH=/usr/local/cuda-11.4/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH

 加载环境

source ~/.bashrc

添加到编译环境(替换为对应文件夹)

sudo mkdir /opt/compiler
sudo ln -s /usr/local/cuda-11.4 /opt/compiler/cuda-11.4

查看 cuda 版本(显示的版本为 runtime 版本,和 nvidia-smi 显示的不一样,具体的可以自行度娘)

nvcc -V

下载 cudnn ,需要注册,版本根据需要选择(如 tf 指定了版本),cudnn 只是加速的功能,因此不安装也是能用 cuda 的

https://developer.nvidia.com/rdp/cudnn-download

下载压缩包版 Local Installer for Linux x86_64 (Tar) 手动安装,解压后进入文件夹,复制库文件到对应目录即可(替换为对应文件夹)

sudo cp include/* /usr/local/cuda-11.4/include
sudo cp lib/* /usr/local/cuda-11.4/lib64

切换到独显(感觉不是必要的)

sudo apt-get install nvidia-prime
sudo prime-select nvidia

实时查看显卡使用情况

watch -n 1 nvidia-smi

安装 AMD 驱动

AMD 同样也可以直接通过 apt 安装

sudo apt-get install amdgpu-install

下面为手动安装,但因为没有 cuda 的限制,直接装最新的即可(除非需要指定版本)

https://www.amd.com/en/support/linux-drivers

进入下载页面,在 21.40 版本之后下载的是 deb 包,和 apt 方式没有太大区别了

安装 amdgpu-install

sudo dpkg -i amdgpu-install_5.5.50503-1_all.deb

安装驱动

amdgpu-install

Boot Repair

安装显卡驱动什么的折腾出问题起不来了大概率是 grub 或什么出问题了,官方镜像做个启动盘临时启动后修复一下即可(高级选项勾选重建 grub )

sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt update
sudo apt install -y boot-repair && boot-repair

开启 Coredump

查看是否开启

ulimit -c

如果返回值是 0 则未开启,执行命令开启,执行后再检查,如果返回 unlimited 则已开启,但仅对当前会话生效

ulimit -c unlimited

查看生成路径和文件名格式,如果以 | 开头则是执行命令而非直接生成文件,改为想要存储的路径

echo '/path/to/your/corefiles/core.%e.%p' | sudo tee /proc/sys/kernel/core_pattern

如果想永久生效,可以修改以下文件

sudo vim /etc/security/limits.conf

添加一行,重启后生效 

*                 soft    core    unlimited

  

安装 Brew

sudo apt install build-essential procps curl file git
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
(echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/py/.bashrc
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"

 

 常用命令

# 查看时区
timedatectl status
# 修改时区为东八区
sudo timedatectl set-timezone Asia/Shanghai

# 搜索软件包(sudo apt-get install aptitude)
aptitude search 软件包名
# 查看已安装软件包
sudo apt list --installed 软件包名

# 打开当前文件夹(GUI)
nautilus .
# 查找文件
find 路径 -name 文件名
# 查看文件占用空间
sudo du -sh ./*

# 查看服务状态
chkconfig --list | grep -i 服务名
# 删除相关服务
chkconfig --del | grep -i 服务名

# 查看公网 IP
curl icanhazip.com
# 查看端口占用
sudo netstat -lnp|grep -i 端口号
# 监听端口流量
sudo tcpdump -i 接口号 -n -v port 端口号
# SSH 转发
ssh -p [portB] -L [portA]:[addressC]:[portC] [userB]@[addressB]
A>> ssh -p [portA] [userC]@[localhost]

# 查看进程 pid
ps -ef | grep -i 进程名
# 用 pid 杀死进程
kill -9 进程pid
# 用进程名杀死进程
kill -9 $(pidof 进程名)

 

 

感谢

# anaconda - Installing on Linux
https://docs.anaconda.com/free/anaconda/install/linux/
# nginx优化——包括https、keepalive等
https://lanjingling.github.io/2016/06/11/nginx-https-keepalived-youhua/
# 如何在Linux主机上使用Cloudflare和Nginx配置托管网站
https://www.qxwa.com/how-to-configure-a-hosted-website-on-linux-hosting-with-cloudflare-and-nginx.html
# Nginx日志配置详解
https://segmentfault.com/a/1190000013377493
# How to install MySQL 8.0 with lower_case_table_names=1 on Ubuntu Server 20.04 LTS successfully?
https://askubuntu.com/questions/1261422/how-to-install-mysql-8-0-with-lower-case-table-names-1-on-ubuntu-server-20-04-lt
# Documentation doesn't seem to explain why port 8000 is needed to be published
https://github.com/portainer/portainer-docs/issues/91
# 迷之 crontab 异常:不运行、不报错、无日志
https://cloud.tencent.com/developer/article/1096971
# 卸载GPU驱动
https://help.aliyun.com/document_detail/163825.html

 

posted @ 2023-09-04 16:40  Pyrokine  阅读(204)  评论(0编辑  收藏  举报