You've successfully subscribed to 完美的胖达
Great! Next, complete checkout for full access to 完美的胖达
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.
E480安装Debian踩坑记录

E480安装Debian踩坑记录

. 约 13 分钟读完

今天把E480升了下级,内存加到32G,硬盘加到2T,准备装Linux玩。
谁知道一开始装的Debian就出问题了,疯狂死机。
经过多轮排查,怀疑过多个问题,重装了四五次,终于发现原来是无线网卡睡眠造成PCI死锁造成系统硬死机,害我连log都查不到问题。
为防将来继续出问题重装的时候我忘了,把安装过程记录一下。

正常安装

使用Live ISO正常安装即可,我这次用的是Debian 13.2 Trixie AMD64 KDE,但这个不重要。

更新内核

因为Debian进入Stable版本后内核就不怎么更新了,所以现在的Debian 13 Trixie还在用6.12.57+deb13-amd64的内核,如果你不知道你在用啥内核,可以用uname -r查看当前内核版本。
使用如下命令升级最新内核(也不是很新),不是一定要升,反正命令就是这个。

sudo apt -t trixie-backports install linux-image-amd64 linux-headers-amd64

关闭无线电源管理

这是造成死机的根源。
首先用ip link命令查看无线端口号。
然后用如下命令,注意端口要改成你刚查到的端口,关闭电源管理,命令即时生效,如果之前死机,敲完命令马上就修复了。

sudo iw dev wlp5s0 set power_save off

但是这只是一次性修复,完整修复需要sudo nano /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf,然后写入如下内容:

[connection]
wifi.powersave = 2

关闭powertop服务

sudo systemctl disable --now powertop

修改tlp服务
获取 Wi-Fi 网卡的 PCI 地址: 打开终端输入:

lspci | grep -i network

你应该会看到类似 05:00.0 Network controller: Intel Corporation... 的输出。记住开头的这串数字,比如 05:00.0。

编辑 TLP 配置文件:

sudo nano /etc/tlp.conf

(Debian 有时候放在 /etc/default/tlp,但现在标准是 /etc/tlp.conf)

修改以下三处关键设置(找不到就取消注释并修改):

第一处:彻底禁止 Wi-Fi 节能(覆盖 NetworkManager) 找到 WIFI_PWR_ON_AC 和 WIFI_PWR_ON_BAT,改为 off:

WIFI_PWR_ON_AC=off
WIFI_PWR_ON_BAT=off

第二处:禁止 PCIe 运行时电源管理(Runtime PM)—— 这是死机真凶 找到 RUNTIME_PM_DENYLIST,填入刚才查到的 PCI 地址:

RUNTIME_PM_DENYLIST="05:00.0"

第三处(可选但保险):禁止 PCIe 链路节能 (ASPM) 如果上面两步还不够,把这个也改了:

    PCIE_ASPM_ON_AC=performance
    PCIE_ASPM_ON_BAT=performance
(默认可能是 default 或 powersupersave,这会导致 8250U 总线挂起)

应用更改:

sudo tlp start

更新网卡驱动并关闭总线AER

debian官方没有8821驱动,得现编。

sudo apt install bc module-assistant build-essential dkms
cd ~/Downloads
git clone https://github.com/tomaspinho/rtl8821ce.git
cd rtl8821ce
sudo ./dkms-install.sh

sudo nano /etc/default/grub
在启动选项中添加pci=noaer pcie_aspm=off
sudo update-grub

关闭读卡器

lsmod | grep sd#查看硬件名称

echo "blacklist sdhci_pci" | sudo tee /etc/modprobe.d/blacklist-sdcard.conf
echo "install sdhci_pci /bin/true" | sudo tee -a /etc/modprobe.d/blacklist-sdcard.conf
sudo update-initramfs -u

添加休眠功能

lsblk -f

查看得到344aa652-8d03-45aa-9ff2-f5b47a5a3835是swap分区的uuid。

第一步:修改 /etc/fstab (确保 Swap 开机挂载)

sudo nano /etc/fstab

找到现有的 swap 行(如果有),将其替换为使用 UUID 的格式;如果没有则新增一行:

    UUID=344aa652-8d03-45aa-9ff2-f5b47a5a3835 none swap sw 0 0

保存并退出。

第二步:配置 initramfs (Debian 关键步骤)

