Ubuntu20.04 安装

Ubuntu20.04 Desktop Edition install

Posted by Kyon-H on November 2, 2024

Ubuntu20.04 lts 桌面版 安装

下载地址:https://releases.ubuntu.com/20.04.6/ubuntu-20.04.6-desktop-amd64.iso

一、系统制作与安装

1.U盘制作

使用U盘烧录软件(Rufus),分区类型可选择GPT,目标系统类型选择UEFI。

image-20240822163714875.png

重启电脑按F2 选择U盘启动,若打印信息的最后一行报错,重启按F12 进入BIOS,security>secure boot 选择 disableF10 保存并退出。

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

Debian / Ubuntu - 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

Download - ZeroTier

ubuntu下zerotier的基本使用教程

1
curl -s https://install.zerotier.com | sudo bash
1
2
3
sudo zerotier-cli join 9e1xxx436
# 查看当前连接的网络,如果列表中出现网络号说明连接成功
sudo zerotier-cli listnetworks

ZeroTier Central

5.Alist

一键脚本 | AList文档 (nn.ci)

脚本安装

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

手动安装

alist-3.36-linux-amd64.tar.gz

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. 【详细步骤】Ubuntu安装Samba服务及配置共享文件夹_ubuntu samba-CSDN博客

  2. 在 Ubuntu 22.04上安装和配置 Samba 共享 (linux-console.net)

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

安装

安装雷池 | 雷池 SafeLine

自动安装

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"

image-20240823124817697.png

挂载:

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 查看分区情况,记住 设备起点末尾

image-20240930212900132.png

以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

image-20240930220907160.png

五、公网访问

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