桌面版 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),比如 ifconfigservice,还有 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

收工。