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