Yu's Blog

do something!

加载系统

  • kernel.ld 描述可执行程序或库在目标内存中的布局方式。它定义了不同的程序段(如代码段、只读数据段、可读写数据段、未初始化数据段等)应该如何在内存中排列,以及指定了一些特殊符号的值,这些符号可以在程序的其他部分被引用,以了解内存布局的相关信息。
  • 内核text段加载到物理内存0x80000000处;随后是trampoline.S(用户和内核的跳转代码).这两段都是按页对齐的;随后是rodata,data,bss段.
  • entry.S 为每个核心配置内核栈,然后跳到start处.
  • start.c 执行一些只允许在机器模式下进行的配置,然后切换到主管模式。
  • main.c 初始化几个设备和子系统之后,它通过调用userinit 创建第一个进程(initcode)。

main.c

  • kinit(): 将所有空闲内存添加到freelist.
  • kvminit(): 设置内核空间pagetable.(除了trampoline 和 kernal stacks外,其他内存是直接映射)
  • kvminithart(): 内核页表指针存到satp中,开启页表.

  • -S:synchronize 同步
  • -R:remove 删除
  • -Q:query 查询本地

安装

1
sudo pacman -S 包名 # 安装软件包的同时会安装该包需要的依赖

更新

1
2
3
4
5
sudo pacman -Sy # 更新软件源,如果前一段时间已更新过,则pacman不会再去查找更新
sudo pacman -Syy # 强行更新软件源
sudo pacman -Su # 更新软件包
sudo pacman -Syu # 更新软件源并更新软件包
sudo pacman -Syyu # 强行更新软件源并更新软件包

搜索

1
sudo pacman -Ss 包名 # 搜索支持正则表达式

删除

1
2
3
4
sudo pacman -R 包名
sudo pacman -Rs 包名 # 删除该软件与该软件的依赖包
sudo pacman -Rnsc 包名 # 删除该软件与该软件的依赖包并删除全局配置文件,个人配置文件不会删除 (推荐使用这种方法!)
sudo pacman -Sc # 删除缓存(-R删除包之后不会清除文件,只是放到了/var/*目录下)

查询本地软件包

1
2
3
4
5
6
7
sudo pacman -Q # 本地所有软件包:系统自带和用户下载的
sudo pacman -Qe # 本地所有软件包:用户下载的
sudo pacman -Qeq # 本地所有软件包(不显示版本号):用户下载的
sudo pacman -Qs 包名 # 查询本地所有软件中有哪些带有该包名称
sudo pacman -Q | wc -l # 查看一共有多少软件
sudo pacman -Qdt # 查询不再被依赖的软件包(孤包)
sudo pacman -R $(pacman -Qdtq) # 删除不再被依赖的软件包

安装系统

确定启动模式(UEFI/BIOS)

1
2
3
4
5
# 设置终端字号
setfont /usr/share/kbd/consolefonts/LatGrkCyr-12x22.psfu.gz

# 如果提示目录不存在,就是bios,否则是uefi
ls /sys/firmware/efi/efivars

联网(有线网不需要进行这步)

1
2
3
4
5
6
7
8
$ iwctl   //会进入联网模式
[iwd]# help //可以查看帮助
[iwd]# device list //列出你的无线设备名称,一般以wlan0命名
[iwd]# station <device> scan //扫描当前环境下的网络
[iwd]# station <device> get-networks //会显示你扫描到的所有网络
[iwd]# station <device> connect <network name>
password:输入密码
[iwd]# exit //退出当前模式,回到安装模式

更新系统时间

1
2
3
4
# 更新系统时间是有必要的,因为下载软件时,服务器会验证系统时间,
# 如果时间不正确,可能出现下载失败的情况。
timedatectl set-ntp true
timedatectl status # 查看一下系统时钟状态

分区

查看系统磁盘

1
fdisk -l

进入图形化分区工具进行分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cfdisk /dev/<硬盘名称>
# 如果提示你要选MBR还是GPT: UEFI启动选择gpt,BIOS启动选择dos,选中后回车。
# 1. BIOS启动只需要俩个分区,根分区和swap分区

# 2. UEFI启动需要分三个区:
# 1. boot分区,用于存储启动信息,类型为efi system
# 2. swap分区,也就是交换分区,类型为linux swap
# 3. 系统分区,用于安装系统和软件的分区,类型为linux

# 分区操作:
# 1.选中new
# 2.输入分区大小后选中primary回车
# 3.选中type,修改分区类型(根分区是Linux类型,swap分区是Linux swap/Solars类型)
# 4.确认分区无误后选择write 回车,输入yes,选择quit退出图形化分区界面
# 5.命令行输入lsblk,查看分区的初始状态

格式化分区

BIOS格式化

1
2
3
mkfs.ext4 /dev/<硬盘名称>   # eg:mkfs.ext4 /dev/sda2 格式化系统分区
mkswap /dev/<硬盘名称> # 格式化swap分区
swapon /dev/<硬盘名称> # 激活swap分区

UEFI格式化

1
2
3
4
mkfs.fat -F32 /dev/sda1		# 格式化boot分区
mkswap /dev/sda2 # 格式化swap分区
swapon /dev/sda2 # 激活swap分区
mkfs.ext4 /dev/sda3 # 格式化系统分区

挂载分区

BIOS挂载

1
mount /dev/sda2 /mnt		# 将系统分区/dev/sda2挂载到/mnt目录

UEFI挂载

1
2
3
mount /dev/sda3 /mnt		# 将系统分区/dev/sda3挂载到/mnt目录。
mkdir /mnt/boot # 创建boot分区的挂载点。
mount /dev/sda1 /mnt/boot # 将boot分区/dev/sda1挂载到/mnt/boot目录(需要在/mnt下新建一个boot文件夹)。

修改镜像源

1
2
3
4
5
# 很重要,不然等到天荒地老
vim /etc/pacman.d/mirrorlist # 加上一个国内源
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch

pacman -Syy # 更新一下

安装linux

1
2
3
4
5
6
7
8
9
pacstrap /mnt base base-devel linux linux-firmware linux-headers
pacstrap /mnt vim bash-completion iwd dhcpcd net-tools openssh man
# vim 命令行编辑工具
# bash-completion 命令行补全工具
# iwd 无线管理工具
# dhcpcd 有线管理工具
# net-tools 网络工具
# openssh ssh服务
# man 使用手册

写入分区表

1
2
genfstab -U /mnt >> /mnt/etc/fstab
cat /mnt/etc/fstab # 检查fstab文件是否正确

进入系统进行相关配置

进入系统

1
arch-chroot /mnt

设置时区

1
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

同步硬件时钟

1
hwclock --systohc

本地化设置

