桌面版 ubuntu & debian 踩坑

debian 安装时

是否使用网络安装一定要选是,然后选 163 源,否则后面安装虽然说默认从本地 iso 安装但 kde 之类的东西实际上还是远程安装,默认的国外源非常慢。

debian 安装 vmware-tools

  1. 先到 etc/apt/sources.list 里面把光盘源删掉,并保证里面剩余的源来自 163。

  2. 安装编译其他依赖:

    1
    apt-get install autoconf automake binutils cpp gcc linux-headers-$(uname -r) make psmisc
  3. 点击 vmware 外界面中的「安装 vmware tools」,弹出文件夹后以命令行方式运行 vmware-install.pl,一路回车,重启搞掂。

python 版本问题

ubuntu 的 python2 和 python3 是共存的,带来一系列问题

  1. 要用 python3 需要写 python3 而不是 python,有点麻烦,可以通过 alias 解决。

  2. 某些 python3 下的模块用 pip3 装以后不能直接用,因为 python3 不在用户变量里面,需要加进去

    1
    export PATH=/usr/lib/python3/dist-packages/:$PATH

    然后用 pip 装模块的时候需要在前面加 sudo。

语言问题

ubuntu 可以直接在设置里面换源。换源之后再添加语言,添加后退出一遍就能看到。

设置为中文后会提示你要不要把用户文件夹里的子文件夹改成中文。最好不要。

root 用户问题

桌面版的 debian&&ubuntu 默认都没有开启 root 用户,取而代之的是给当前用户 sudo 的权限。

想要开启 root 用户可以直接 sudo passwd root 搞定。不过即使这样登录的时候也不能直接用 root 而是只能在登录普通用户后用 su 切换。

另外还有一个问题,那就是系统变量/alias。只有 root 用户的话写在 /root/.bashrc 或 /root/.profile 下就好了。而现在应该写在具体用户目录下的这两个文件内,即 %HOME/.bashrc 或 %HOME/.profile,但此时一旦使用 sudo 或者用 su 切换到 root 下时,这两个系统变量就会失效。解决方法是把内容写到 /etc/bashrc 或 /etc/profile 下,这两个目录下的文件名前面没有 .,也就是不隐藏的。

sudo 很麻烦但非常常用,许多命令不用 sudo 的话会报错和显示找不到(特别是新装了个新软件结果发现敲命令提示 no found,不是没装好而是没用 sudo),比如 ifconfig 和 service,还有 make install 也需要 sudo 才能顺利安装。

因为帐号一开始就有 sudo 权限,实际上在 debian 中帐号已经写入 visudo 中了。如果需要 sudo 不设密码的话,直接加 NOPASSWD:,比如:

1
zbttl ALL=(ALL:ALL) NOPASSWD:ALL

另外还有些 gui 下的软件需要 root 模式下启动(比如 vscode),可以用 sudo [软件名] & 启动,比如

1
sudo wireshark &

如果不知道软件名,可以打开后用 top 查看。

另外,还有特殊一点的,vscode 的某些插件需要 root 下才能生效(比如换背景那个插件),但使用 sudo 打开的话,没办法读取当前用户的配置,就没法生效。正确的办法是:参考文章

1
2
3
chown -R 你的用户名  /usr/share/code
#insiders 版本
chown -R 你的用户名 /usr/share/code-insiders

文件浏览器 root 开启,以及开启地址栏

没有 root 模式的话很多文件没法直接复制粘贴。

ubuntu:安装 nautilus-admin

1
sudo apt-get install nautilus-admin

刷新一遍 natuilus

1
nautilus -q

然后就可以右键管理员模式打开文件夹了。

原来的地址栏可以通过 ctrl+l 打开全路径编辑样式,但我倾向于一直开着而不是使用默认的块状路径样式。

块状路径样式

全路径样式

安装 dconf-editor

1
sudo apt install dconf-editor -y

打开后,按下 ctrl+L,进入路径 /org/gnome/nautilus/preferences/

开启 always-use-location-entry 这项即可。

wireshark 安装

参考文章:【Tools】Wireshark 在 Linux 系統下的安裝及使用

