今天把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自动生成的配置就行