ubuntu 踩坑日记

最后更新于:2022年8月29日 上午

Mac M1 上装 ubuntu 的想法已经破灭(不会再去浪费时间了,最多花钱用 PD),Windows 的 Hyper-V 也弃坑了,双系统也算了。最终选择了 WMware Player。

微软开源三板斧:github, vscode, wsl 用的挺好的。但是 wsl 无法开启音视频,从而选择了只能选择双系统或者虚拟机了。考虑到双系统还是不方便。WMware Player 有免费版,所以还是 WMware Player 吧。而且虚拟机好迁移。

后来我写好脚本做系统安装完后的初始化,然后把虚拟机备份。供换电脑使用

zsh 配置

先参考 oh my zsh 安装详解,再看 字体安装,然后 terminal 选择 custom command: /usr/bin/zsh

添加下面配置

1
2
3
ZSH_THEME="essembeh"
plugins=(git zsh-syntax-highlighting zsh-autosuggestions)
DISABLE_AUTO_UPDATE="true"

升级

  • 18.04 --> 20.04:sudo sed -i 's/binoic/focal/g' /etc/apt/sources.list 然后 sudo apt updatesudo apt -y dist-upgrade
  • 20.04 --> 22.04 同理(s/binoic/focal/g 改成 s/focal/jammy/g),有风险

低版本 Ubuntu 安装高版本软件

perf 的使用

首先直接输入 perf 会提示你安装一些 tool,安装好之后, - 设置 /etc/sysctl.conf,添加一句 kernel.perf_event_paranoid = -1,然后 sudo sysctl -p /etc/sysctl.conf, - 再 sudo sh -c "echo 0 > /proc/sys/kernel/kptr_restrict",不然没有符号

使用和现实可以用 speedscope 或者 FlameGraph 可以参考 Linux笔记-性能调优工具perf

VPN 配置

  • 安装 openfortivpn
  • 编辑 /etc/openfortivpn/config 如下
1
2
3
4
5
host =
port = 10443
username =
password =
trusted-cert = 这行先不用写, 第一次会报错, 说要把一个 cert 字串加入到 trusted-cert 中, 到时加这一行, copy-paste 屏幕中的 cert

弱网环境

查看当前的网络情况

nload -m 一般会出现一个 Device lo [127.0.0.1] 还有另外一个 Device(这一个后面会用,比如我的是 wlp1s0),如果没有安装就 sudo apt 安装一下。

然后进行弱网设置

1
2
3
4
sudo tc qdisc add dev wlp1s0 root netem delay 500ms       #设置500ms的延迟
sudo tc qdisc add dev wlp1s0 root netem loss 50% #设置50%的丢包率
sudo tc qdisc add dev wlp1s0 root netem delay 500ms loss 50% #同时设置
sudo tc qdisc del dev wlp1s0 root #删除设置

apt-key

1
2
sudo apt-key list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys xxxxxx

keyserver.ubuntu.com 有时需要改成 ktp://keyserver.ubuntu.com:80 或者 ktps://pgp.mit.edu,可参考这里:https://superuser.com/questions/1250681/why-am-i-unable-to-fetch-pgp-keys-from-commandline

ubuntu添加源后,更新提示缺少公钥,详细可参考官方文档

再不行的话: https://einverne.github.io/post/2019/09/gpg-keyserver-receive-failed-server-indicated-a-failure.html

GPG

GPG 入门github 上使用

开机自启动