Debian 使用 initramfs-tools,必须显式告诉它恢复分区的 UUID,否则更新内核时可能会报错或无法恢复。

sudo nano /etc/initramfs-tools/conf.d/resume

(如果文件是空的或不存在,直接写入即可)

RESUME=UUID=344aa652-8d03-45aa-9ff2-f5b47a5a3835

第三步:修改 GRUB 启动参数

告诉内核在启动时去哪里寻找休眠镜像。

sudo nano /etc/default/grub

找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行,直接在后面追加空格和参数:

    resume=UUID=344aa652-8d03-45aa-9ff2-f5b47a5a3835

第四步:更新并生效 (必须执行)

你需要重新生成启动镜像(initramfs)和 GRUB 菜单。

sudo update-initramfs -u
sudo update-grub

第五步:验证与测试

重启电脑后,先检查 Swap 是否激活:

sudo swapon --show

(应该能看到你的 UUID 对应的分区)

测试休眠命令:

sudo systemctl hibernate

注意这个休眠和windows休眠不一样,会完整的经历全部启动步骤,包括grub菜单,不要启动到别的系统了,进入linux后会提示image loading 100%读取内存镜像,和正常启动是不一样的。

顺便记录一下环境安装步骤

安装工具

sudo apt install powertop tlp tlp-rdw git
cd ~/Downloads
wget https://github.com/localsend/localsend/releases/download/v1.17.0/LocalSend-1.17.0-linux-x86-64.deb
sudo dpkg -i LocalSend-*-linux-x86-64.deb
sudo apt install -f
sudo dpkg -i LocalSend-*-linux-x86-64.deb
cd ~/Downloads
wget https://github.com/aristocratos/btop/releases/download/v1.4.0/btop-x86_64-linux-musl.tbz
tar -xjf btop-x86_64-linux-musl.tbz
cd btop
sudo make install

配置git连接

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

生成 SSH Key (如果还没有)

# 推荐使用 Ed25519 算法,比 RSA 更短更安全
ssh-keygen -t ed25519 -C "your laptop hostname"

# 查看公钥并在web页面的SSH key里面添加到 GitHub/GitLab 后台
cat ~/.ssh/id_ed25519.pub

配置 SSH 自动走singlebox (20170/20171)
编辑~/.ssh/config,加入以下内容:
nano ~/.ssh/config

Host github.com
    User git
    # 强制 SSH 走 SOCKS5 代理 (假设端口 20170,如果不通改 20171)
    # 这一步能让 git push/pull 飞快,且不影响系统其他 SSH
    ProxyCommand nc -X 5 -x 127.0.0.1:20170 %h %p

配完之后可以测试一下

sudo apt install netcat-openbsd
ssh -T git@github.com
# 查看详细信息
ssh -vT git@github.com
    

下载脚本文件

cd ~
# 因为你配了 SSH Key,直接走 SSH 协议
git clone git@github.com:xxx/yyyyy.git
cd yyyyy

再进入dotfiles目录运行安装脚本安装debian环境。因为我的项目是私密的,所以我把源文件内容直接放这里吧,你也照抄的话也可以把debian装修的马马虎虎了,注意文件结构也得照抄哈。

install_debian.sh

#!/bin/bash
set -e

# 获取当前非 Root 用户的信息 (因为脚本虽然可能有 sudo 权限,但我们需要知道你是谁)
REAL_USER=${SUDO_USER:-$USER}
REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)

echo ">>> 当前用户: $REAL_USER (Home: $REAL_HOME)"
echo ">>> 开始安装 Modern Unix 工具链..."

# ==========================================
# 1. 基础安装 (软件层面)
# ==========================================
sudo apt update
sudo apt install -y curl git nano zsh wget gpg unzip fontconfig bat ripgrep fzf duf fastfetch

# 安装 Eza
if ! command -v eza &> /dev/null; then
    echo ">>> 安装 Eza..."
    sudo mkdir -p /etc/apt/keyrings
    wget -qO- https://raw.githubusercontent.com/eza-community/eza/main/deb.asc | sudo gpg --dearmor -o /etc/apt/keyrings/gierens.gpg
    echo "deb [signed-by=/etc/apt/keyrings/gierens.gpg] http://deb.gierens.de stable main" | sudo tee /etc/apt/sources.list.d/gierens.list
    sudo chmod 644 /etc/apt/keyrings/gierens.gpg /etc/apt/sources.list.d/gierens.list
    sudo apt update
    sudo apt install -y eza