wireshark 可以通过 apt 安装旧版,也可以通过 ppa 安装新版。安装时会出现弹窗,大概意思是要不要授予非 root 用户监听权限,选 yes。

之后

1
sudo vim /etc/group

找到 wireshark 这一行,冒号后面添加当前用户,比如

1
wireshark:x:124:

改为

1
wireshark:x:124:zbttl

重启即可。

vscode 点击关闭按钮整个界面卡死

20.7.2 在 code-insiders 可复现。

解决方法:

  1. 先关掉 code-insiders。通过其他 tty 或者 ssh 链接,使用命令 top,一般前两个 cpu 占用大户,即 code-insider 和 gnome-shell,是本次卡死问题的主角,记住他们的进程号(pid)。

  2. 强行关闭 code-insiders。

    1
    kill -9 [code-insiders pid]
  3. 获取 gnome-shell 重启指令

    1
    ps -ef | grep gnome-shell 

    一般会出好几条,找到对的上上面卡死的 gnome-shell pid 的那条,一般是

    1
    /usr/bin/gnome-shell
  4. 干掉 gnome-shell

    1
    kill -9 [gnome-shell pid]
  5. 重启

    1
    /usr/bin/gnome-shell

    此时如果用的 xshell,估计会叫你下载 xmanager,不用管,取消就好。然后实际那边应该就能动了。

zsh

直接参考 19.4.14 的 termux 文章。。。

结果发现不太对,很多细节对不上,重写吧。那篇文章详细写的部分我就一笔带过。

安装

1
2
sudo apt install zsh -y
zsh

第一次打开会弹出欢迎界面(仅桌面端),提醒你对 zsh 进行一些设置

当然你可以选 1 看看,但由于后面我们装了 Oh My Zsh 后这些设置就没用了,所以推荐选 2 就行了。

坑 1:修改默认 shell

1
chsh -s zsh

提示需要输入密码。如果是 vps,这时别不输入密码就退出了!否则 ssh 和 vnc 都进不来了。。。只能重装。(另外,也可以执行完下面的步骤再来运行这个指令)。

但输入密码后大概率会提示 zsh 无效。

参考这里的解决方案:chsh always asking a password , and get PAM: Authentication failure

1
vim /etc/pam.d/chsh

将

1
auth       required   pam_shells.so

改为

1
auth       sufficient   pam_shells.so

或者直接运行:

1
sudo sed s/required/sufficient/g -i /etc/pam.d/chsh 

如果仍然错误(提示 shell 不存在 chsh: Warning: zsh does not exist),查看一下 shell 列表:

1
cat /etc/shells

然后使用 which zsh 看一眼。

看起来得改改命令:

1
sudo chsh -s /usr/bin/zsh zbttl

再去 /etc/passwd 看看,或者用下一个命令刷新生效(也许还需要重启,vps 一般直接用 root,所以断开重连就行,下面再涉及这个操作,我都用重连来替代)后使用 echo $shell,确认已经在使用 zsh 了。

1
source ~/.zshrc

安装 oh my zsh,更换主题。

1
2
3
4
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
sed -i '/^ZSH_THEME=/c\ZSH_THEME="powerlevel10k/powerlevel10k"' ~/.zshrc
source ~/.zshrc

转换为 zsh 后,之前的 bash 里的历史记录不再显示,但可以迁移过来。

1
2
wget https://gist.githubusercontent.com/goyalankit/a1c88bfc69107f93cda1/raw/ed58ae6b8929021353001b1826694780c033291a/bash_to_zsh_history.rb
ruby bash_to_zsh_history.rb

坑 2:字体支持

之后重连,进入 p10k 设置界面,来了。这个坑在 vps 端和桌面端都有。vps 端,只要 vps 控制端(windows,windows 下字体相当好装)装好 powerline 的字体,问题都不大。但 vps 端本身也有问题,问题出在 xshell 等 terminal 上:xshell 在 powerlevel10k 的设置中无法进入 prompt style 这项中(一路下一步你发现没有这项),最后设置完效果是纯字符型的,不好看;但如果从能够弹 prompt stlye 的地方设置好了,再从 xshell 进入你会发现显示没问题(我在本地端的 debian 上开开 ssh 然后用 xshell 链接发现了这个问题)。