/etc/init.d/ 中新建一个 my.sh,然后参考其它的 .sh 的写法,写好之后记得 ./my.sh 跑一下确保本身无误(没权限的话 chmod +x

参考:https://www.cnblogs.com/Areas/p/13439000.html

system program problem detected

out of sight, out of mind,不让它显示就行了

先删除 /var/crash/ 中的所有文件,再把 /etc/default/apport 中的 enable=1 改成 enable=0

删除安装失败的包

sudo dpkg --configure -a 查看安装失败的包,删除掉它们 sudo dpkg --remove --force-remove-reinstreq package_name

也可参考 https://ubuntuqa.com/article/10754.html 操作

Hyper-V(弃)

Windows 10 家庭普通版也能使用,网上有简单教程

  • Hyper-V 全屏:https://www.jianshu.com/p/22cffcc4d5b9
  • Hyper-V 物理机/虚拟机 共享复制粘贴:https://www.cnblogs.com/kendoziyu/p/14741360.html

最后网络把我搞的心态爆炸,直接全给它删了,毁灭吧,烦了

双系统(弃)

  1. 修改 ubuntu 的 /etc/default/grub 的默认选择延迟为 5s。然后 sudo update-grub > 如果要默认 windows 可以修改对应的 BIOS 为 windows 优先启动,启动 Ubuntu 可以通过 BIOS 进入
  2. 更换上交镜像源, 或者中科大镜像源(直接再 Software & Update 中选即可,不用手动改 /etc/apt/sources.list
  3. apt update, apt install, apt upgrade
  4. 安装 vscode, curl, vim, xsel(剪切版), htop, tmux, perf, sagemath, haskell, python
  5. alias open=nautilus(ubuntu 22.04 不再需要)
  6. 利用 scp 文件传输(目标机器需要开启端口)
    1
    2
    3
    sudo apt-get update
    sudo apt-get install openssh-server
    sudo ufw allow 22
    然后保持两台电脑在一个局域网上然后查看各自 ip,然后推流: scp -r xxx/ username@xxx.xxx.xxx.xxx:~ 就可以把本机 xxx/ 下所有文件传输到对应 ip 的机器上。也可以拉流:scp -r username@xxx.xxx.xxx.xxx:xxx/ .
  7. kill 杀死进程需要配合 top 查看 pid,但是 pkill 可以直接根据进程名杀死进程
  8. 按住一个 htop 比 top 好用不少,mac 上也可以用 homebrew 安装
  9. Ubuntu 显示时间到秒:gsettings set org.gnome.desktop.interface clock-show-seconds true
  10. bash 中显示 git 分支 效果很差,没啥意义

sudo apt-cache search 是个好东西, sudo apt install -y 也是

笔记本设置盒盖不休眠

https://www.jianshu.com/p/3fe469fc60c9

如果设置了不用 笔记本 的显示器,貌似就不用这么设置了

无法外接显示器

https://askubuntu.com/a/1251457

网络问题

如果无法连接 wifi,三种方式联网

  • 有线

  • 安卓手机 Usb 连接到电脑,然后手机个人热点里设置 usb 共享网络

  • 安卓手机蓝牙连接电脑,然后手机个人热点里设置蓝牙共享网络

  • ubuntu 18.04 切记关闭 secure boot

  • 安装驱动

  • 有 wifi 图标无 wifi 列表

也可以连好网络后可参考 https://juejin.cn/post/7022521662880874527 再不行可参考 https://blog.rottenwifi.com/ubuntu-no-wifi-adapter-found/,可能需要安装:backport-iwlwifi-dkms,如果还是不行,建议重新换个镜像安装(一般是硬件不匹配导致的),是在不行换镜像

安装完无法进入系统

可参考:https://www.dell.com/support/kbdoc/zh-cn/000123893/%E6%89%8B%E5%8A%A8-nomodeset-%E5%86%85%E6%A0%B8%E5%BC%95%E5%AF%BC-%E8%A1%8C%E9%80%89%E9%A1%B9-%E7%94%A8%E4%BA%8E-linux-%E5%BC%95%E5%AF%BC

如果还不行,可以尝试进入 BIOS 关闭 safe boot

重装 win10 后,Ubuntu 找不到了

可参考:https://bktus.com/zh-cn/archives/2920

僵尸鼠标

开启后多一个僵尸鼠标:https://forum.ubuntu.org.cn/viewtopic.php?t=491536

登陆后花屏

可参考 https://blog.csdn.net/supe_tan/article/details/78336133

Ubuntu 开机慢

参考 https://blog.csdn.net/qq_35251760/article/details/111037280

windows 时间差了 8h

管理员权限打开 PowerShell 然后输入: reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1

参考:https://www.jianshu.com/p/cf445a2c55e8

拓展分区大小

用着用着就觉得 Ubuntu 比 Windows 用的多,而且给同事一个用户账号导致空间不足,然后我去查了一下分区方式。总结下来步骤如下

  • win + r 打开 diskmgmt.msc 然后压缩出一块(未分配的)空间出来
  • 找一个有 ubuntu 的 U 盘作为引导盘,然后开机的时候进入 BIOS,然后调整 U 盘作为启动盘
  • 然后它默认有 gparted,然后 sudo gparted 就可以拓展 Ubuntu 的分区,点确定。重启即可

小功能合集

1
2
3
4
df # 查看各个分区大小
find . -type f | wc -l #统计文件个数 https://blog.csdn.net/e15273/article/details/78824570
adduser xxx # 创建用户,并且创建用户目录
passwd xxx

Vi(m) 入门

所有类 Unix 系统都自带 vi,所以学习 vi 收益满满!

参考:如何高效使用VimLinux vi/vim | 菜鸟教程

vi(m) 工作模式图解

vimWorkMod
常见命令(区分大小写) | 含义 |
-- --------------------------------- | ---------------------------------------------------- |
gg | 移动到当前文件的第一行 |
G | 移动到当前文件的最后一行 |
M | 移动到当前文件的中间一行 |
Ctrl + o | 移动到上一次编辑的地方 |
:n , 其中 n 为数字 | 输入一个 :,再输入一个 数字,按回车,快速跳到某一行 |
ndd,其中 n 为数字(不写默认为 1) | 删除光标所在的行,并且内容在剪切板 |
nyy,其中 n 为数字(不写默认为 1) | 复制光标所在的行,并且内容在剪切板 |
D | 删除 光标 到行 末尾 所有的内容,并且内容在剪切板 |
p | 粘贴剪切板的内容到光标处 |
/word | 向光标之下寻找一个名称为 word 的字符串 |
?word | 向光标之上寻找一个字符串名称为 word 的字符串。 |
n | 这个 n 是英文按键。继续搜索下一个目标 |
N | 这个 N 是英文按键。与 n 刚好相反 |
Ctrl + v | 进入列选择模式 |
Shift + v | 进入行选择模式 |
u | 复原前一个动作 |
Ctrl+r | 重做上一个动作 |
Ctrl+n | 常规(Normal)补全 |
Ctrl+o | 全能(Omni)补全 |

.vimrc 超简洁设置

1
2
3
4
5
syntax on    " 语法高亮
set nu " 行数显示
set ts=4 " tab 宽度
set spell " 语法拼写检测
set noexpandtab " 不将 tab 转换成空格

vi(m)键盘图

vim-vim

vi(m) 命令思维导图

vim

Linux Shell 入门

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

参考:Shell 教程 | 菜鸟教程这些Shell编程必备知识你都掌握了吗?

Hello Shell

vim test.sh 编辑下面内容

1
2
#!/bin/bash
echo "Hello Shell "

esc + :wq 保存,执行下面命令

1
2
3
4
5
6
#使脚本具有执行权限
$ chmod +x test.sh
#执行脚本,若报错则输入 chmod u+x test.sh
$ ./test.sh
#无执行权限时
$ sh ./test.sh

Shell 变量

1
2
3
4
5
6
7
8
hello=123 # 变量定义
readonly my_blog="izlyforever.com" #只读变量(常量)定义
echo $my_blog #变量引用方式一,不推荐
echo ${my_blog} #变量引用方式二,推荐
for skill in C++ Python SageMath; do
echo "I am good at ${skill}Script"
done
unset my_blog #删除变量

变量定义 = 两边不能有空格!

Shell 字符串

1
2
3
4
5
6
myBlog='izlyforever.com' #单引号里的任何字符都会原样输出, 不支持转义
str="My Blog is \"$myBlog\"! \n"
echo -e $str # -e 开启转义
echo 'hello, ' ${myBlog} " Welcome!" #单引号双引号都可以做字符拼接
echo ${#myBlog} #获取字符串长度
echo ${myBlog:0:6}

Shell 传递参数

  • $n:传入参数,例如:$0 $1 $2 分别表示,脚本名,第一个参数,第二个参数
  • $#:脚本后面跟的参数个数(不包含脚本名)
  • $@:所有参数,并且可以被遍历
  • $*:所有参数
  • \$$:当前脚本的进程 ID (没有 \)
  • $?:上一条命令的退出状态

Shell 数组

1
2
3
4
5
6
array=(A B "cpp" D)
echo ${array[2]}
echo "数组元素个数为: ${#array[*]}" # @* 都对应着全部内容
echo "数组元素为: ${array[@]}"
echo ${array[@]:1:4}
echo ${array[@]::3}

Shell 运算符

  • 算数运算符: + - * / % = == !=
  • 关系运算符:-eq -ne -ge -lt -gt -le
  • 布尔运算符:! -o -a (取否,or,and)
  • 逻辑运算符:&& || ,需要: [[ expr ]]
  • 字符串运算符:= != -z -n $
  • 文件测试运算符:-b -c -d -f -g -k -p -u -r -w -x -s -e
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
a=11;b=22
val=`expr $a + $b`
echo "a + b : $val"

if [ $a == $b ];then
echo "a 等于 b"
elif [ $a -gt $b ];then
echo "a 大于 b"
elif [ $a -lt $b ];then
echo "a 小于 b"
else
echo "没有符合的条件"
fi

if [[ $a -lt 100 && $b -gt 100 ]];then
echo "返回 true"
else
echo "返回 false"
fi

a="abc"
if [ -n $a ];then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi

expr 是一款表达式计算工具,使用它能完成表达式的求值操作

条件表达式要放在方括号之间,并且要有空格,例如L:[$a==$b] 是错误的,必须写成 [ $a == $b ]

Shell printf 命令

printf format-string [arguments...]

例如: printf "%-8s = %10.4f\n" pi 3.141592653

%s %c %d %f 都是格式替代符

%-8s 指一个宽度为 8 个字符(- 表示左对齐,没有则表示右对齐),如果不足则自动以空格填充,超过也会将内容全部显示出来。

Shell 流程控制

条件控制

  • if else-if else 已经在上面例子中提过了。

  • case esac 的奇葩写法,吐了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
    1) echo '你选择了 1'
    ;;
    2) echo '你选择了 2'
    ;;
    3) echo '你选择了 3'
    ;;
    4) echo '你选择了 4'
    ;;
    *) echo '你没有输入 1 到 4 之间的数字'
    ;;
    esac

    read 输入快乐啊!

循环控制:for while until break continue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 例子来自 https://www.runoob.com/linux/linux-shell-process-control.html
for str in 'This is a string'
do
echo $str
done
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done

a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done

Shell 函数

1
2
3
4
5
6
7
8
9
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
echo "-----函数开始执行-----"
funWithParam 3 . 1 4 1 5 9 2
echo "-----函数执行完毕-----"

Shell 输入/输出重定向和文件包含(特别好用!)

1
2
3
4
echo "菜鸟教程:www.runoob.com" > users
cat users
echo "菜鸟教程:www.runoob.com" >> users
cat users
  • test2.sh 中调用 test.sh:source ./test.sh

  • 管道运算符 |,是 unix 一个很强大的功能。

    command 1 | command 2

    把第一个命令 command 1 执行的结果作为 command 2 的输入,例如:

    $ ls -s|sort -nr

获取文件拓展名

Shell 通配符

Linux 工具