这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

安装完成后的基本配置

在 debian 12.4 安装完成后的基本配置

1 - timeshift

安装配置 timeshift 进行备份

备注:安装完成之后,第一时间安装 timeshift 进行备份,后续操作中出现任何失误都可以通过 timeshift 来选择性的恢复到中间状态,避免出错后需要重新安装。

具体操作参考:

https://skyao.net/learning-ubuntu-server/docs/installation/timeshift/

安装

先 su 到 root,再进行安装:

su root
apt install timeshift

配置

找到 timeshift 分区的 UUID:

lsblk -f

例如这个机器有三块硬盘, /var/timeshift 所在的分区 UUDI 为 3c5ad47e-4318-4797-8342-7e602ac524d2

$ lsblk -f
NAME        FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme1n1                                                                            
`-nvme1n1p1 ext4   1.0         ccae6bf3-d4cd-422d-b67a-b5b8dfe83fc6  782.2G     0% /var/data2
nvme0n1                                                                            
`-nvme0n1p1 ext4   1.0         eff3a45e-be5e-4f5e-a969-0998a8a10e33  782.2G     0% /var/data
nvme2n1                                                                            
|-nvme2n1p1 vfat   FAT32       C4B5-2470                             505.1M     1% /boot/efi
|-nvme2n1p2 ext4   1.0         41949492-a351-4770-80f6-d4c7dc5b23bc  171.2G     1% /
`-nvme2n1p3 ext4   1.0         3c5ad47e-4318-4797-8342-7e602ac524d2     48G     0% /var/timeshift

然后设置 backup_device_uuid ,注意 timeshift 在第一次使用时会读取 default.json 文件:

vi /etc/timeshift/default.json

验证一下:

timeshift --list

这个时候还没有进行备份,没有 snapshot:

timeshift --list
First run mode (config file not found)
Selected default snapshot type: RSYNC
Mounted '/dev/nvme2n1p3' at '/run/timeshift/3424/backup'
Device : /dev/nvme2n1p3
UUID   : 3c5ad47e-4318-4797-8342-7e602ac524d2
Path   : /run/timeshift/3424/backup
Mode   : RSYNC
Status : No snapshots on this device
First snapshot requires: 0 B

No snapshots found

此时会自动创建配置文件 /etc/timeshift/timeshift.json,后续修改配置就要修改这个文件。

配置 excludes

除了基本的 backup_device_uuid 外,还需要配置 excludes 以排除不需要 timeshift 进行备份的内容。

{
  "backup_device_uuid" : "3c5ad47e-4318-4797-8342-7e602ac524d2",
  ......
  "exclude" : [
    "/root/**",
    "/home/**",
    "/timeshift/**",
    "/var/data/**",
    "/var/data2/**",
    "/var/data3/**"
  ],
  ......
}

需要排除的内容通常包括用户目录(/root//home/),以及资料存储如我这里的 "/var/data/ 等几块用来存储的硬盘,以及 timeshift 自身所在目录 /timeshift/ (取决于安装debian时选择的timeshift分区的挂载路径)。

配置自动备份

设置每天/每周/每月的自动备份:

{
  ......
  "schedule_monthly" : "true",
  "schedule_weekly" : "true",
  "schedule_daily" : "true",
  ......
  "count_monthly" : "2",
  "count_weekly" : "3",
  "count_daily" : "5",
  ......
}

创建快照

先不做任何操作,在操作系统安装完成之后,第一时间进行备份:

timeshift --create --comments "first backup after install"

第一次备份大概要消耗2.3g的存储空间。

补充:调整分区大小

有时候,某些 debian 操作系统,比如一些 vps 网站,他们提供的 debian 操作系统,是直接把整个硬盘作为一个分区安装 debian 操作系统的. 没有机会在 debian 安装前预留 timeshift 的分区.

因此就必须在操作系统安装之后,再进行磁盘空间的调整,缩小操作系统所在分区的大小,腾出空间来做 timeshift 的备份分区.

具体操作步骤:

  1. 开启 Rescue Mode

    用 debian 自带的急救系统(Rescue Mode)启动, 这样操作系统安装的磁盘就不会被挂载,绕开磁盘被挂载之后无法操作的问题.

    这是正常启动时的磁盘情况, 1t 的硬盘空间都被划分为 /dev/vda1:

    $ fdisk -l
    
     Disk /dev/vda: 1000 GiB, 1073741824000 bytes, 2097152000 sectors
     Units: sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     Disklabel type: gpt
     Disk identifier: A6061F2A-27A6-423F-B8E9-77CF41A2180C
    
     Device     Start        End    Sectors  Size Type
     /dev/vda1   2048 2097151964 2097149917 1000G Linux filesystem
    
    $ lsblk -f
     NAME   FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
     vda                                                                           
     `-vda1 ext4   1.0   Root  9a4a0c40-862e-45a3-8c13-e732e6e052e0  932.9G     0% /
    

    这是 Rescue Mode 启动之后的磁盘情况, 此时操作系统是在一个内存模拟磁盘上启动的,而之前的 1t 磁盘没有被挂载. 这就方便操作了.

  2. 检查磁盘:

    操作之前必须先执行fsck 命令检查磁盘,如果有问题要先修复:

    e2fsck -f /dev/vdb1
    

  3. 调整文件系统大小

    这是压缩文件系统,也就是把所有的文件都调整到这个空间范围内,这样后面缩小分区大小时就不会丢失数据. 比如我这里计划只给操作系统留50g空间.

    resize2fs /dev/vdb1 50G
    

  4. 调整分区大小

    这次是真实的开始调整操作系统所在分区的大小了.

    cfdisk /dev/vdb
    

    在上面选择分区:

    在下面的命令中选择 “Resize”:

    输入新的大小,如 50G:

    移动到 Write,写入修改. 这是改动完成的磁盘情况:

  5. 退出 Rescue Mode, 正常启动

  6. 用 fdisk 对剩余空间进行分区, 设定一个分区为 timeshift 分区即可.

     $ fdisk -l
     Disk /dev/vda: 1000 GiB, 1073741824000 bytes, 2097152000 sectors
     Units: sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     Disklabel type: gpt
     Disk identifier: A6061F2A-27A6-423F-B8E9-77CF41A2180C
    
     Device          Start        End    Sectors  Size Type
     /dev/vda1        2048  104859647  104857600   50G Linux filesystem
     /dev/vda2   104859648 1992296447 1887436800  900G Linux filesystem
     /dev/vda3  1992296448 2097149951  104853504   50G Linux filesystem
     $ $lsblk -f
     NAME   FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
     vda                                                                           
     |-vda1 ext4   1.0   Root  9a4a0c40-862e-45a3-8c13-e732e6e052e0   45.3G     3% /
     |-vda2 ext4   1.0         038772c5-edd8-400b-932f-902821b0350b                
     `-vda3 ext4   1.0         b1a8967b-4f64-419e-a0d8-ac1cda3ea5f6
    

2 - path修改

修改默认path路径避免找不到命令的错误

问题描述

debian 12 默认的 PATH 路径有点少:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games

很多常见的命令都会因为不包含在 PATH 中而无法使用,报错 “command not found”:

$ usermod -aG sudo sky
bash: usermod: command not found

打开 /etc/profile 文件看到:

if [ "$(id -u)" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

看上去像是没有自动 source /etc/profile,比如我用 su 到 root 账号后执行 source,那就正常的得到上面的 PATH:

$ su root
Password: 
$ id
uid=0(root) gid=0(root) groups=0(root)
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games
$ source /etc/profile
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

普通账号的修复

对于普通账号,比如我安装时建立的 sky 账号,只要简单在 .zshrc 中加入:

# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH
export PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

重新登录 sky 账号,验证即可:

$ echo $PATH

/home/sky/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

这个需要先安装 zsh 和 oh-my-zsh,bash 应该类似,只是我目前基本只用 zsh。

root 账号的修复

貌似没有找到解决不自动 source /etc/profile 的办法,所以只能手工执行

source /etc/profile

来解决。或者,类似 sky 账号那样,安装 zsh 和 oh-my-zsh,但发现 root 账号不能改成默认使用 zsh,只能在 su 到 root 账号之后,手工执行 zsh 来从 bash 换到 zsh。

3 - sudo设置

增加账号的sudo权限

安装

先 su 到 root 账号,安装 sudo:

apt install sudo

问题

安装时默认的 sky 账号是没有 sudo 权限的:

$ id
uid=1000(sky) gid=1000(sky) groups=1000(sky),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev)

$ sudo ls
[sudo] password for sky: 
sky is not in the sudoers file.

解决方案

先 su 为 root,然后为 sky 账号加入 sudo:

# 如果没有修复 path 的问题,则会报错找不到 usermod
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
usermod -aG sudo sky

退出 sky 账号,再次登录就可以 sudo 了:

$ ls                                                                                      
[sudo] password for sky: 
bin  debian12  temp  work
$ id
uid=1000(sky) gid=1000(sky) groups=1000(sky),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev)

问题2

在某些 debian 12 上(比如腾讯云),即使使用 usermod 加入了 sudo 组,仍然不能使用 sudo:

$ sudo ls 
[sudo] password for sky: 
sky is not in the sudoers file.
$ id
uid=1003(sky) gid=1003(sky) groups=1003(sky),27(sudo),100(users)

解决的办法是用 root 帐号执行

visudo

命令,然后添加下面这样内容:

%sudo ALL=(ALL:ALL) ALL

保存退出,然后 sky 帐号重新登录可以使用 sudo 。

4 - git

安装配置 git

直接 apt 安装:

apt install git

检查版本:

$ git version
git version 2.39.5

配置代理

mkdir -p ~/.ssh/
vi ~/.ssh/config

增加内容为:

# for  github
Host github.com
    HostName github.com
    User git
    # for HTTP proxy
    #ProxyCommand socat - PROXY:192.168.0.1:%h:%p,proxyport=7890
    #ProxyCommand socat - PROXY:192.168.2.1:%h:%p,proxyport=7890
    #ProxyCommand socat - PROXY:192.168.3.1:%h:%p,proxyport=7890
    #ProxyCommand socat - PROXY:192.168.5.1:%h:%p,proxyport=7890
    # for socks5 proxy
    #ProxyCommand nc -v -x 192.168.0.1:7891 %h %p
    #ProxyCommand nc -v -x 192.168.2.1:7891 %h %p
    #ProxyCommand nc -v -x 192.168.3.1:7891 %h %p
    #ProxyCommand nc -v -x 192.168.5.1:7891 %h %p
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_github

其他设置参考: https://skyao.net/learning-git/docs/installation/initial/

5 - zsh

安装配置zsh和ohmyzsh!

安装配置 zsh

安装zsh

首先安装 zsh:

sudo apt install zsh zsh-doc

安装 Oh my zsh!

在 zsh 终端执行:

# 如果被墙则增加代理设置
# export all_proxy=socks5://192.168.2.1:7891

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

DNS 污染问题:

如果遇到 DNS 污染,导致 raw.githubusercontent.com 被解析到 127.0.0.1 或者 0.0.0.1 导致无法访问。需要修改 hosts 文件:

sudo vi /etc/hosts

增加一行:

199.232.68.133 raw.githubusercontent.com

中途询问是否把zsh作为默认 shell 时选择Y:

Do you want to change your default shell to zsh? [Y/n] Y
Changing the shell...

安装插件

安装 wd 插件:

sh -c "$(curl -fsSL https://github.com/mfaerevaag/wd/raw/master/install.sh)"

配置以下插件:

git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-history-substring-search.git $ZSH_CUSTOM/plugins/history-substring-search
git clone https://github.com/Pilaton/OhMyZsh-full-autoupdate.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/ohmyzsh-full-autoupdate

修改 zsh 配置

vi ~/.zshrc

注释掉这一行:

DISABLE_MAGIC_FUNCTIONS="true"

修改 plugins 为

plugins=(    
    git
    golang
    rust
    docker
    docker-compose 
    kubectl
    npm
    node
    mvn
    sudo
    helm
    redis-cli
    wd 
    zsh-autosuggestions
    zsh-syntax-highlighting
    history-substring-search
    ohmyzsh-full-autoupdate
)

# User configuration

ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern cursor root line)
ZSH_HIGHLIGHT_PATTERNS=('rm -rf *' 'fg=white,bold,bg=red')

重启 zsh。

Updating plugins and themes Oh My ZSH
--------------------------------------

Updating Plugin — ohmyzsh-full-autoupdate -> https://github.com/Pilaton/OhMyZsh-full-autoupdate
Already up to date.

Updating Plugin — zsh-autosuggestions -> https://github.com/zsh-users/zsh-autosuggestions
Already up to date.

Updating Plugin — zsh-syntax-highlighting -> https://github.com/zsh-users/zsh-syntax-highlighting
Already up to date.

Updating Theme — powerlevel10k -> https://github.com/romkatv/powerlevel10k
Already up to date.

备注: 这个自动更新可能会因为 github.com 被墙无法访问而失败。可以修改 .zshrc 的设置,默认开启代理避免更新时被墙:

# auto start proxy on
export all_proxy=socks5://192.168.2.1:7891;export http_proxy=http://192.168.2.1:7890;export https_proxy=http://192.168.2.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16

然后手工更新 ohmyzsh:

# proxyon
omz update

执行完 ohmyzsh 的更新之后,关闭所有的终端,再重新打开,就会触发 zsh plugins 的自动更新。

配置网络代理

修改 zsh 配置

vi ~/.zshrc

增加以下内容:

# set proxy for different locations
alias proxyon-nansha='export all_proxy=socks5://192.168.0.1:7891;export http_proxy=http://192.168.0.1:7890;export https_proxy=http://192.168.0.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
alias proxyon-tianhe='export all_proxy=socks5://192.168.2.1:7891;export http_proxy=http://192.168.2.1:7890;export https_proxy=http://192.168.2.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
alias proxyon-fenghu='export all_proxy=socks5://192.168.3.1:7891;export http_proxy=http://192.168.3.1:7890;export https_proxy=http://192.168.3.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
alias proxyon-local='export all_proxy=socks5://127.0.0.1:7897;export http_proxy=http://127.0.0.1:7897;export https_proxy=http://127.0.0.1:7897;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
# set default proxy by this line
alias proxyon='proxyon-local'
alias proxyoff='unset all_proxy http_proxy https_proxy no_proxy'
# uncomment next line to enable proxy by default when zsh is opened
# proxyon

6 - 网络代理

设置网络代理

设置网络代理

我通常在 openwrt 上安装 openclash,支持 socks5 和 http 代理,因此设置很简单:

vi ~/.zshrc

加入以下内容:

# set proxy for different locations
alias proxyon-nansha='export all_proxy=socks5://192.168.0.1:7891;export http_proxy=http://192.168.0.1:7890;export https_proxy=http://192.168.0.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
alias proxyon-tianhe='export all_proxy=socks5://192.168.2.1:7891;export http_proxy=http://192.168.2.1:7890;export https_proxy=http://192.168.2.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
alias proxyon-fenhu='export all_proxy=socks5://192.168.3.1:7891;export http_proxy=http://192.168.3.1:7890;export https_proxy=http://192.168.3.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
alias proxyon-qingpu='export all_proxy=socks5://192.168.5.1:7891;export http_proxy=http://192.168.5.1:7890;export https_proxy=http://192.168.5.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
# set default proxy by this line
alias proxyon='proxyon-nansha'
alias proxyoff='unset all_proxy http_proxy https_proxy no_proxy'
# uncomment next line to enable proxy by default when zsh is opened
# proxyon

开启网络代理

需要开启代理时,输入 proxyon 命令就设置好代理了。不使用时 proxyoff 关闭。

为 sudo 开启代理

出于安全考虑,sudo 默认会重置环境变量(如 http_proxy、https_proxy),防止用户通过环境变量传递潜在的危险参数或越权操作,然后就导致前面的代理设置(本质上是设置环境变量 http_proxy、https_proxy)失效。

但有时我们又不得不使用 sudo 来执行某些需要使用代理的命令,这时就需要为 sudo 开启代理。

此时可以在 sudo 命令前加上 -E 参数,表示保留当前用户的环境变量,如:

sudo -E apt-get update

# 安装 docker 时有时会遇到 download.docker.com 的连接问题,此时可以设置代理
sudo -E apt-get install docker-ce

如果想永久生效,可以修改 sudo 的配置文件:

sudo visudo

在文件中找到下面的内容:

# This preserves proxy settings from user environments of root
# equivalent users (group sudo)
#Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"

#Defaults:%sudo env_keep 这一行的注释去掉,然后 contrl + o 保存退出(备注:这个文件的名字就是 /etc/sudoers.tmp ,不要以为是保存错了)。

此时再使用 sudo 时,就会自动保留当前用户的环境变量,不需要再收工加 -E 参数。

7 - 安装其他软件

安装其他软件

系统类

linux-headers

安装 dkms 和用于 pve 的 linux-headers:

sudo apt install -y gcc make dkms
sudo apt install -y linux-headers-$(uname -r)
sudo apt install --fix-broken

工具类

sudo apt install htop unzip zip curl

修复 locale 报错

默认安装之后经常在执行各种命令时看到如下的警告:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_CTYPE = "UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

可以通过执行 locale 命令来重现这个警告:

解决方案,

vi ~/.zshrc

增加内容:

export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

执行

source ~/.zshrc

验证结果。

参考:

网络类

iperf

sudo apt install -y net-tools iperf iperf3

Iperf3 安装时会询问是否系统服务(自动启动),选择 yes,这样方便需要时排查网络。

nc

debian 12 自带的 nc 是 netcat-traditional 包提供的版本:

$ nc -h 

[v1.10-47]
connect to somewhere:	nc [-options] hostname port[s] [ports] ... 
listen for inbound:	nc -l -p port [-options] [hostname] [port]

而我一直在 ubuntu / linux mint 中用的 nc 是 netcat-openbsd 包提供的版本:

$ nc -h    

OpenBSD netcat (Debian patchlevel 1.226-1ubuntu2)
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl]
	  [-m minttl] [-O length] [-P proxy_username] [-p source_port]
	  [-q seconds] [-s sourceaddr] [-T keyword] [-V rtable] [-W recvlimit]
	  [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]]
	  [destination] [port]

而我在设置 git 代理时,通常会使用 nc 来设置,类似:

ProxyCommand nc -v -x 192.168.3.1:7891 %h %p

这个命令在 netcat-traditional 下会报错:

nc: invalid option -- 'x'
nc -h for help

因此需要将默认的 netcat-traditional 包替换为 netcat-openbsd 包:

sudo apt remove -y netcat-traditional
sudo apt install -y netcat-openbsd

安装 socat

debian12 下没有 socat 命令(用于 git http代理),需要安装:

sudo apt install -y socat

sftp server

pve 默认是关闭 sftp 的,需要手动开启:

sudo vi /etc/ssh/sshd_config

找到 Subsystem sftp /usr/lib/openssh/sftp-server 这一行,注释掉,然后新加一行内容:

# Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

重启 ssh 服务:

sudo /etc/init.d/ssh restart

之后用支持 sftp 的客户端连接即可

nfs client

sudo apt install nfs-common

smb server

安装 samba 服务:

sudo apt install samba

假设要共享的目录是 /mnt/data/shared, 则需要先创建该目录:

sudo mkdir -p /mnt/data/shared

设置目录权限:

sudo chmod -R 777 /mnt/data/shared

设置目录所有者:

sudo chown -R nobody:nogroup /mnt/data/shared

配置 samba 服务:

sudo vi /etc/samba/smb.conf

在文件末尾添加以下内容:

[shared]
   comment = Shared Folder
   path = /mnt/data/shared
   browseable = yes
   read only = no
   guest ok = yes 
   create mask = 0777
   directory mask = 0777

并删除这个文件中 [home] 和 [printers] 这两段内容,否则在smb 共享文件列表中会出现 nobody 和 printers 两个目录。

启动 samba 服务并设置为开机启动:

sudo systemctl start smbd
sudo systemctl enable smbd

之后就可以访问了,路径为:

  • linux 系统:smb://192.168.3.175
  • windows 系统:\\192.168.3.175