1
2
3
4
5
6
7
8
9
vim /etc/locale.gen
# 找到下面两项,取消注释
en_US.UTF-8 UTF-8 # 英
zh_CN.UTF-8 UTF-8 # 中

locale-gen # 生成locale信息
locale -a # 列出所有启用的locale
echo LANG=en_US.UTF-8 > /etc/locale.conf # 设置系统语言
locale # 查看一下

网络配置

1
2
3
4
5
6
vim /etc/hostname		# 编辑hostname文件,输入主机名(可以自己命名)
vim /etc/hosts

127.0.0.1 localhost
::1 localhost
127.0.1.1 主机名.localdomain 主机名

安装grub引导

BIOS 安装 grub 引导程序

1
2
3
4
5
6
7
8
9
10
pacman -S grub
grub-install /dev/sda # 安装grub。
grub-mkconfig -o /boot/grub/grub.cfg # 生成grub的配置文件。

若报错则执行下面
vim /etc/default/grub
GRUB_DISABLE_OS_PROBER=false # 取消GRUB_DISABLE_OS_PROBER=false注释(让grub识别别的系统)
# 建议修改GRUB_TIMEOUT,加快启动时间

grub-mkconfig -o /boot/grub/grub.cfg # 再执行一次

UEFI 安装 grub 引导程序

1
2
3
4
5
6
7
8
9
10
11
12
13
# 下载grub和efibootmgr软件包
pacman -S grub efibootmgr

# 安装grub
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Arch --recheck
# --bootloader-id=name 其中 name 可以更改为自己想要的名称,建议简短明确

vim /etc/default/grub
GRUB_DISABLE_OS_PROBER=false # 取消GRUB_DISABLE_OS_PROBER=false注释(让grub识别别的系统)
# 建议修改GRUB_TIMEOUT,加快启动时间

# 生成grub的配置文件。
grub-mkconfig -o /boot/grub/grub.cfg
  • 如果出现错误,请回头检查命令是否输入错误或者配置是否出错,安装时的一点错误都可能成为你无法开机的原因或者以后使用时的bug.

设置root密码,新建用户

1
2
3
4
5
6
7
8
passwd
useradd -m -G wheel <用户名>
passwd <用户名>

# 加入sudo,打开 /etc/sudoers
如果EDITOR=vim
执行visudo
找到%wheel ALL=(ALL) ALL 把前面的注释去掉

配置启动项

1
2
3
sudo systemctl enable dhcpcd
sudo systemctl enable sshd
sudo systemctl enable iwd

安装一些硬件设备

1
2
3
4
5
6
7
8
9
10
11
12
13
# CPU编码
pacman -S intel-ucode (intel的cpu装这个)
pacman -S amd-ucode (amd的cpu装这个)

# 显卡驱动
pacman -S xf86-video-intel(Intel核心显卡驱动,用Intel核显就装,否则不用装)
pacman -S mesa nvidia(-lts) nvidia-settings nvidia-dkms nvidia-utils nvidia-prime(nvidia显卡驱动,用nvidia显卡就装,否则不用装)
pacman -S xf86-video-amdgpu (AMD显卡驱动,用amd显卡的就装)

# 这里举两个例子,我的笔记本,i7-11代,搭配intel核显以及3050显卡,所以安装前两个。我的台式机,e3-1230垃圾CPU,搭配HD6950显卡,所以装第三个。nvidia-dkms 与 nvidia-lts 不兼容,如果装lts驱动的话无需安装dkms 。注意:nvidia驱动的安装与前面选择的内核有关,如果你安装的是linux-lts内核,那么需要将nvidia更换为nvidia-lts,linux-zen不支持nvidia显卡(务必对号入座),如果你选择安装新内核,则需要修改一下ibt=off ,否则无法进入系统

# 声卡驱动
pacman -S pipewire (alsa-utils) pipewire-pulse pipewire-jack pipewire-alsa

使用cn源

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
vim /etc/pacman.conf		# 删除Color前的#号

# 在/etc/pacman.conf最后添加
[archlinuxcn]
SigLevel = Optional TrustedOnly
Include = /etc/pacman.d/archlinuxcn

vim /etc/pacman.d/archlinuxcn # 写入以下源
## OpenTUNA (China CDN) (ipv4, https)
Server = https://opentuna.cn/archlinuxcn/$arch
## 北京外国语大学 (北京) (ipv4, ipv6, http, https)
## Added: 2020-05-18
Server = https://mirrors.bfsu.edu.cn/archlinuxcn/$arch
## 腾讯云 (Global CDN) (ipv4, http, https)
## Added: 2018-11-23
Server = https://mirrors.cloud.tencent.com/archlinuxcn/$arch
## 网易 (China CDN) (ipv4, http, https)
Server = https://mirrors.163.com/archlinux-cn/$arch
## 阿里云 (Global CDN) (ipv4, ipv6, http, https)
## Added: 2020-07-03
Server = https://mirrors.aliyun.com/archlinuxcn/$arch
## 华为云 (Global CDN) (ipv4, http, https)
## Added: 2020-10-31
Server = https://repo.huaweicloud.com/archlinuxcn/$arch
## 清华大学 (北京) (ipv4, ipv6, http, https)
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
## 中国科学技术大学 (安徽合肥) (ipv4, ipv6, http, https)
Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch
## 哈尔滨工业大学 (黑龙江哈尔滨) (ipv4, ipv6, http, https)
## Added: 2021-01-09
Server = https://mirrors.hit.edu.cn/archlinuxcn/$arch
## 浙江大学 (浙江杭州) (ipv4, http, https)
## Added: 2017-06-05
Server = https://mirrors.zju.edu.cn/archlinuxcn/$arch
## 重庆大学 (重庆) (ipv4, ipv6, https)
Server = https://mirrors.cqu.edu.cn/archlinuxcn/$arch
## 重庆邮电大学 (重庆) (ipv4, http, https)
Server = https://mirrors.cqupt.edu.cn/archlinuxcn/$arch
## SJTUG 软件源镜像服务 (上海) (ipv4, ipv6, https)
## Added: 2018-05-21
Server = https://mirrors.sjtug.sjtu.edu.cn/archlinux-cn/$arch
## 南京大学 (江苏南京) (ipv4, ipv6, http, https)
Server = https://mirrors.nju.edu.cn/archlinuxcn/$arch
## 莞工 GNU/Linux 协会 开源软件镜像站 (广东东莞) (ipv4, https)
## Added: 2018-11-03
Server = https://mirrors.dgut.edu.cn/archlinuxcn/$arch
## 南方科技大学 (广东深圳) (ipv4, ipv6, http, https)
## Added: 2021-08-17
Server = https://mirrors.sustech.edu.cn/archlinuxcn/$arch