那么 vps 远程端没办法实机登录(vnc 下字体不好设)怎么办呢,换个 terminal 就好了。windows terminal 并未出现这个问题。

单纯的桌面端,debian 下安装字体比较麻烦。直接从字体管理器安装字体会直接卡死,得手动命令行装。将字体放到某一个文件夹中,在文件夹内打开终端。

1
2
3
4
5
6
7
sudo mkdir /usr/share/fonts/truetype/CustomizedFonts
sudo cp *.ttf /usr/share/fonts/truetype/CustomizedFonts
sudo chmod 777 -R /usr/share/fonts/truetype/CustomizedFonts
cd /usr/share/fonts/truetype/CustomizedFonts
sudo mkfontscale
sudo mkfontdir
sudo fc-cache

重启后在终端启用新字体即可。另外字体可以从我以前写的 powershell 攻略中的 nerd fonts github 项目内获取。我也尝试过用那个方法手工做的 Cascadia Code,后来发现会导致错位,还是直接用官方的好。

另外字体以显示(控制)端为准,也就是即使 vps 远程端装好了字体,控制端没装好也是乱码;反之亦然。

坑 3:系统 / 用户变量 /alias

参考文章:

其实也不能算个坑,可以说是个 feature。

我们先了解一下 linux 这个系统变量是怎么整的:

  1. 用户变量:只对当前用户有效,放在用户目录下,文件以隐藏形式呈现(前面加.)
    1. rc 文件:启动终端时加载,如默认的 .bashrc,zsh 的 .zshrc。一般放快捷路径(alias)。
    2. profile 文件:登录后第一次打开终端加载,如默认的 .profile,zsh 的 .zprofile。一般放懒得使用 systemd 或 supervisor 启动的自启程序,以及系统/用户变量(export xxx)。but,从图形界面运行的终端默认不加载这个文件,如果要加载,需要在终端中找到类似「以登录 shell 方式运行命令」的选项。当然有种说法,这么干会搞乱登录环境,那么对于这些变量,也可以直接写在 rc 文件中(后果是反复用 source 或者打开多个终端的时候,查看变量的话会发现重复加载了若干个写在 rc 文件中的变量,但并没有什么严重的后果;而自启程序就用 systemd 等替代就好了)。
  2. 系统变量。对所有用户起效。放在 /etc/ 目录下,不一定是某一个文件(默认文件名和系统有关),也不一定直接位于/etc 下(zsh 就位于 /etc/zsh 下)。和用户变量不同,不需要隐藏。
    1. rc 文件。默认的可能是 bash.bashsrc;zsh 固定为 zshrc;
    2. profile 文件:默认为 profile;zsh 为 zprofile。

所以,接下来我所讲的部分变量设置我将以放在 /etc/zshrc 处写命令,而重连则使用

1
sudo source /etc/zsh/zshrc

坑 4 :zsh 下 ssh 键位错误

参考:zsh 中加入 home end,以及小键盘的支持

小键盘区和功能键区在 zsh 下功能错误。这次就不是 xshell 的锅了,ssh 过去的都这个毛病。解决方法有两种:

  1. 通过 xshell。在属性中,选择终端->终端类型,改为 linux。

  2. 在 /etc/zsh/zshrc 中加入

    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
    36
    37
    38
    # key bindings
    bindkey "\e[1~" beginning-of-line
    bindkey "\e[4~" end-of-line
    bindkey "\e[5~" beginning-of-history
    bindkey "\e[6~" end-of-history
    # for rxvt
    bindkey "\e[8~" end-of-line
    bindkey "\e[7~" beginning-of-line
    # for non RH/Debian xterm, can't hurt for RH/DEbian xterm
    bindkey "\eOH" beginning-of-line
    bindkey "\eOF" end-of-line
    # for freebsd console
    bindkey "\e[H" beginning-of-line
    bindkey "\e[F" end-of-line
    # completion in the middle of a line
    bindkey '^i' expand-or-complete-prefix
    # Fix numeric keypad
    # 0 . Enter
    bindkey -s "^[Op" "0"
    bindkey -s "^[On" "."
    bindkey -s "^[OM" "^M"
    # 1 2 3
    bindkey -s "^[Oq" "1"
    bindkey -s "^[Or" "2"
    bindkey -s "^[Os" "3"
    # 4 5 6
    bindkey -s "^[Ot" "4"
    bindkey -s "^[Ou" "5"
    bindkey -s "^[Ov" "6"
    # 7 8 9
    bindkey -s "^[Ow" "7"
    bindkey -s "^[Ox" "8"
    bindkey -s "^[Oy" "9"
    # + - * /
    bindkey -s "^[Ol" "+"
    bindkey -s "^[Om" "-"
    bindkey -s "^[Oj" "*"
    bindkey -s "^[Oo" "/"

    重连生效。

