Ubuntu20.04 lts 桌面版 安装
下载地址:https://releases.ubuntu.com/20.04.6/ubuntu-20.04.6-desktop-amd64.iso
一、系统制作与安装
1.U盘制作
使用U盘烧录软件(Rufus),分区类型可选择GPT,目标系统类型选择UEFI。
重启电脑按F2
选择U盘启动,若打印信息的最后一行报错,重启按F12
进入BIOS,security
>secure boot
选择 disable
,F10
保存并退出。
2.硬盘分区
根目录安装软件,要有足够空间
挂载 | 格式 | 类型 | 分区大小 |
---|---|---|---|
efi | efi | 引导分区 | 500MB |
/boot | ext4 | 主分区(gpt可不分) | 1024MB |
/tmp | ext4 | 逻辑 | 5120MB |
/ | ext4 | 逻辑或主分区 | 剩余空间 |
swap | swap | 交换分区 | 8192MB |
将EFI启动分区迁移到另一块硬盘
Ubuntu22.04 将EFI启动分区迁移到另一块硬盘_移动efi分区
问题:efi分区误装到windows下C盘,Ubuntu硬盘的efi空间未使用
现状:Ubuntu硬盘预留有efi空间(exFAT格式),预留 /boot/efi 分区为 /sdb/sdb1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 找到 sdb1 的 UUID
sudo blkid | grep /dev/sdb1
# 在 /etc/fstab 中, 将 /boot/efi 的 UUID 修改为刚才获得的 UUID 值
# ctrl+o 写,ctrl+x 退出
sudo nano /etc/fstab
# 从系统中卸载 /boot/efi, 再重新mount
sudo umount /boot/efi && sudo mount /boot/efi
# 确认 mount 的硬盘分区
lsblk | grep /boot/efi
# 在 sdb (硬盘, 不是分区) 上安装 grub
sudo grub-install /dev/sdb
# 生成 initramfs image
sudo update-initramfs -u -k all
sudo reboot
二、系统配置
1.设置中文语言、中文输入法,保留旧的文件名
1
2
3
4
5
sudo apt update
sudo apt upgrade
sudo passwd root
# 安装vim curl nmap sensors hddtemp
sudo apt install vim
VIM常用快捷键 - markleaf - 博客园 (cnblogs.com)
设置命令行界面为英文
1
vim ~/.bashrc
添加
1
2
export LANGUAGE=en_US
export LANG=en_US.UTF-8
激活
1
source ~/.bashrc
2.配置源
清华源
ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
vim /etc/apt/sources.list
1
2
3
4
5
6
7
# tsinghua
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# 安全更新软件源
deb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
# tsinghua
3.防火墙
1
2
3
4
5
6
7
8
ufw status
ufw enable|disable
ufw allow|deny <port>/<tcp|udp>
ufw allow from <ipaddr>
ufw allow proto <tcp|udp> from <ip>/24 to any port <port>
ufw delete allow|deny <port|...>
4.查看运行的服务
1
2
3
service --status-all
ps -ef | grep xxx
systemctl status xxx
5.传感器监测软件
sensors : 如何在Linux系统中查看CPU温度|极客教程 (geek-docs.com)
hddtemp : hddtemp /dev/sda /dev/sdb
6.GUI开启与关闭
设置系统默认启动目标为多用户模式:
1
2
sudo systemctl set-default multi-user.target
reboot
设置系统默认启动目标为图形模式:
1
2
sudo systemctl set-default graphical.target
reboot
7.系统代理
创建一个脚本文件 /etc/profile.d/proxy.sh
,并添加以下内容:
1
2
3
4
export http_proxy="http://your_proxy:port"
export https_proxy="http://your_proxy:port"
export ftp_proxy="http://your_proxy:port"
export no_proxy="127.0.0.1,localhost"
保存并关闭文件,然后赋予执行权限:
1
sudo chmod +x /etc/profile.d/proxy.sh
激活代理设置:
1
source /etc/profile.d/proxy.sh
三、软件
1.v2raya
v2raya_installer_debian_x64_2.2.5.8.deb
1
sudo dpkg -i installer_debian_x64_2.2.5.8.deb
检测到 geosite.dat, geoip.dat 文件或 v2ray-core 可能未正确安装
检测到 geosite.dat, geoip.dat 文件或 v2ray-core 可能未正确安装 – 爱思考的人 (aisikao.ren)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
wget https://github.com/v2fly/v2ray-core/releases/latest/download/v2ray-linux-64.zip
unzip v2ray-linux-64.zip -d ./v2ray
sudo mkdir -p /usr/local/share/v2ray
sudo cp ./v2ray/*dat /usr/local/share/v2ray
sudo install -Dm755 ./v2ray/v2ray /usr/local/bin/v2ray
# 启动v2raya
sudo v2raya
# 自启动
sudo systemctl enable --now v2raya.service # now为现在就启动
v2raya默认端口2017
2.SSH
https://developer.aliyun.com/article/1488008
1
2
3
4
sudo apt install openssh-server
sudo apt install openssh-client
# 检查 SSH 服务器的状态
sudo systemctl status ssh
配置 SSH 服务器,更改 SSH 服务器的监听端口、允许或禁止密码登录、限制登录用户等。
1
2
3
4
5
6
7
vim /etc/ssh/sshd_config
Port 22 # 端口
PermitRootLogin yes # 禁止root登录
PubkeyAuthentication yes # 密钥认证登录
PasswordAuthentication no # 禁止密码登录,配置好秘钥登陆后再设置
AllowUsers usera,userb # 允许ssh登陆的用户
秘钥登录
远程客户端
1
2
3
ssh-keygen # 生成id_rsa密钥对
cd ~/.ssh;ls
cat id_rsa.pub
复制内容到服务端 ~/.ssh/authorized_keys文件中,检查权限
1
2
chmod 700 .ssh
chmod 644 authorized_keys
防火墙设置
1
2
3
4
5
6
# 检查防火墙状态
sudo ufw status
# 允许 SSH 通过防火墙
sudo ufw allow OpenSSH
# 启用防火墙
sudo ufw enable
3.Tailscale
https://tailscale.com/download/linux
curl -fsSL https://tailscale.com/install.sh | sh
1
2
3
4
5
6
7
# 添加 Tailscale 的包签名密钥和仓库:
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
# 安装 Tailscale:
sudo apt-get update
sudo apt-get install tailscale
1
2
3
4
5
6
# 将您的计算机连接到 Tailscale 网络并在浏览器中进行身份验证:
sudo tailscale up
# 您已连接!您可以通过运行以下命令找到您的 Tailscale IPv4 地址:
tailscale ip -4
# 查看各主机IPv4地址,连接状态,连接方式
tailscale status
Subnets
Subnet routers · Tailscale Docs
Exit-nodes
Exit nodes (route all traffic) · Tailscale Docs
4.ZeroTier
1
curl -s https://install.zerotier.com | sudo bash
1
2
3
sudo zerotier-cli join 9e1xxx436
# 查看当前连接的网络,如果列表中出现网络号说明连接成功
sudo zerotier-cli listnetworks
5.Alist
脚本安装
1
2
3
4
5
6
7
8
# 安装
curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install
# 更新
curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s update
# 卸载
curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s uninstall
systemctl start alist
手动安装
1
2
3
4
5
6
7
8
9
10
# 解压下载的文件,得到可执行文件:
tar -zxvf alist-linux-amd64.tar.gz
# 移动文件到相应目录,授予程序执行权限:(默认安装位置 /opt/alist)
chmod +x alist
# 运行程序
./alist server
# 高于v3.25.0版本
# 手动设置一个密码 `NEW_PASSWORD`是指你需要设置的密码
./alist admin set NEW_PASSWORD
访问Alist默认端口:5244
全局设置
前端隐藏文件:设置
> 全局
> 隐藏文件
1
2
3
/\/README.md/i
/.*\.(nfo|ass|srt|svg|ini|config)/
/.*thumb.jpg/
设置Markdown显示本地图片:在 设置
> 全局
> 自定义头部
增加这段代码即可。
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
<script>
const getCookie = name => (
document.cookie.match(`(^|;)\\s*${name}\\s*=\\s*([^;]+)`)?.pop() ?? ''
);
const fsGet = path => (
fetch('/api/fs/get', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=UTF-8',
'Authorization': localStorage.getItem('token') ?? ''
},
body: JSON.stringify({
path: decodeURIComponent(path),
password: getCookie('browser-password')
})
})
.then(response => response.json())
);
window.addEventListener('error', async event => {
const { target } = event;
if (target.tagName.toUpperCase() !== 'IMG' || 'fix' in target.dataset) return;
const src = target.getAttribute('src');
if (/^(?:[a-z+]+:)?\/\//i.test(src)) return;
const pathname = location.pathname.replace(/\/+$/, '');
const base = await fsGet(pathname);
const url = new URL(src, `${origin}${pathname}${base.data.is_dir ? '/' : ''}`);
const file = await fsGet(url.pathname);
const raw = file.data?.raw_url;
if (!raw) return;
target.src = raw;
target.dataset.fix = '';
}, true);
</script>
索引
Alist如何将数据库由Sqlite3修改为MySQL?-马春杰杰 (machunjie.com)
6.1Panel
一键安装:
1
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
7.Jellyfin
导入 Jellyfin APT 存储库
1
2
3
4
5
6
7
8
9
10
11
# 安装 Jellyfin 媒体服务器的初始软件包
sudo apt install apt-transport-https ca-certificates curl -y
# 导入 Jellyfin Media Server APT 存储库
#入 Jellyfin GPG 密钥:
curl -fsSL https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/jellyfin.gpg > /dev/null
#导入 Jellyfin 存储库:
echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release ) $( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
sudo apt update
安装
1
2
3
sudo apt install jellyfin
systemctl status jellyfin
sudo systemctl enable jellyfin
卸载
1
2
dpkg -l | grep jelly
sudo dpkg --purge jellyfin-xxx
8.Resillo Sync
保姆级教程:在Linux上安装配置Resilio Sync_resilio sync linux-CSDN博客
Installing Sync package on Linux – Resilio Sync
文件同步时会出现问题,一般是权限问题,需要更改文件和文件夹权限、用户组
9.VS Code
VSCode - 使用VSCode远程连接到Linux并实现免密码登录_vscode连接linux-CSDN博客
code-erver
TODO
10.Samba共享
1
2
3
4
5
6
# 安装
sudo apt install samba samba-common
# 添加用户 设置 SMB 密码
sudo smbpasswd -a load
# 修改配置
sudo vim /etc/samba/smb.conf
文件最后添加内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
[share] # 挂载目录名
comment = share folder
browseable = yes
# 实际路径
path = /home/load/bangumi
create mask = 0700
directory mask = 0700
valid users = load
force user = load
force group = load
public = yes
available = yes
writable = no
保存后重启服务
1
sudo service smbd restart
Windows访问
Win+R 或文件管理器输入 \\192.168.0.222
正常显示share
目录
若无法访问,查看服务器防火墙、客户端防火墙(出站规则)、文件夹权限等
11.MySQL
1
2
3
4
5
6
7
8
9
10
sudo apt install mysql-server-8.0
# 设置密码
sudo mysql -uroot -p #无密码直接回车
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
exit
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
sudo systemctl restart mysql
12.雷池WAF
安装
自动安装
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
默认端口9443
升级
在线升级
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/upgrade.sh)"
删除旧版本未使用的镜像,释放磁盘空间
docker image prune --filter="label=maintainer=SafeLine-CE"
safeline-tengine反向代理配置
1
2
3
4
# 检查配置
sudo docker exec safeline-tengine nginx -t
# 更新配置
sudo docker exec safeline-tengine nginx -s reload
goaccess
用于分析nginx产生的access.log文件。
安装:
1
2
3
4
5
6
7
wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt-get update
sudo apt-get install goaccess
编辑配置文件/etc/goacessgoaccess.conf
:
1
2
3
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" "%m" %s %b "%R" "%u"
启动,生成html文件:
1
sudo goacccess /data/safeline/logs/nginx/access.log -o out.html
雷池WAF配置静态文件,方便访问
四、挂载
1.Windows挂载ext4
方式一:安装Paragon ExtFS for Windows
软件,有免费试用期
方式二:WSL挂载
管理员模式启动PowerShell,查询DeviceID:
1
GET-CimInstance -query "SELECT * from Win32_DiskDrive"
挂载:
1
wsl.exe --mount \\.\PHYSICALDRIVE2 --bare
进入WSL系统:
1
2
3
4
lsblk # 查询硬盘分区名
mkdir /data # 创建挂载目录
mount -t ext4 /dev/sdc5 /data
ls /data
卸载:
1
umount /data
1
2
3
4
5
wsl.exe --unmount \\.\PHYSICALDRIVE2
# or
wsl.exe --shutdown
# or
wsl.exe --terminate kali
使用文件管理器移动文件时会产生 *.Identifier
1
find . -name "*.Identifier" -exec rm -r "{}" \;
umount: /data: target is busy.
1
2
3
4
5
6
7
fuser -m /data # 列出正在使用该挂载点的进程
fuser -km /data # 终止这些进程
lsof /data # 显示哪些文件正在被使用
umount -f /data # 强制卸载
umount -l /data # 延迟卸载
2.Ubuntu挂载ntfs
1
2
3
lsblk # 查找到需要挂载的硬盘分区名 nvme0n1p5
sudo fdisk -l | grep nvme0n1p5 # 获取路径
sudo mount -t ntfs /dev/nvme0n1p5 /home/load/ddisk
3.Ubuntu挂载扩容
linux挂载硬盘到home目录下(home目录扩容) - 明矾 - 博客园 (cnblogs.com)
1
2
3
4
5
6
7
8
9
su root
mkdir /mnt/load
mount /dev/sda2 /mnt/load
cp -a /home/load/* /mnt/load/
mv /home/load /home/load.old
rm -rf /home/load/*
umount /dev/sda2
df -h
mkdir /home/load
设置开机挂载
1
2
3
4
5
vim /etc/fstab
# i 添加
/dev/sda2 /home/load ext4 defaults 1 2
# :wq 保存退出
mount -a ; df -h
4.根目录扩容
问题:根目录只分了50G,空间不足,需要将home目录分区合并到根目录分区
sdb4 /根目录,sdb5 /home目录,sdb5紧挨在sdb4右侧可无损扩容
sudo fdisk -l /dev/sdb
查看分区情况,记住 设备、起点、末尾
以root身份执行
- 备份sdb5数据
关闭相关服务、进程,卸载/home下的其他分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#卸载sda3
lsof /dev/sda3 #查看占用分区的进程
kill -9 PID
umount /dev/sda2
#卸载sda2
umount /dev/sda2
#卸载sdb5分区
umount /dev/sdb5
mount /dev/sdb5 /mnt
mv /mnt/* /home
unmount /dev/sdb5
#修改fstab文件,删去/dev/sdb5挂载信息
vim /etc/fstab
- 删除sdb5分区
MBR使用fdisk,GPT使用gdisk
1
2
3
4
5
6
gdisk /dev/sdb
:? #显示帮助
:p #打印分区信息
:d #删除指定分区
:5 #分区号
:w #保存
- 扩容是sdb4分区
1
2
3
4
5
6
7
8
gdisk /dev/sdb
:d #删除sdb4分区(未w保存,数据不会消失、程序仍正常运行)
:4
:n #添加sdb4分区
:4
:直接回车 #设置起点扇区,与原sdb4起点相同
:直接回车、输入扇区值、+10G指定空间大小 #末尾扇区,小于sdb6起点
:w #保存
- 刷新
1
partprobe -s
重启:修改根目录时必须
使用resize2fs重新定义文件系统大小(这步一定要做,要不然容量不会有变化)
1
2
resize2fs /dev/sdb4
fdisk -l /dev/sdb
五、公网访问
1.ipv6申请域名
https://dynv6.com 邮箱注册,使用梯子验证邮箱,注册zone主域名 host.v6.army
点击 账户 -> keys ,生成HTTP Tokens
(用于ddns-go更新ip地址) 和 TSIG Keys
(用于swag生成SSL证书,使用acme则不需要)
添加子域名
进入zone -> records,添加records b.host.v6.army
type: CNAME,name: b,data: host.v6.army.末尾要加“.”
2.更新ip
ddns-go 更新ip
docker安装ddns-go,初次启动设置用户名、密码。
修改配置:
DDNS服务商: CallBack
URL:https://dynv6.com/api/update?hostname=host.v6.army&token=<http token>&ipv6=auto
RequestBody:host.v6.army
TTL:自动
IPv4不启用
IPv6启用 获取 IP 方式:通过网卡获取 匹配正则表达式:@1 Domains:host.v6.army 无法更新子域名
ssh 更新ip
1
ssh-keygen -t ed25519 -C "host.v6.army" -f ssh_dynv6
将生成的公钥填入网站的 SSH Public Keys
编写更新ip脚本,设置自动化任务,每五分钟运行一次
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
#!/bin/bash
cd /usr/local/bin/ddns
zones=("aaa" "bbb" "ccc")
dynv6_key="/root/.ssh/key"
ipv6_now=$(ip -6 addr list scope global enp1s0 | grep 2408 | sed -n 's/.*inet6.*\(2408.*\)\/.*/\1/p' | head -n 1)
echo "ipv6 now : $ipv6_now"
for zone in "${zones[@]}"; do
echo -e "\nupdate $zone.v6.army"
ipv6_old=$(dig @ns1.dynv6.com $zone.v6.army AAAA | grep 2408 | sed -n 's/.*\(2408.*\).*/\1/p' | head -n 1)
# 检查命令是否执行成功
if [ $? -ne 0 ];then
echo "get $zone.v6.army ipv6 addr failed, skip..."
continue
fi
echo "ipv6 old : $ipv6_old"
if [ "$ipv6_old" == "$ipv6_now" ]; then
echo "ipv6 addr not change"
continue
fi
ssh api@dynv6.com -i $dynv6_key "hosts $zone.v6.army set ipv6addr $ipv6_now"
# 检查命令是否执行成功
if [ $? -ne 0 ]; then
echo "update $zone.v6.army failed, skip..."
continue
fi
echo "update $zone.v6.army success"
done
3.启用HTTPS
swag申请证书
推荐使用acme
dynv6 域名启用SSL with LET’S ENCRYPT - 知乎
安装swag docker拉取镜像 linuxserver/swag
,绑定80和443端口,挂载/config目录
设置环境变量
1
2
3
4
5
6
7
PUID=1000
PGID=1000
TZ=Asia/Shanghai
URL=host.v6.army
SUBDOMAINS=wildcard
VALIDATION=dns
DNSPLUGIN=rfc2136
修改rfc2136.ini文件
1
2
3
4
5
6
7
8
# Target DNS server
dns_rfc2136_server = ns1.dynv6.com
# TSIG key name
dns_rfc2136_name = host.v6.army
# TSIG key secret
dns_rfc2136_secret = <TSIG key>
# TSIG key algorithm
dns_rfc2136_algorithm = HMAC-SHA512
重启docker后自动申请证书,查看日志,keys在/config/keys
目录下
acme申请证书
动态域名商Dynv6之acme使用dnsapi申请证书 - Bunker
安装acme.sh
1
2
3
4
curl https://get.acme.sh | sh
# 设置别名
vim ~/.bashrc
alias acme.sh=~/.acme.sh/acme.sh
创建ed25519 ssh证书
1
2
cd ~/.ssh
ssh-keygen -t ed25519 -C "host.v6.army" -f <filename>
将公钥上传到dynv6的 SSH Public Keys
创建HTTP Token
申请证书
1
2
3
4
5
6
7
# ssh私钥文件
export KEY="sshpath"
# http token
export DYNV6_TOKEN="rPSc75..."
# 更改默认ca
acme.sh --set-default-ca --server letsencrypt
acme.sh --issue --dns dns_dynv6 -d 'example.v6.army,*.example.v6.army'
公钥使用fullchain文件,包含域名公钥和ca公钥,避免软件挂载时无法访问
更新证书
1
acme.sh --cron
多域名申请证书
同一个 DNS 服务商通过 API 签发证书,只能保存一个域名的 Token 信息,导致更新失败,解决方法:为每一个域名创建文件夹分别保存配置,申请和更新证书时--config-home
指定配置文件目录。
1
2
3
4
5
6
7
8
9
mkdir /root/host1
export KEY="sshpath"
export DYNV6_TOKEN="rPSc75..."
acme.sh --config-home /root/host1 --set-default-ca --server letsencrypt
acme.sh --config-home /root/host1 --issue --dns dns_dynv6 -d 'host1.v6.army,*.host1.v6.army'
#更新证书
acme.sh --cron --config-home /root/host1