fi

# 安装 Zoxide
if ! command -v zoxide &> /dev/null; then
    echo ">>> 安装 Zoxide..."
    curl -sS https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | bash
fi

# ==========================================
# 2. 配置当前用户的 Zsh & OMZ
# ==========================================
# 安装 Oh-My-Zsh
if [ ! -d "$REAL_HOME/.oh-my-zsh" ]; then
    echo ">>> 安装 Oh-My-Zsh..."
    # 临时切换成普通用户身份执行,防止装到 /root 下
    sudo -u "$REAL_USER" sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
fi

# 安装插件 & 主题
ZSH_CUSTOM="$REAL_HOME/.oh-my-zsh/custom"
# Powerlevel10k
if [ ! -d "$ZSH_CUSTOM/themes/powerlevel10k" ]; then
    sudo -u "$REAL_USER" git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM}/themes/powerlevel10k
fi
# Syntax Highlighting
if [ ! -d "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" ]; then
    sudo -u "$REAL_USER" git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM}/plugins/zsh-syntax-highlighting
fi
# Autosuggestions
if [ ! -d "$ZSH_CUSTOM/plugins/zsh-autosuggestions" ]; then
    sudo -u "$REAL_USER" git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM}/plugins/zsh-autosuggestions
fi

# ==========================================
# 3. 配置 Nano (VS Code Style)
# ==========================================
echo ">>> 配置 Nano (Target: galenguyer)..."
NANO_DIR="$REAL_HOME/.nano"
NEW_REPO="https://github.com/galenguyer/nano-syntax-highlighting.git"

# 检查是否需要替换旧仓库
if [ -d "$NANO_DIR/.git" ]; then
    CURRENT_URL=$(git -C "$NANO_DIR" remote get-url origin 2>/dev/null || echo "")
    if [[ "$CURRENT_URL" != *"galenguyer"* ]]; then
        echo ">>> 清理旧 Nano 配置..."
        rm -rf "$NANO_DIR"
    fi
elif [ -d "$NANO_DIR" ]; then
    rm -rf "$NANO_DIR"
fi

if [ ! -d "$NANO_DIR" ]; then
    sudo -u "$REAL_USER" git clone --depth=1 "$NEW_REPO" "$NANO_DIR"
    rm -rf "$NANO_DIR/.git" "$NANO_DIR/Makefile" "$NANO_DIR/install.sh" "$NANO_DIR/README.md" "$NANO_DIR/LICENSE"
fi

# 修正 .nanorc 引用
DOT_NANORC="$REAL_HOME/yyyyy/dotfiles/.nanorc"
if [ -f "$DOT_NANORC" ]; then
    # 确保引用写法正确
    sed -i '/^include.*\.nano/d' "$DOT_NANORC"
    echo 'include "~/.nano/*.nanorc"' >> "$DOT_NANORC"
fi

# 链接当前用户的 .nanorc
sudo -u "$REAL_USER" mkdir -p "$(dirname "$DOT_NANORC")"
sudo -u "$REAL_USER" ln -sf "$DOT_NANORC" "$REAL_HOME/.nanorc"

# ==========================================
# 4. 同步环境给 ROOT (解决 sudo -i 问题)
# ==========================================
echo ">>> 正在将环境同步给 Root 用户..."

# 4.1 链接 Oh-My-Zsh
# 让 Root 直接使用用户的 OMZ 目录,这样插件更新只需做一次
if sudo [ -d "/root/.oh-my-zsh" ]; then
    sudo rm -rf "/root/.oh-my-zsh"
fi
sudo ln -sf "$REAL_HOME/.oh-my-zsh" /root/.oh-my-zsh

# 4.2 链接 .zshrc
# 注意:这要求你的 .zshrc 尽量使用 $HOME 变量而不是写死 /home/ad
if sudo [ -f "/root/.zshrc" ]; then
    sudo mv /root/.zshrc /root/.zshrc.bak
fi
# 直接链接到你 dotfiles 里的源文件,或者链接到用户主目录的 .zshrc
sudo ln -sf "$DOT_NANORC/../.zshrc" /root/.zshrc

# 4.3 链接 .p10k.zsh
if sudo [ -f "/root/.p10k.zsh" ]; then
    sudo mv /root/.p10k.zsh /root/.p10k.zsh.bak