接着装一堆插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt install python
git clone https://github.com/zsh-users/zsh-syntax-highlighting $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-completions $ZSH_CUSTOM/plugins/zsh-completions
git clone git://github.com/joelthelion/autojump.git
cd autojump
./install.py
cd
[ -z "`grep "autoload -U compinit && compinit" ~/.zshrc`" ] && echo "autoload -U compinit && compinit" >> ~/.zshrc
sed -i '/^plugins=/c\plugins=(git z zsh-syntax-highlighting zsh-autosuggestions zsh-completions autojump)' ~/.zshrc
source ~/.zshrc
#实际上不需要,除非是单独安装的autojump,sed那条命令已经包含了下面这条命令的功能。
#echo "[[ -s $HOME/.autojump/etc/profile.d/autojump.sh ]] && source $HOME/.autojump/etc/profile.d/autojump.sh" >> ~/.zshrc
#不一定需要,如果使用中输入cd经常报错 _z_dirs:2: no such file or directory:/root/.z 就运行一句
#wget https://raw.githubusercontent.com/rupa/z/master/z.sh -O ~/.z

坑 5:因不正常关机导致 zsh history 报错

1
2
3
4
cp .zsh_history zsh_history
rm -f .zsh_history
strings zsh_history>.zsh_history
fc -R .zsh_history

最后一句是仅存在于zsh中的fc语句,意思是从某文件中读取历史记录

另外 zsh 还有个 feature(但不一定每一次都能触发),复制粘贴多行的时候并不会和传统 bashrc 一行行运行而是堆在一起,回车时才会一起运行。好处是如果是几句常用的命令,利用上下方向键找历史记录时会直接找到拼成一块的这几个语句;坏处是利用 history 查看历史的时候看见这些句子被拼成一句,中间用 \n 做间隔,直接复制出来没法用,得自己处理。