sudo pacman -Syy
sudo pacman -S archlinuxcn-keyring
1
2
3
4
5
6
# 想简单点就直接在/etc/pacman.conf最后添加
[archlinuxcn]
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch

sudo pacman -Syy
sudo pacman -S archlinuxcn-keyring

使用aur

paru

1
2
3
4
5
6
7
8
9
10
11
$ git clone https://aur.archlinux.org/paru.git
$ cd paru
$ makepkg -si

注:archlinuxcn源中有paru,直接sudo pacman -S paru

$ paru # 约等于 sudo pacman -S Syyu 对软件进行更新并升级
$ paru 包名

sudo vim /etc/paru.conf
取消BottomUp的注释 # 使最常用的软件显示在下方

退出系统重启

1
2
3
exit
umount -R /mnt
reboot

系统软件

桌面环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo pacman -S xorg xorg-server xorg-xinit xorg-xrandr
sudo pacman -S feh # 壁纸
sudo pacman -S udisks2 udiskie # U盘
xrandr # 查看有哪些显示器

cp /etc/X11/xinit/xinitrc ~/.xinitrcS
vim ~/.xinitrc # 删除最后几行没用的,添加以下几行
fcitx5 & # 开启中文输入法且后台运行
xrandr --output Virtual-1(显示器名称) --mode 1920x1080 --rate 60.00(显示器配置)
feh --bg-fill --randomize /usr/share/backgrouds/archlinux/* # 先设置分辨率再设置壁纸
picom -b &
exec slstatus &
末行添加 exec dwm

systemctl enable udisk2 # 识别U盘
startx # 进入dwm

ctrl+shift+pageup # 放大字体
xrandr -q # 查看显示器设置
xrandr --output Virtual-1(显示器名称) --mode 1920x1080 --rate 60.00(显示器配置)

电池优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yay -S tlp tlp-rdw tlpui                                       ## 安装电源管理及图形界面
sudo vim /etc/tlp.conf ## 编辑配置文件,防止Btrfs文件系统损坏
SATA_LINKPWR_ON_BAT=max_performance ## 更改内容为
sudo systemctl enable tlp.service ## 设置tlp服务开机自启动
sudo systemctl enable NetworkManager-dispatcher.service ## 设置开机自启动
sudo syatemctl mask systemd-rfkill.service ## 屏蔽服务,防止冲突
sudo syatemctl mask systemd-rfkill.socket ## 屏蔽,防止冲突
sudo tlp start ## 启动服务

# 使用TLP显示系统信息
sudo tlp-stat -b ## 显示电池信息
sudo tlp-stat -d ## 显示磁盘信息
sudo tlp-stat -e ## 显示 PCI 设备信息
sudo tlp-stat -g ## 显示 GPU 信息
sudo tlp-stat -p ## 显示 CPU 信息
sudo tlp-stat -s ## 显示系统数据信息

声音

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
sudo pacman -S alsa-utils

# 查看有几个声卡设备
cat /proc/asound/cards

# 查看声卡的card number和device number
aplay -h # 查看帮助
aplay -l # 列出所有的声卡和数字音频设备

# 设置默认声卡
# nvim /etc/asound.conf
defaults.pcm.card 1
defaults.pcm.device 0
defaults.ctl.card 1

# 开启声音
amixer sset Master toggle # 交换开启状态
amixer sset Master Capture # 交换开启状态

# 关闭自动静音
# 方法一
amixer -h # 查看帮助
amixer sset Master unmute
amixer sset Speaker unmute
amixer sset Headphone unmute
amixer set Master 10%+ # Master增加10%的音量
amixer set Master 10%- # Master减少10%的音量
amixer set Master 70% # Master音量设定为70%

# 播放音频
aplay -D hw:1,0 /usr/share/sounds/test.wav # hw后的的数字分别代表卡号和设备号

# 在终端中输入alsamixer打开设置
在 alsamixer 中,下方标有 MM 的声道是静音的,而标有 00 的通道已经启用。
使用 ← 和 → 方向键,选中 Master 和 PCM 声道。按下 m 键解除静音。使用 ↑ 方向键增加音量,直到增益值为0。该值显示在左上方 Item: 字段后。过高的增益值会导致声音失真。

背光

1
2
3
4
5
sudo pacman -S light
sudo usermod -aG video <user>
light -U 10 # 屏幕亮度降低10%
light -A 10 # 屏幕亮度升高10%
light -G # 得到当前亮度

蓝牙

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
// blueman更方便
sudo bluetooth on # 手动启动蓝牙
sudo bluetooth off # 手动关闭蓝牙
sudo bluetooth toggle # 手动切换蓝牙状态

sudo pacman -S pulseaudio-bluetooth pavucontrol # 安装蓝牙音频
sudo pacman -S bluez bluez-utils
sudo systemctl enable bluetooth.service
sudo systemctl start bluetooth.service

# 使用Bluetoothctl进入蓝牙控制台
$ bluetoothctl --help 查看帮助命令
$ bluetoothctl -v 查看蓝牙版本
$ bluetoothctl 进入蓝牙管理工具环境
[bluetooth]# power on 打开蓝牙
[bluetooth]# agent on 开启代理
[bluetooth]# scan on 扫描蓝牙设备
[bluetooth]# pair xx:xx:xx:... 配对该设备
[bluetooth]# trust xx:xx:xx:... 信任该设备
[bluetooth]# connect xx:xx:... 连接该设备
[bluetooth]# disconnect xx:xx:... 断开蓝牙
[bluetooth]# help 查看帮助信息
[bluetooth]# show 查看本机蓝牙信息
[bluetooth]# discoverable yes 设置蓝牙可被发现
[bluetooth]# info xx:xx:xx:... 查看该蓝牙设备的信息

pulseaudio -k 或者 sudo killall pulseaudio # 确保没有pulseaudio启动
pulseaudio --start # 启动pulseaudio服务
pavucontrol # 管理声音输出

触控板

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
sudo pacman -S libinput xf86-input-libinput

libinput配置文件位置
1.libinput默认的配置文件在/usr/share/X11/xorg.conf.d/40-libinput.conf,可以设置鼠标加速、额外的鼠标按键、触控板、触控屏等。
2.由于同一个设备的不同驱动程序可以共存,如果你打算为一个设备使用 libinput 驱动,请确保它在其他驱动中 /etc/X11/xorg.conf.d/ 拥有优先级。
举个栗子:
如果你同时安装了 libinput 和 synaptics 并使用其默认配置(即 /etc/X11/xorg.conf.d/ 中没有属于两者中任一的文件),synaptics 将因其在默认安装目录中拥有更高的数字顺序 70- 而获得优先级。为了避免这种情况,您可以将默认的 libinput 配置文件(40-libinput.conf)软链接到目录搜索顺序优先于 70-synaptics.conf 的 /etc/X11/xorg.conf.d/ 中去取代它。
sudo ln -s /usr/share/X11/xorg.conf.d/40-libinput.conf /etc/X11/xorg.conf.d/40-libinput.conf

# 更改libinput配置
# vim /etc/X11/xorg.conf.d/40-libinput.conf
MatchIsPointer “on” # 小红点
MatchIsKeyboard “on” # 软键盘
MatchIsTouchpad “on” # 触控板
MatchIsTouchscreen “on” # 触控屏

常用选项
1.当检测到 USB 鼠标时,它将禁用触摸板。
Option "SendEventsMode" "disabled-on-external-mouse"
2.允许单指和双指触击分别调用鼠标左右键,而不用按触控板的物理按键
Option "Tapping" "True"
3.防止打字时误触触控板
Option "DisableWhileTyping" "True"
4.触摸板不再拥有区域的区分,与之代替的是双指代表右键,三指代表中键。
Option "ClickMethod" "clickfinger"
5.轻击后手指按住会使单个按钮关闭,此手指的所有动作都将转换为拖动动作。
Option "TappingDrag" "True"
6.自然滚动(反方向滚动)
Option "NaturalScrolling" "True"
7.启用鼠标加速配置文件。这有助于使鼠标手指的速度更自然一些,迟钝感更小。建议使用 Adaptive,因为其会根据您的输入更改。您也可以尝试“flat”选项。
Option "AccelProfile" "adaptive"
8.更改鼠标指针的加速速度。使用 -1 到 1 之间的值。数值越大,指针移动的速度越高。大多数人倾向于使用 0.2 以获得较慢的响应速度,使用 0.5 获得较快的响应速度。
Option "AccelSpeed" "0.3"

# https://wiki.archlinuxcn.org/wiki/Touchpad_Synaptics?rdfrom=https%3A%2F%2Fwiki.archlinux.org%2Findex.php%3Ftitle%3DTouchpad_Synaptics_%28%25E7%25AE%2580%25E4%25BD%2593%25E4%25B8%25AD%25E6%2596%2587%29%26redirect%3Dno
9.在synaptics上启用自然滚动(触摸屏那种滚动).只要将VertScrollDelta和HorizScrollDelta的值设定为负就行(翻转滚动方向):
Option "VertScrollDelta" "-111"
Option "HorizScrollDelta" "-111"

# 举例:
Section "InputClass"
Identifier "touchpad"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "Tapping" "True"
Option "TappingButtonMap" "lrm"
Option "DisableWhileTyping" "True"
Option "TappingDrag" "True"
Option "NaturalScrolling" "True"
Option "SendEventsMode" "disabled-on-external-mouse"
EndSection

通用软件

输入法

1
2
3
4
5
6
7
8
9
10
11
12
# 安装fcitx5
sudo pacman -S fcitx5-im fcitx5-chinese-addons fcitx5-material-color
# 有些应用仍然不能使用中文,去archwiki搜fcitx5查看解决方法

# nerd fond
sudo pacman -S ttf-jetbrains-mono-nerd

# 英文
sudo pacman -S ttf-dehavu ttf-droid ttf-font-awesome otf-font-awesome ttf-liberation ttf-linux-libertine ttf-opensans ttf-roboto ttf-ubuntu-font-family

# 中文
sudo pacman -S ttf-hannom noto-fonts noto-fonts-extra noto-fonts-emoji noto-fonts-cjk adobe-source-code-pro-fonts adobe-source-sans-fonts adobe-source-serif-fonts adobe-source-han-sans-cn-fonts adobe-source-han-sans-hk-fonts adobe-source-han-sans-tw-fonts adobe-source-han-serif-cn-fonts wqy-cn-fonts wqy-microhei

zsh

1
2
cat /etc/shells  # 查看zsh的具体地址
chsh -s path # zsh的详细路径

wps

1
2
3
paru wps-office-cn wps-office-mui-zh-cn ttf-wps-fonts
$ 解决粗体黑块
paru freetype2-wps

software

1
2
3
4
5
6
7
8
9
10
11
sudo pacman -S unzip git neovim tmux joshuto python xclip
paru iwgtk # iwctl的图形界面
sudo pacman -S capnet-assist # 有些网络需要网页登陆
paru google-chrome
sudo pacman -S clash-verge-rev
sudo pacman -S scrot # 截图
sudo pacman -S flameshot # 截图
sudo pacman -S sioyek # pdf
sudo pacman -S rofi # dmenu
# rofi -dump-config > ~/.config/rofi/config.rasi
# rofi options -theme ~/.config/rofi/powermenu/style.rasi -show drun

GDB

基础操作

  • l: 看当前行上下文/ l func 看func上下文
  • p: 打印变量/调用函数. p $寄存器名
  • bt: 打印栈回溯
  • f stack_id: 切换栈(只是能打印该栈的信息,并不会重新执行指令)
  • b: 打断点(b main.cc:5)/(b func有函数重载时会给多个函数下断点, b func(int)只会在这个函数打断点)/(b func if 表达式)
  • i b: 查看断点(info break); d num: 删除断点
  • tb:创建临时断点
  • s: 进入函数
  • n: 下一步
  • si:执行下一条机器指令。
  • ni:执行下一条机器指令,但不进入函数内部
  • c: 继续运行
  • watch 变量名/if 变量名 == ?(写入时打断)
  • rwatch 变量名/if 变量名 == ?(读取时打断)
  • awatch (写入和读取都会打断点)
  • tui enable/layout src
  • layout asm/src
  • r 参数(表示传入main的参数argc, argv)
  • finish: 继续执行程序,直到当前函数完成并返回到它的调用者

多线程调试

  • info threads: 查看线程信息
  • t thread_id: 切换线程
  • 正常情况下多个线程会一起执行,不会因为在一个线程打了断点,另一个线程就不执行了

调度器锁模式

  • 理解调度器锁模式
    1. set scheduler-locking off: 不锁定任何线程,所有线程可以继续执行.
    2. set scheduler-locking on: 只有当前线程可以执行,其他线程暂停运行.
    3. set scheduler-locking step: 当单步执行某一线程时,保证在调试过程中当前线程不会发生改变.其他线程也会随着被调试线程的单步执行而执行;但如果该模式下执行continue,until,finish命令,则其他线程也会执行,并且如果某一线程执行过程中遇到断点,则GDB会将该线程作为当前线程.(只有线程创建后这个命令的暂停效果才有效)
  • 查看调度器锁模式:show scheduler-locking

调试coredump文件

什么是coredump文件?

  • coredump文件又称之为核型转储文件.进程运行时,突然崩溃时的那一瞬间的进程内存快照,会把进程此刻内存,寄存器状态,运行堆栈等信息转储保存在一个文件

怎么产生?

  • ulimit -a 查看core file size

调试coredump文件

  • gdb [binfile] [coredump file]
    1. 查看调用堆栈,寻找崩溃原因.
    2. 根据崩溃点,查找代码,分析原因.
    3. 修复bug.

  • 前缀键: ctrl + b
  • tmux ls: 查看所有tmux会话
  • 新建会话: tmux new -s
  • 分离会话: ctrl + b + d
  • 接入会话: tmux attach -t
  • 杀死会话: tmux kill-session -t
  • 切换会话: tmux switch -t
  • 重命名会话: tmux rename-session -t oldname
  • 窗格操作:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Ctrl+b %:划分左右两个窗格。
    Ctrl+b ":划分上下两个窗格。
    Ctrl+b <arrow key>:光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓。
    Ctrl+b ;:光标切换到上一个窗格。
    Ctrl+b o:光标切换到下一个窗格。
    Ctrl+b {:当前窗格与上一个窗格交换位置。
    Ctrl+b }:当前窗格与下一个窗格交换位置。
    Ctrl+b Ctrl+o:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。
    Ctrl+b Alt+o:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。
    Ctrl+b x:关闭当前窗格。
    Ctrl+b !:将当前窗格拆分为一个独立窗口。
    Ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小。
    Ctrl+b Ctrl+<arrow key>:按箭头方向调整窗格大小。
    Ctrl+b q:显示窗格编号。

操作

basic

  • .命令可以让我们重复上次的修改(理想模式: 用一键移动,另一键执行)

    • 重复上次修改: 从进入插入模式的那一刻起, 直到返回普通模式时为止
    • x, dd, >G 等普通模式中执行的命令
  • G: 增加从当前行到文档末尾处的缩进层级

  • $: 使光标移动到行尾

  • S: 删除光标下的字符并进入插入模式(我禁用了)

  • A: 使光标移动到行尾并进入插入模式

  • I: 使光标移动到行首并进入插入模式

  • o: 向下换行

  • O: 向上换行

  • f{char}

    • 使用;键可以跳到下一个
    • 使用,键可以跳到上一个
  • /: 在文档中查找下一处匹配项

  • ?: 在文档中查找上一处匹配项

  • *: 高亮光标出的词并移动到下一处

  • u: 撤销(从进入插入模式开始, 直到返回普通模式为止, 在此期间输入或删除的任何内容都被当成一次修改; 在插入模式中移动光标会重置修改状态)(此功能可以让你控制撤销粒度)

  • 模式下,r可以修改所有列选中的位置

  • !{cmd}: 运行shell命令

  • ea: 在当前单词结尾后添加

  • m{a-zA-Z} `{mark}: 添加标签,回到标签(大写字母是全局标记)

  • ``: 当前文件中上次跳转动作之前的位置

    • %r]``r[: 修改包围的符号,change surround
  • `.: 上次修改的地方

  • gi: 跳转到上次插入的地方

  • ^: 移动光标到行首第一个非空字符处

  • $: 移动光标到行末最后一个非空字符处

  • =: 自动缩进(格式化)

  • dtn: 删除字符n前面的内容

  • zz: 将光标所在行移动到窗口中央

  • 撤销在普通模式下使用u,反撤销使用Ctrl+r

  • 对比两个文件:

    • 在终端下: nvim -d 文件名1 文件名2
    • 在nvim中: :diffsplit 要对比的文件名
  • ctrl+z暂停vim返回shell,shell里做完想做的事,然后fg返回vim

  • %命令允许在一组开、闭括号间跳转,可作用于 ()、{}以及[]

  • daw/caw: 会删除当前单词以及前一个空格

  • /: 对数字执行加/减操作; 10: 对最近的数字加10 (有进制的区别: 0xff + 1 = 0x100)

  • 插入模式下

    • : 删除前一个字符
    • : 删除前一个单词
    • : 删至行首
    • : 切换到普通模式
    • <C-[>: 切换到普通模式
    • : 切换到插入-普通模式(可以执行一个普通模式命令, 执行完后, 马上就又返回到插入模式, eg: zz 调整屏幕显示位置并继续插入)
    • {register}: 粘贴某个寄存器的内容
    • =: 表达式寄存器, 可以做简单的算数表达式
    • r: 修改一个字符
    • R: 进入修改模式,直到回到普通模式
  • 普通模式下

    • J: 把当前行和下一行连接在一起
    • K: 查看处于光标之下的那个单词的手册页
    • : 运行跳转命令时, 会在跳转列表中添加一条记录, 而命令会回到跳转列表的上条记录
  • 可视模式下

    • v: 激活面向字符的可视模式
    • V: 激活面向行的可视模式
    • : 激活面向列块的可视模式
    • gv: 重选上次的高亮区域
    • o: 在可视模式时, o键可以切换光标的端点
    • .: .命令可以重复上一条在可视模式执行的命令
    • r: 在可视模式中使用r键时, 会修改选中的所有字符
    • 块选中时,按c删除选中内容并输入新内容, 在返回普通模式时会对所有行都进行修改(即: 快选中时, 对当前行进行修改时, 会对所有行都进行); 按A/I可在行末/首进行修改
    • : 可以在可视模式及选择模式间切换(选择模式中输入任意可见字符, 此字符会替换所选内容并切换到插入模式. 几乎不用)
  • 命令行模式下

    • tabnew, tabnext, tabprevious, tabclose: 操作tab
    • badd filename, bNext, bdelete: 操作buffer
    • /: 删除至上个单词的开头及行首
    • {start},{end}+action: eg:3,5p (.代表当前行的地址; $代表文件末尾行; %代表当前文件中的所有行)(.,.+3p 会对当前行至下三行进行打印)
    • {range}copy{address}: 复制
    • {range}copy{address}: 移动
    • 在高亮时按下:后执行命令时,会对所有行执行该命令
    • 在行选中模式下,按{:normal 指令}将会对高亮区中的每一行,对其执行普通模式下的指令(实际上就是选中范围{range}再输入normal)
    • @: : 重复上次执行的Ex命令; 在运行过一次@:后,后面就可以用@@命令来重复它
    • 在命令行上也可以用键自动补全命令
    • vim会记录命令行模式中执行过的命令; 也会为查找命令单独保存一份历史记录(使用上下方向键或者/遍历)
    • q: : 可以调出命令行窗口, 此时可以对窗口内的命令进行编辑
    • 正在命令行构建一条Ex命令,做到一半时,意识到需要更强大的编辑能力,此时可以按打开命令行窗口
    • 在命令行模式中,给命令加一个叹号前缀!,就可以调用外部程序
    • read !{cmd} 可以把{cmd}命令的输出读入当前缓冲区中
    • write !{cmd} 把缓冲区内容作为指定{cmd}的标准输入

选取范围

  • a)或ab一对圆括号(parentheses)
  • i)或ib圆括号(parentheses)内部
  • a}或aB一对花括号{braces}
  • i}或iB花括号{braces}内部
  • a] 一对方括号[brackets]
  • i] 方括号[brackets]内部
  • a> 一对尖括号
  • i> 尖括号 内部
  • a’ 一对单引号’single quotes’
  • i’ 单引号’single quotes’内部
  • a” 一对双引号”double quotes”
  • i” 双引号”double quotes”内部
  • a 一对反引号backticks`
  • i 反引号backticks`内部
  • at 一对XML标签tags
  • it XML标签内部
  • iW 当前字串
  • aW 当前字串及一个空格
  • is 当前句子
  • as 当前句子及一个空格
  • ip 当前段落
  • ap 当前段落及一个空行

标记

  • m{a-zA-Z}命令会用选定的字母标记当前光标所在位置. 小写位置标记只在每个缓冲区里局部可见, 而大写位置标记则全局可见. `{mark}命令跳到位置标记所在行, 并把光标置于该行第一个非空白字符上
  • `` 当前文件中上次跳转动作之前的位置
  • `. 上次修改的地方
  • `^ 上次插入的地方
  • `[ 上次修改或复制的起始位置
  • `] 上次修改或复制的结束位置
  • `< 上次高亮选区的起始位置
  • `> 上次高亮选区的结束位置

移动

  • j: 向下移动一个实际行 gj: 向下移动一个屏幕行

  • k: 向上移动一个实际行 gk: 向上移动一个屏幕行

  • 0: 移动到实际行的行首 g0: 移动到屏幕行的行首

  • ^: 移动到实际行的第一个非空白字符 g^: 移动到屏幕行的第一个非空白字符

  • $: 移动到实际行的行尾 g$: 移动到屏幕行的行尾

  • w: 正向移动到下一单词的开头

  • b: 反向移动到当前单词/上一单词的开头

  • e: 正向移动到当前单词/下一单词的结尾

  • ge: 反向移动到上一单词的结尾

  • W、B、E 和gE面向字串移动

查找

  • f{char}: 正向移动到下一个{char}所在之处
  • F{char}: 反向移动到上一个{char}所在之处
  • t{char}: 正向移动到下一个{char}所在之处的前一个字符上
  • T{char}: 反向移动到上一个{char}所在之处的后一个字符上
  • dt{char}: 从当前位置删除到char之前
  • 可视模式下也可使用/进行查找

在文件间跳转

  • 用[count]G命令直接跳到指定的行号也会被当成一次跳转, 但每次向上或向下移动一行则不算. 面向句子的动作及面向段落的动作都算跳转, 但面向字符及面向单词的动作则不算. 用一句话来概括, 可以说大范围的动作命令可能会被当成跳转, 但小范围的动作命令则只能算移动.
  • : 后退
  • : 前进

寄存器

  • Vim的删除、复制与粘贴命令都会用到众多寄存器中的某一个. 可以通过给命令加”{register}前缀的方式指定要用的寄存器. 若不指明,Vim将缺省使用无名寄存器
  • 想把当前单词复制到寄存器a中, 可执行”ayiw, 或者, 可以用”bdd, 把当前整行文本剪切至寄存器b中. 在此之后,既可以输入”ap粘贴来自寄存器a的单词, 也可使用”bp命令粘贴来自寄存器b的一整行文本, 两者互不干扰
  • 当我们使用y{motion}命令时, 要复制的文本不仅会被拷贝到无名寄存器中, 而且也被拷贝到了复制专用寄存器中, 后者可用数字0加以引用. 复制专用寄存器, 顾名思义, 仅当使用y{motion}命令时才会被赋值. 换句话讲, 使用x、s、c{motion}以及d{motion}命令均不会覆盖该寄存器. 如果复制了一些文本, 可以确信该文本会一直保存于寄存器0中, 直到复制其他文本时才会被覆盖. 复制专用寄存器是稳定的, 而无名寄存器是易变的. 尽管diw 命令仍会覆盖无名寄存器, 但不会波及复制专用寄存器. 可以通过输入”0P, 安全地粘贴来自复制专用寄存器中的内容.
  • 用小写字母引用有名寄存器, 会覆盖该寄存器的原有内容, 而换用大写字母的话, 则会将新内容添加到该寄存器的原有内容之后
  • 系统剪贴板(“+)与选择专用寄存器(“*): 如果在外部程序中用剪切或复制命令获取了文本, 就可以通过”+p 命令(或在插入模式下用+)将其粘贴到Vim内部. 相反地, 如果在Vim的复制或删除命令之前加入”+, 相应的文本将被捕获至系统剪贴板
  • X11视窗系统支持另一种被叫作主剪贴板的剪贴板, 它保存着上次被高亮选中的文本, 可以用鼠标中键(如果有的话)把它们粘贴出来. Vim的星号寄存器对应主剪贴板, 可用*号加以引用
  • p命令旨在将寄存器中的文本粘贴到光标之后. 作为补充, Vim也提供了大写的P命令用于将文本插入到光标之前

  • q{char}{changes}q记录宏
  • q键既是“录制”按钮,也是“停止”按钮
  • :reg {char}: 查看指定宏内容
  • 用@{register}命令执行指定寄存器的内容, 也可以用@@来重复最近调用过的宏
  • 输入qa时, Vim将开始录制接下来的按键操作, 并将它们保存到寄存器a中, 这会覆盖该寄存器原有的内容. 如果输入的是qA的话, Vim也会录制按键操作, 但会把它们附加到寄存器a原有的内容之后
  • 当动作命令失败时, 宏将中止执行

模式

  • 通过使用元字符\c与\C,可以覆盖Vim缺省的大小写敏感性设置。小写字母\c 会让查找模式忽略大小写,而大写字母\C则会强制区分大小写。
  • 正则表达式使用\进行转义

替换

  • [range] [substitute]/{pattern}/{string}/[flags]
    • range:
      • 使用可视模式选取范围
      • %: 表示整个文件
      • 1,20: 第1行~第20行
      • .,+2 当前行~往后2行
      • .,$ 当前行~文件尾
    • flags:
      • g: 全局范围内执行
      • c: 可以确认或拒绝每一处修改
      • n: 抑制正常的替换行为, 只是报告本次substitute命令匹配的个数
  • substitute命令要在整个x轴与y轴上执行, 即凭借标志位g处理横轴字符的同时, 使用地址符%处理纵轴的文本行
  • 替换特殊字符
    • \r 插入一个换行符
    • \t 插入一个制表符
    • \ 插入一个反斜杠
    • ~ 使用上一次调用:substitute时的{string}
  • :substitute命令的查找域留空, Vim将使用上一次的查找模式(:%s//{new_word}/g)
  • 通过输入{register}, 可以将寄存器的内容插入到命令行

自动补全

  • 通过这两个组合键, 不仅可以在插入模式下触发Vim的自动补全, 而且还可以用它们在补全列表中反向或正向选择
  • 通过来终止这次自动补全, 其效果是下拉菜单将被清除, 并恢复光标前的文本, 即调用自动补全前所输入的内容
  • 文件名补全

文件

  • :ls 列表的开头有一个数字, 它是在缓冲区创建时由Vim自动分配的编号. 可以用:buffer N 命令直接凭编号跳转到一个缓冲区, 或是用更直观的:buffer {bufname}格式实现同样的功能. {bufname} 只需包含文件路径中足以唯一标识此缓冲区的字符即可
  • :bufdo 命令允许我们在:ls列出的所有缓冲区上执行Ex命令. 不过在实际应用中, 发现:argdo更加实用
  • :wa! 把所有改变的缓冲区写入磁盘
  • :qa! 关闭所有窗口, 摒弃修改无需警告
  • Explore缩写E :edit 只需输入:e
  • Vexplore/Sexplore: 水平或竖直打开目录树
  • :write !{cmd} 命令会把缓冲区的内容作为标准输入 传给指定的{cmd},{cmd} 可以是任何外部程序
  • :w !sudo tee % > /dev/null 普通用户保存root权限文件

install vim

ubuntu

1
2
3
4
5
6
7
8
9
vim:
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt install vim

nvim:
sudo apt-add-repository ppa:neovim-ppa/unstable
sudo apt update
sudo apt install neovim

config nvim

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo pacman -S unzip(要解压一些包) git neovim
# 安装pyright需要安装npm以及python3,这里不需要nodejs
sudo pacman -S npm python3
# copilot需要高版本的nodejs

# telescope
sudo add-apt-repository ppa:x4121/ripgrep
sudo apt update
sudo apt install ripgrep
npm install -g fd-find

# 清除nvim配置
rm -rf ~/.local/share/nvim ~/.cache/nvim ~/.local/state/nvim

.gitignore

1
2
3
4
5
6
7
8
9
10
11
12
# no .a files 
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

一、标题

在想要设置为标题的文字前面加#来表示
一个#是一级标题,二个#是二级标题,以此类推。支持六级标题。

注:标准语法一般在#后跟个空格再写文字,貌似简书不加空格也行。

示例:

1
2
3
4
5
6
# 这是一级标题
## 这是二级标题
### 这是三级标题
#### 这是四级标题
##### 这是五级标题
###### 这是六级标题

效果如下:

这是一级标题

这是二级标题

这是三级标题

这是四级标题

这是五级标题
这是六级标题

二、字体

  • 加粗

要加粗的文字左右分别用两个*号包起来

  • 斜体

要倾斜的文字左右分别用一个*号包起来

  • 斜体加粗

要倾斜和加粗的文字左右分别用三个*号包起来

  • 删除线

要加删除线的文字左右分别用两个~~号包起来

示例:

1
2
3
4
**这是加粗的文字**
*这是倾斜的文字*`
***这是斜体加粗的文字***
~~这是加删除线的文字~~

效果如下:

这是加粗的文字
这是倾斜的文字
*这是斜体加粗的文字*
这是加删除线的文字


三、引用

在引用的文字前加>即可。引用也可以嵌套,如加两个>>三个>>>n个…
貌似可以一直加下去,但没神马卵用

示例:

1
2
3
>这是引用的内容
>>这是引用的内容
>>>>>>>>>>这是引用的内容

效果如下:

这是引用的内容

这是引用的内容

这是引用的内容

四、分割线

三个或者三个以上的 - 或者 * 都可以。

示例:

1
2
3
4
---
----
***
*****

效果如下:
可以看到,显示效果是一样的。



五、图片

语法:

1
2
3
4
![图片alt](图片地址 ''图片title'')

图片alt就是显示在图片下面的文字,相当于对图片内容的解释。
图片title是图片的标题,当鼠标移到图片上时显示的内容。title可加可不加

六、超链接

语法:

1
2
[超链接名](超链接地址 "超链接title")
title可加可不加

示例:

1
2
[简书](http://jianshu.com)
[百度](http://baidu.com)

效果如下:
简书
百度


七、列表

无序列表

语法:
无序列表用 - + * 任何一种都可以

1
2
3
4
5
- 列表内容
+ 列表内容
* 列表内容

注意:- + * 跟内容之间都要有一个空格

效果如下:

  • 列表内容
  • 列表内容
  • 列表内容

有序列表

语法:
数字加点

1
2
3
4
5
1. 列表内容
2. 列表内容
3. 列表内容

注意:序号跟内容之间要有空格

效果如下:

  1. 列表内容
  2. 列表内容
  3. 列表内容

列表嵌套

上一级和下一级之间敲三个空格即可

  • 一级无序列表内容
    • 二级无序列表内容
    • 二级无序列表内容
    • 二级无序列表内容
  • 一级无序列表内容
    1. 二级有序列表内容
    2. 二级有序列表内容
    3. 二级有序列表内容
  1. 一级有序列表内容
    • 二级无序列表内容
    • 二级无序列表内容
    • 二级无序列表内容
  2. 一级有序列表内容
    1. 二级有序列表内容
    2. 二级有序列表内容
    3. 二级有序列表内容

八、表格

语法:

1
2
3
4
5
6
7
8
9
10
11
表头|表头|表头
---|:--:|---:
内容|内容|内容
内容|内容|内容

第二行分割表头和内容。
- 有一个就行,为了对齐,多加了几个
文字默认居左
-两边加:表示文字居中
-右边加:表示文字居右
注:原生的语法两边都要用 | 包起来。此处省略

示例:

1
2
3
4
5
姓名|技能|排行
--|:--:|--:
刘备||大哥
关羽||二哥
张飞||三弟

效果如下:

姓名 技能 排行
刘备 大哥
关羽 二哥
张飞 三弟

九、代码

语法:

1
esc键下三个点就行

示例:

单行代码

1
`create database hero;`

代码块

1
2
3
4
5
6
(```)
function fun(){
echo "这是一句非常牛逼的代码";
}
fun();
(```)

效果如下:

单行代码

1
create database hero;

代码块

1
2
3
4
function fun(){
echo "这是一句非常牛逼的代码";
}
fun();

CMU15-445/645


src/common.

channel.h

  • 实际上是一个线程安全队列.

rid.h

  • Record Identifier = page_id_ << 32 | slot_num_

rwlatch.h

  • 读写锁(std::shared_mutex)

src/type.

abstract_pool.h

  • 抽象内存池接口

type_id.h

  • type枚举
    1
    enum TypeId { INVALID = 0, BOOLEAN, TINYINT, SMALLINT, INTEGER, BIGINT, DECIMAL, VARCHAR, TIMESTAMP };

type.h

  • 类型基类.
  • 定义了类型比较,运算,序列化,转换类型等虚接口.

boolean_type.h

  • 实例化boolean类型比较,运算,序列化,转换类型等接口.

numeraic_type.h

  • number value的基类,可以是整数和小数.必须提供运算操作.

integer_parent_type.h

  • 为整数提供具有鲁棒性的四则运算.

tinyint_type.h,smallint_type.h,bigint_type.hinteger_type.h

  • integer_parent_type的子类,为整数提供了比较,运算,序列化,转换类型等接口.

timestamp_type.h

  • 为timestamp类型提供比较等接口.

decimal_type.h

  • 为小数提供类型比较,运算,序列化,转换类型等接口.

value.h

  • 实际管理数据内容的地方.
  • 存储着type和数据内容.
  • value比较,运算,序列化,转换类型等操作都是调用type提供的虚接口.
    1
    Type::GetInstance(type_id_)->

value_factory.h

  • value工厂类,方便构造value.

src/catalog.

column.h

  • 记录column的name,type,fixed_length,variable_length,offset.

schema.h

  • 存储着std::vector columns. 记录数据库tuple的元信息.

catalog.h

  • 处理表创建、表查找、索引创建和索引查找.

src/storage.

table/tuple.h

  • 存储RID rid_{},std::vector data_.
  • 定义了tuple的存储格式,前面部分存储inline数据,然后存储uninline数据.
  • 可以通过schema和column_idx得到数据.

table/table_heap.h

  • BufferPoolManager *bpm_,page_id_t first_page_id_,page_id_t last_page_id_.
  • 通过BufferPoolManager操作table,提供了一系列操作table中tuple的接口.

table/table_iterator.h

  • table中page的迭代器.

disk/disk_manager.h

  • 封装了写文件操作.
  • file_name_,log_name_.
  • 通过page_id计算offset,然后往文件读写内容.

disk/disk_scheduler.h

  • 内部保存DiskManager.
  • Channel<std::optional> request_queue_,使用channel依次处理请求.

page/page.h

  • 数据库存储的基本单元.提供了对真实数据页的一层包装.
  • data_,page_id_,pin_count_,is_dirty_,rwlatch_.

page/page_guard.h

  • 为page提供RAII.

page/table_page.h

  • 一个page是怎么存储tuple的.

page/extendible_htable_header_page.h

  • page_id_t directory_page_ids_[512],uint32_t max_depth_;
  • 固定大小,可以认为是第一层hash,有一个常量max_depth_.

page/extendible_htable_directory_page.h

  • uint32_t max_depth_,uint32_t global_depth_,uint8_t local_depths_[512],page_id_t bucket_page_ids_[512];
  • 不固定大小,可以认为是第二层hash,有一个变量depth.

page/extendible_htable_bucket_page.h

  • uint32_t size_,uint32_t max_size_,MappingType array_[HTableBucketArraySize(sizeof(MappingType))];
  • 保存实际value的地方.

index/index.h

  • std::unique_ptr metadata_;
  • IndexMetadata
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /** The name of the index */
    std::string name_;
    /** The name of the table on which the index is created */
    std::string table_name_;
    /** The mapping relation between key schema and tuple schema */
    const std::vector<uint32_t> key_attrs_;
    /** The schema of the indexed key */
    std::shared_ptr<Schema> key_schema_;
    /** Is primary key? */
    bool is_primary_key_;
  • 索引的抽象基类.