fi
sudo ln -sf "$DOT_NANORC/../.p10k.zsh" /root/.p10k.zsh

# 4.4 链接 Nano 配置 (解决 sudo nano 问题)
sudo rm -rf /root/.nano
sudo ln -sf "$NANO_DIR" /root/.nano
sudo ln -sf "$DOT_NANORC" /root/.nanorc

# 4.5 更改 Root 默认 Shell 为 Zsh
if [ "$(sudo getent passwd root | cut -d: -f7)" != "$(which zsh)" ]; then
    echo ">>> 更改 Root 默认 Shell 为 Zsh..."
    sudo chsh -s "$(which zsh)" root
fi

# ==========================================
# 5. 安装字体
# ==========================================
FONT_DIR="$REAL_HOME/.local/share/fonts"
FONT_NAME="JetBrainsMono"
if [ ! -d "$FONT_DIR/$FONT_NAME" ]; then
    echo ">>> 安装 JetBrainsMono Nerd Font..."
    mkdir -p "$FONT_DIR/$FONT_NAME"
    wget -q --show-progress -O /tmp/JetBrainsMono.zip https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip
    unzip -o -q /tmp/JetBrainsMono.zip -d "$FONT_DIR/$FONT_NAME"
    fc-cache -fv
    rm /tmp/JetBrainsMono.zip
fi

# ==========================================
# 6. 用户级配置链接
# ==========================================
echo ">>> 链接用户配置文件..."
# 备份并链接
[ -f "$REAL_HOME/.zshrc" ] && [ ! -L "$REAL_HOME/.zshrc" ] && mv "$REAL_HOME/.zshrc" "$REAL_HOME/.zshrc.bak"
sudo -u "$REAL_USER" ln -sf "$REAL_HOME/yyyyy/dotfiles/.zshrc" "$REAL_HOME/.zshrc"

[ -f "$REAL_HOME/.p10k.zsh" ] && [ ! -L "$REAL_HOME/.p10k.zsh" ] && mv "$REAL_HOME/.p10k.zsh" "$REAL_HOME/.p10k.zsh.bak"
sudo -u "$REAL_USER" ln -sf "$REAL_HOME/yyyyy/dotfiles/.p10k.zsh" "$REAL_HOME/.p10k.zsh"

echo ">>> 全部完成!"
echo "1. 普通终端: 已经是 Zsh + P10k + 高亮 Nano"
echo "2. sudo nano: 也是高亮配置"
echo "3. sudo -i : 也是 Zsh + P10k (Root 提示符通常是红色或有锁图标)"
echo "请重新登录或执行 'exec zsh' 生效。"

.zshrc

# [Added by script] Fastfetch 必须在 P10k Instant Prompt 之前运行才能有颜色
if command -v fastfetch >/dev/null 2>&1; then
    fastfetch --config examples/25
fi

# ====================================================
# 通用 Zsh 配置 (Debian / Rescue / macOS Compatible)
# ====================================================

# --- 0. 基础环境 ---
export PATH="$HOME/.local/bin:$PATH"
export EDITOR='nano'
export VISUAL='nano'
export TERM="xterm-256color" # 确保颜色显示正确

# 【关键】解除 Ctrl+S (暂停) 和 Ctrl+Q (恢复) 的终端锁定
# 这样 Nano 才能绑定这两个键作为 保存 和 退出
stty -ixon

# --- 1. 历史记录 (极客必备: 永久、去重、共享) ---
HISTFILE="$HOME/.zsh_history"
HISTSIZE=10000
SAVEHIST=10000
setopt HIST_IGNORE_DUPS       # 忽略重复命令
setopt SHARE_HISTORY          # 多终端共享历史
setopt HIST_EXPIRE_DUPS_FIRST # 空间不足时先删重复的

# --- 2. 启用 Powerlevel10k ---
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

# --- 3. Oh-My-Zsh ---
export ZSH="$HOME/.oh-my-zsh"
if [[ -d "$ZSH" ]]; then
    ZSH_THEME="powerlevel10k/powerlevel10k"
    plugins=(git sudo zoxide fzf extract zsh-syntax-highlighting zsh-autosuggestions)
    
    # 调整自动建议的颜色 (灰色,类似 VS Code 的 Copilot Ghost text)
    ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=244'
    
    source $ZSH/oh-my-zsh.sh
else
    echo "Warning: Oh-My-Zsh not found."