debian 和 ubuntu 显著区别(以及 debian ppa 使用)

  1. debian 的内核比较旧而稳定,ubuntu 通常用的是最新内核。旧内核也有好处,bbr 和锐速,以及 fullcone 的那个内核组件比较好装。

  2. debian 以下操作均只能通过命令完成:

    • 换源
  3. ubuntu 在非 root 状态下使用的命令若尚未安装,会给一句 apt 命令提示告诉你应该装啥。

  4. ubuntu 的文件管理器的地址栏切换为可复制的文字路径的方法很隐蔽,需要快捷键 ctrl+L。当然也有办法让其一直工作在可复制文件路径下。需要先安装 dconf-editor。

    1
    apt install dconf-editor -y

    搜索应用程序 dconf,就能看到 dconf 系统配置编辑器。打开后从 org –> gnome –> nautilus –> preferences 进入就能看到相关选项了。

  5. debian 没有 ppa 功能,虽然也能用,但比较麻烦(但因为 ubuntu 内核新 ppa 里面有些内容也很新,所以 debian 死活装不上,比如最新的 wireshark,而旧版 wireshark 无法探测到本地的网卡,导致其实没法用。debian 下 ppa 的具体使用方法参考这里:在 Debian 上添加 PPA 并安装软件包。文章中有一部比较难以理解:

    1
    $ sudo sed -i 's/disco/bionic/g' /etc/apt/sources.list.d/lazygit-team-ubuntu-daily-disco.list

    实际上就是进入 /etc/apt/sources.list.d,在上一步 ppa 中会下载两个跟你要装的软件相关的源文件,里面的系统名太新了(比如我下到的就是 groovy,而上面那行代码是 bionic,作者选择替换成当时最新的 lts bionic 系统)可以 wiki 查看,选择一个合适的版本。

    另外也可以通过软件 ppa 页面,查看当前版本是否有相关的包,比如 wireshark 界面:

    很明显确实没有最新的 groovy 版本,而只有上一个版本 focal 版,那么我们可以改成 focal 或者直接复制粘贴图中的两行代码。

    另外也可以翻翻 sid 包,有没有相关的包,我反正翻到 sid 包里面也有 wireshark 的最新版本。

    从这里找一个最近的源,比如 http://ftp.cn.debian.org/debian,按网页顶上的要求拼接一下。为了避免和正常源混在一起,我们新开一个源文件,命名为 sid.list。

    1
    2
    3
    sudo sh -c 'printf "deb http://ftp.cn.debian.org/debian sid main " > /etc/apt/sources.list.d/sid.list'
    sudo apt update
    sudo apt -t sid install wireshark -y

    但很遗憾,无论用 ppa 直接安装,ppa 直接编译还是 sid 源的方法安装 wireshark 都报错,依赖不对,估计手动编译也是一样的结果。

(12.22 更新) 过期的 ubuntu

虚拟机的 ubuntu 是去年才装的。

看了一下 ubuntu 有普通版和 long-term 版,long-term 版?应该是和 windows ltsb / ltsc 一个性质的东西吧。

「装在虚拟机里面的东西要什么 long-term,给我来最新的」然后我就装了 19.10。

结果最近 apt update 总是报错,说是什么

仓库 “http://mirrors.tuna.tsinghua.edu.cn/ubuntu eoan-updates Release” 没有 Release 文件。

是不是清华的源又整活了?用「软件与更新」换个源看看。

结果选择最佳服务器的时候就告诉我网络有问题(肯定不是网络原因,科学和 dns 这些我熟的很),退出的时候整个软件直接崩了。。。

兜兜转转我得出一个结论:这个 ubuntu 版本今年 7 月过期,连着源一块过期访问不到了。(这比 windows 10 版本寿命还短)

怎么办?尝试升级,好在和 window 不一样,普通版本也能升到 lt 版,升到 lt 版不折腾了。

关键是升级前要 apt update 的啊,这 apt update 都运行不了怎么办?

apt update 失效

参考 Unable to ‘apt update’ my Ubuntu 19.04,旧的源过期了不过会存档起来,但网址也改了。但我用的是镜像源,镜像源我猜不会改网址而是直接删库。。。保险起见找一下初始源。结果没找到官方的,找到一个这样的:malikalichsan/sources.list

瞄了下大概的地址格式

1
deb http://id.archive.ubuntu.com/ubuntu/ eoan main restricted

用 vscode 把 archive 批量替换为 old-releases

1
deb http://id.old-releases.ubuntu.com/ubuntu/ eoan main restricted

update 一看,找不到仓库。对比一下网上的其他源地址,我们这个地址前面的 id 好突兀,删掉

1
deb http://old-releases.ubuntu.com/ubuntu/ eoan main restricted

成了。

do-release-upgrade 也失效

ubuntu 也有专属的系统更新命令,那就是 sudo do-release-upgrade。然后我运行了一边,又告诉我没网络了。。。。

1
Failed to connect to https://changelogs.ubuntu.com/meta-release. Check your Internet connection or proxy settings

继续问谷歌:Failed to connect to http://changelogs.ubuntu.com/meta-release-lts after upgrade

说是删掉 /var/lib/ubuntu-release-upgrader/release-upgrade-available 这个文件,然后用 /var/lib/ubuntu-release-upgrader/release-upgrade-motd 这个程序再获取一遍地址。

没用,甚至运行这个 release-upgrade-motd 直接报错无网络。

算了,直接大力出奇迹好了。用 debian 的更新方法。

但话说 ubuntu 最新 lts 的版本缩写在 url 内怎么表示?等等上面那个报错信息里面不是有个网址。

打开看看。

很好,直接换:

1
2
sudo cp  /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/eoan/focal/g' /etc/apt/sources.list

更新:

1
sudo apt update&&sudo apt upgrade&&sudo apt dist-upgrade

收工。