index/extendible_hash_table_index.h

  • class ExtendibleHashTableIndex : public Index;
  • 根据extendible_hash_table构建的索引表.

src/buffer.

lru_k_replacer.h

  • 实现了lru_k替换算法.

buffer_pool_manager.h

  • 缓存池.通过pool_size,disk_manager(file_name_),replacer_k初始化.

src/container.

disk/hash/disk_extendible_hash_table.h

  • std::string index_name_;BufferPoolManager *bpm_;KC cmp_;HashFunction hash_fn_;uint32_t header_max_depth_;uint32_t directory_max_depth_;uint32_t bucket_max_size_;page_id_t header_page_id_;
  • 结合BufferPoolManager,extendible_htable_header_page,extendible_htable_directory_page,extendible_htable_bucket_page,建立一个可动态扩展/收缩的HashTable,对外提供增、删、查的的服务接口.

execution

executors/abstract_executor.h

  • 执行器的抽象基类.

终端使用代理

  • 使用clash等搭建代理后,终端不经设置并不会通过代理,而无论是Windows还是Linux,方法都是加入http_proxy,https_proxy或all_proxy环境变量。

windows

临时设置

1
2
3
set http_proxy=http://127.0.0.1:7890  # =后的值可以加双引号,也可以不加
set https_proxy=http://127.0.0.1:7890 # 注意这里是设置https的代理,但是我们的代理还是http
set all_proxy=http://127.0.0.1:7890 # 这是一次性设置两个,可以不设置这个