fi

# --- 4. Modern Unix 工具链 ---

# EZA (ls): 加上 --group-directories-first 模仿 VS Code 排序
if command -v eza &> /dev/null; then
    alias ls='eza --icons --group-directories-first'
    alias ll='eza -l -a --icons --git --group-directories-first'
    alias lt='eza --tree --level=4 --icons --group-directories-first'
else
    alias ll='ls -lAh --color=auto'
fi

# BAT (cat): 设置主题
if command -v bat &> /dev/null; then
    export BAT_THEME="Dracula" # 或者 "OneHalfDark"
    alias cat='bat'
elif command -v batcat &> /dev/null; then
    export BAT_THEME="Dracula"
    alias cat='batcat'
fi

# Zoxide (cd)
if command -v zoxide &> /dev/null; then
    eval "$(zoxide init zsh)"
fi

# FZF
if command -v fzf &> /dev/null; then
    source <(fzf --zsh) 2>/dev/null || true
    # 让 FZF 使用 fd/rg 来加速,并忽略 .git
    export FZF_DEFAULT_COMMAND='rg --files --hidden --follow --glob "!.git/*"'
fi

# Duf (df)
if command -v duf &> /dev/null; then
    alias df='duf'
fi

# --- 5. 实用别名 ---
alias grep='rg'
alias conf='nano ~/.zshrc'
alias reload='source ~/.zshrc'
alias gs='git status'
alias ..='cd ..'
alias ...='cd ../..'

# --- 6. 加载 P10K ---
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

# 使用 precmd hook 确保在终端完全初始化后、第一个提示符出现前运行
# 将函数加入到 precmd 数组中

.nanorc

# ========================================
# Nano "VS Code" Style Configuration
# ========================================

# --- 1. 基础 UI 与行为 ---
set linenumbers       # 显示行号
set mouse             # 启用鼠标 (点击定位,滚轮翻页)
set softwrap          # 自动软换行 (不截断单词)
set tabsize 4         # Tab 宽度
set tabstospaces      # Tab 转空格
set autoindent        # 自动缩进
set constantshow      # 底部显示行列位置 (Ln, Col)
set minibar           # 迷你状态栏 (节省空间,更现代)
set nohelp            # 隐藏底部帮助栏 (极客不需要看提示)
set smarthome         # Home 键智能跳转 (行首/缩进处)
set zap               # 允许 Backspace/Del 删除选中的文本 (像 GUI 编辑器一样)
#set magic             # 智能文件名猜测语法高亮

# --- 2. 颜色主题 (Dracula 风格) ---
set titlecolor bold,white,blue
set statuscolor bold,white,green
set numbercolor cyan
set keycolor cyan
set functioncolor green
set errorcolor bold,white,red
set selectedcolor white,magenta

# --- 3. 键位映射 (VS Code 风格) ---

# [保存 & 退出]
unbind ^S main        # 解绑默认行为
bind ^S savefile main # Ctrl+S = 保存
unbind ^Q main
bind ^Q exit main     # Ctrl+Q = 退出 (替代 Ctrl+X)

# [搜索 & 替换]
unbind ^F main
bind ^F whereis main  # Ctrl+F = 搜索
bind ^H replace main  # Ctrl+H = 替换
bind ^G findnext main # Ctrl+G = 找下一个 (F3 也可以,但 Ctrl+G 手不离键盘)

# [剪贴板操作]
# 注意:这是 Nano 内部剪贴板。
# 系统级剪贴板通常需要 Shift+Ctrl+C/V (终端特性)
unbind ^C main
bind ^C copy main     # Ctrl+C = 复制
unbind ^V main
bind ^V paste main    # Ctrl+V = 粘贴
unbind ^X main
bind ^X cut main      # Ctrl+X = 剪切

# [撤销 & 重做]
unbind ^Z main
bind ^Z undo main     # Ctrl+Z = 撤销
unbind ^Y main
bind ^Y redo main     # Ctrl+Y = 重做

# [其他]
bind ^A mark main     # Ctrl+A = 全选 (或者开始选择模式)
bind ^D zap main      # Ctrl+D = 删除当前行 (或者选中内容)

# --- 4. 引入语法高亮 ---
include "~/.nano/*.nanorc"

.p10k.zsh

具体内容我就不放了,p10k configure自动生成的配置就行
本篇已被阅读