目录
2.3.2 隐藏 "UEFI Firmware Settings" 选项
前言
利用这个博客记录一些我对于Linux发行版(ubuntu)的学习,以及一些双系统使用的感受。
一、win11/ubuntu22.04.3 双系统
给自己的笔记本电脑装了双系统。很推荐下面这个up的安装教程:
https://space.bilibili.com/411541289
· 插入ubuntu安装U盘,在Windows端重启时一直按住shift键不放,出现的界面中,有个“使用设备”选项,点击进入,可直接选择用插入的U盘启动;如果不行的话,那就老老实实去BIOS设置启动顺序。(Tips:界面中点击“疑难解答”->“高级选项”->“UEFI固件设置”,重启,也可以进入BIOS)
· 之后想要给ubuntu扩容的话,还是会用到这个ubuntu安装U盘的,具体教程看上面推荐的up视频。
二、安装记录
1.分区
直接在ubuntu里展示一下
lsblk
- ubuntu efi 区:直接安装到windows的引导区里,即上图的nvme1n1p1
- ubuntu swap区:不专门分区,以后设置swapfile,以文件的形式设置交换缓存
- ubuntu 数据区:上图全部的nvme0n1p3都作为 / ,不区分 / 与 /home
总结一下,安装过程中的分区选项,只设置了 / ,并且把启动引导器装在windows的efi区。
2.进入ubuntu后的设置
2.1 系统时间同步
ubuntu和Windows的时间机制不同,所以来回切换系统会让时间错误。
NTP服务器(Network Time Protocol服务器)是用来使计算机时间同步化的一种协议服务器。
在ubuntu的终端里面下载ntpdate,然后让ubuntu的时间与time.windows.com同步。
输入下面这行之前可能需要:sudo apt update
sudo apt install ntpdate
sudo ntpdate time.windows.com
sudo hwclock --localtime --systohc
2.2 设置交换缓存文件
2.2.1 手动激活、取消swapfile
首先 free -h 查看内存
free -h
笔者的设备运行内存为16G,所以先设置一个16G的 /swapfile
语法为:sudo fallocate -l <size> <filename>
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
手动激活,注意:没有告诉系统相关的挂载信息,每次必须去手动激活才能使用交换缓存!!!
激活指令如下:
sudo swapon /swapfile
如果想更改缓存大小,先取消激活,然后删掉 /swapfile ,重来上面的步骤,只需fallocate时,文件大一点就行了。
取消激活指令如下:
sudo swapoff /swapfile
删除 /swapfile:
sudo rm /swapfile
2.2.2 自动挂载swapfile
上面2.2.1的方法中,手动创建一个交换文件。每次开机后,要使用交换空间时,都需要手动swapon。
为了在每次系统启动时都能自动挂载交换文件,需要将信息添加到 /etc/fstab 文件中,告诉系统将 /swapfile 文件作为交换空间挂载,用于内存交换。
首先看一下 /etc/fstab这个文件:
用文本编辑器打开 /etc/fstab
sudo gedit /etc/fstab
按照里面说的的格式 <file system> <mount point> <type> <options> <dump> <pass>
/swapfile none swap sw 0 0
也就是上图的第12行。
保存修改,重启,再去 free -h 就可以看到自动启用了交换缓存文件。
后续更新......
2.3 更改开机的grub引导选项
对于双系统开机的引导选项,做了两个改变:
1.设置默认windows启动
2. 隐藏 "UEFI Firmware Settings" 选项
2.3.1 设置默认windows启动
在文件 /etc/default/grub 中,把GRUB_DEFAULT的值改为2,也就是从“0”对应的ubuntu变成“2”对应的windows。
用一个文本编辑器打开 /etc/default/grub,我这里用了gedit
sudo gedit /etc/default/grub
下图中的红框即是所改
修改后保存,别忘了更新grub
sudo update-grub
2.3.2 隐藏 "UEFI Firmware Settings" 选项
GRUB菜单的配置是通过 /etc/grub.d/
目录下的各个文件来实现的(下图第一个红框),
注意,不是 /etc/default/grub.d/
目录(下图第二个红框)
/etc/grub.d/中的30_uefi-firmware文件就是有关于"UEFI Firmware Settings" 选项的相关内容,
打开它,然后把里面的代码全部注释掉就OK了。
sudo nano /etc/grub.d/30_uefi-firmware
注释掉所有的代码,每行前面加“#”。
记得更新grub
sudo update-grub
开机时,达到下面的效果
后续更新......
三、使用记录
这一部分,主要记一些使用ubuntu的感受,可能会去写点双系统的使用心得。
3. Vim
终端里面的编辑器。
三种模式:【默认模式】【编辑模式】【命令模式】
打开vim,就是【默认模式】。
【默认模式】可分别与【编辑模式】及【命令模式】完成界面切换, 但【编辑模式】与【命令模式】之间不可互相切换。
按 i 键 , 【默认模式】--->【编辑模式】, 按esc键返回。
3.1 【命令模式】指令
我常用的【命令模式】指令。
后续更新... ...
3.2 【默认模式】技巧
1.查找(Vim的ctrl+F)
/
下面是一个例子,找“printf” ,在【默认模式】下按下“/”键,然后去输入“printf”,会看到:
输完“printf”后,再回车键入,如下图:(光标会到第一个“printf”处)
输入“n”向下去找下一处“printf” (或者键入“N”查找上一处)
这里我不断的键入了“n”,直到最后一处“printf”,如下图,在行尾会有找完的提示。
4. 挂载Windows分区到ubuntu
将nvme0n1p2挂载到ubuntu,这样可以在ubuntu中去访问Windows下的这个分区中的内容。
如下图:类型为NTFS的nvme0n1p2未挂载。在 /mnt/ 自己建立一个目录,做挂载点。
cd /mnt
sudo mkdir my_mnt
4.1 mount/umount:挂载/卸载挂载点
挂载到上面建立的挂载点:
sudo mount /dev/nvme0n1p2 /mnt/my_mnt
如果想要卸载这个挂载点,
sudo umount /mnt/my_mnt
如果想要设置永久挂载,即希望在系统每次自动挂载
nvme0n1p2
分区,像上面的 【2.2.2 自动挂载swapfile】 ,需要自己去再编辑一下/etc/fstab
文件。注意这个分区是 NTFS 而不是 ext4,需要使用不同的文件系统类型来挂载它。
我目前没有去设置永久挂载。相关内容后续更新......
4.2 切换root访问该Windows分区
切换成root身份:
dc@hasee:/mnt$ sudo su
root@hasee:/mnt#
像进入目录一样,访问这个新的挂载点:
cd my_mnt
访问结束后,换回我们的普通用户:(笔者的用户名为“dc”)
su - dc
后续更新... ...
5.终端里的gdb调试(以.c为例)
虽然在ubuntu环境中,也可下载一个vscode,然后配置launch.json去使用vscode提供的界面化很好的gdb调试,但是毕竟在终端中就可以敲一些gdb的命令完成简单的调试工作。
我这里以调试.c为例记录一些常用到的gdb指令。
能够使用 "gdb <filename>"的一个前提条件是,在编译时一定要带上
-g
选项(用于生成调试信息)
这样,由server.o链接生成的server就可以使用“gdb ./server”去启动gdb调试。
5.1 list列出源码
对server启动gdb,gdb ./server
列出主函数源码
list main
继续列出当前行后面的源码,list - 就是看前面的源码了。
list +
后续更新... ...
5.2 break与info break
当遇到想要设置断点的行,可以“break [行号]”
上图在319行设置了断点。
同时,“info break”可以查看所有的断点信息。
注意,info break展示的第一列“Num”是断点编号,可见319行的这个断点的编号为“1”,
假如要删除319行处的断点,使用“delete 1”。
5.3 run
“run”开始调试,
run
上图卡在了282行,编号为2的断点处,也就是说282行的printf()还没有被执行。
使用“next”、“step”等后续命令继续调试。
... ...
5.4 next、continue
当想要快速浏览程序的执行流程,不关注函数内部的实现细节时,可以使用“next”和“continue”。
例如,有时候像下图这样,我们进入了一个for循环,(中间还使用了一下“print [var_name]”查看了一下变量 i 的值),
但是这个for循环次数较多,可以使用“continue”,继续执行程序,直到遇到下一个断点或程序结束。如果在“next”或“step”之后程序处于暂停状态,“continue”将恢复程序的执行。
continue
5.5 step、finish
当想要深入了解某个函数的执行过程,查看函数内部变量的变化时,可以使用“step”
,
如果在函数内部想要快速退出,可以使用“finish”。
上图是卡在了319行的epoll_wait(),我们分别使用“step”和“next”会有不一样的效果,
如果使用“step”,
可以看到进入了epoll_wait()内部,并且使用“finish”退出回到main()时,报告了Value returned 为0.
如果使用“next”(下图红框),可以看到会越过epoll_wait(),继续执行下面的判断逻辑。
... ...
5.6 print、ptype
在 5.4 next、continue 章节就已经用过了“print [var_name]”查看了一个变量的值,这里再介绍一下“ptype [var_name]”查看一个变量的类型。
这次满足epoll_wait()的条件,使其返回值为1,以方便后续介绍,
下图用“print nfd”看到了epoll_wait()的返回值为1。
“ptype ev” 看到了ev是一个可以指向结构体的变量。
还可以去看看ev指向的结构体变量的成员值,更好的去理解程序的逻辑。
“quit” 离开调试。
... ...
后续更新... ...