永久设置

  • 终端启用代理的方法是那三个环境变量,因此永久设置就是手动去设置添加环境变量。

linux

临时设置

1
2
3
export http_proxy=http://127.0.0.1:7890  # =后的值可以加双引号,也可以不加
export https_proxy=http://127.0.0.1:7890 # 注意这里是设置https的代理,但是我们的代理还是http
export all_proxy=http://127.0.0.1:7890 # 这是一次性设置两个,可以不设置这个

永久设置

  • 同样的,永久设置也是是将其写入环境变量,在Linux中是将上述内容添加到/.bashrc或/.profile的末尾。

git

  • 如果只是git需要使用代理,可以在git设置代理,原理相同:
    1
    2
    git config --global http.proxy 'socks5://127.0.0.1:1080' 
    git config --global https.proxy 'socks5://127.0.0.1:1080'
  • 如果不想git全局使用代理,那只需要在需要代理的仓库输入去掉–global的命令即可:
    1
    2
    git config http.proxy 'socks5://127.0.0.1:1080' 
    git config https.proxy 'socks5://127.0.0.1:1080'
  • 若要取消git的代理设置:
    1
    2
    git config --global --unset http.proxy
    git config --global --unset https.proxy
    1
    2
    git config --unset http.proxy
    git config --unset https.proxy

wsl使用windows代理

首先,允许局域网连接代理。

1
2
3
host_ip=$(ip route | awk '/default/ {print $3}')
export http_proxy="http://$host_ip:7890"
export https_proxy="http://$host_ip:7890"