linux课程笔记

本文最后更新于:2023年5月6日 晚上

linux课程笔记

linux访问

linux使用VFS来访问其他格式文件

linux文件系统

  • bin

二进制文件,用户命令(一般常用命令)

  • sbin

存放系统命令

  • usr

这下面也有bin和sbin,和用户有关的

  • cdrom

光驱,光盘

  • dev

用设备进行管理,所有的硬件信息

tty是终端,还有很多硬盘的信息也是在这里

  • etc

所有的配置文件

  • lib

库文件

  • lost+found

出错信息

  • media

早期是在mnt上挂在设备,现在是在media,如硬盘,u盘的挂载

  • proc

存放所有的设备的动态信息

  • root

超级用户的主目录

  • usr

第三方软件

  • var

可变的文件,比如日志文件

boot文件目录

里面有efigrub其中efi中是引导程序,grub是相应的grub程序

System.map,vmlinuz,initrd.img这三个文件是和内核有关(当然还要加上那个版本号),其中initrd.img就是根文件系统的印像(建立了虚拟的根目录文件系统,为了引入真正的文件系统)

initrd.img主要是编译的模块

编译内核时的配置文件就是config-版本-generic

编译内核

UEFI -> grub.cfg -> vmlinuz -> initrd.img

需要编译的文件:vmlinuz -> system.map(映射文件) -> initrd.img -> modules(很多硬件驱动在这里)

模块(modules)的位置: /lib/modules

最后编译好了之后写grub.cfg(也可以直接update-grub)

  • 内核功能选项配置:

[*] 加入到内核功能中
[ ] 不加入到内核中
[M] 加入到模块中

-jN中的N是选择使用多少个核编译进行编译

grub目录

最开始的时候是从sda*文件中的boot程序,而grub.cfg可以设置默认启动项和内核参数,也就是说引导程序最先是在sda*上找程序,然后根据grub.cfg中的配置来进行设置

更改grub程序

可以跑到/etc/default/grub这个文件中进行配置,可以看到如下文件内容(只记录非注释信息)

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

同时我们还可以到/etc/grub.d/这个文件目录下设置grub配置

其中10_linux是有写入到grub.cfg的脚本(其实每个文件都是一个脚本,之后会全部写到grub.cfg)

查看磁盘情况

  • df -h

可以查看linux文件系统中的磁盘情况

  • fdisk -l

可以查看所有的磁盘使用情况(整台电脑)

软件源地址

软件源 /etc/apt/sources.list

linux运行环境

可使用tty4来进入真正的终端

使用Ctrl+Alt+F4

使用env或者set得到环境变量(set信息更多)

使用后台方式执行命令

只需要在要执行的命令之后跟上一个&就可以后台运行了

浏览文件

catmore以及less

个人感觉less的体验感最好,因为less的手感用起来像是vim。
less可以随意地上下移动行,甚至使用/来进行关键字搜索。

当然我们还有headtail(可以使用-n参数来指定浏览行数)

创建文件夹

mkdir -p dir1/dir2

这样就可以在dir1这个文件夹不存在的情况下同时生成dir1dir2两个文件目录

cp的更多用法

当我们使用cp来进行一个文件或者是一个目录的复制的时候,很可能我们复制过来的文件的属性发生了变化(比如用户组权限,创建时间等),于是我么可以用cp -a来确保我们复制过来的文件所有的信息都不会改变。

-r就可以拷贝目录了。

如果我们需要在执行cp操作时给予一定的响应信息的话,我们可以加上-i参数。(即交互的意思Interactive)

ln命令

使用ln -S产生软链接;使用ln产生硬链接

打包命令

使用tar命令:

tar -xvzf解压缩并解包gz格式压缩包

tar -cvzf打包并压缩为gz格式压缩包

格式 命令参数
gz z
xz a
bz j

系统信息类命令

  • dmesg

  • df

  • du

  • free

可查看内存空间情况

cache: 存在于cpu中,用于cpu计算空间的快速存储

buffer: 和外设打交道

  • date

  • ``

进程管理命令

ps aux: 查看所有进程情况

1号进程是所有进程的父进程,2号进程是所有类进程的父进程

S是等待态,D是不可打断的等待态,Z是僵尸态

父进程没有回收子进程的资源,于是导致子进程变成了僵尸态(杀都杀不死)

使用ps -ef或者使用pstree(更有结构)来显示进程的父子关系。

kill命令

使用kill -l查看可发送的所有信号。

使用是发送的第二个信号(INT),使用是发送的第十九个信号(STOP)

top命令

可以动态地显示进程

其他杂命令

使用bg命令将任务放在后台运行。

使用fg命令将任务放到前台运行。

uname命令展示基本的系统信息。

uname -r查看内核信息

文件系统和磁盘管理

使用chmod来更改权限

chmod 777 test

用户的基本信息

/etc/passwd文件中会有所有用户的信息

/etc/shadow文件中存储着所有用户的密码

切换到超级用户

最好使用su -来切换到root用户,相比于su这样可以将环境变量也切换过来。

使用ifconfig

一般还是要安装一下net-tools,然后输入ifconfig就可以查看所有的网卡信息。

当然在windows下,输入ipconfig也有一样的功能。

GCC开发

首先GCC和gcc是不一样的,GCC -> GNU Compiler Collection, 而gcc是GCC里面的一个c语言的编译器。

gcc编译过程

  • 预处理
  • 编译成汇编代码
  • 汇编成目标代码
  • 链接

使用-l来链接其他的库

eg:

gcc -o test test.c -ltest

使用gdb来调试程序

通过直接使用gdb file来对编译得到的可执行文件进行调试。

gdb所用到的命令

如果是输入gdb的话会进入到gdb的命令行界面。(输入quit进行退出

gcc -g来编译的时候可以使得可执行文件能够之后反编译出来。

网络通信

很多时候我们都以为是主机之间的通信,其实是进程之间的通信。

作业:使用P2P来完成一有图形界面的通信模式。

  • 应用层:内容上的统一协议(语言,格式)
  • 表示层:编码,解释
  • 会话层:通过中间人来告知通信(断点问题,建立同步点)
  • 传输层:将信息暂存到一个传达室,以便将信息传输
  • 网络层:查找下一条的通信(但是不知道怎么去下一条),利用ip地址
  • 链路层:使用网卡,找到真正的目的主机(使用Mac地址),以便真正的传输。
  • 物理层:真正的数据传输,电信号的传输(到光纤为止)

TCP协议

建立一个可靠的数据传输模式

TCP协议和UDP协议只在端系统中存在

UDP协议

不需要在通信之间建立可靠连接

一对多,多对多

进程标识方法

(协议,本地地址,本地端口号)

TCP协议发送

客户端socket(CS)

socket() -> connect(CS) -> send(CS) -> receive(CS) -> close(CS)

服务器socket(SS)

socket() -> bind(SS) -> listen(SS) -> ms = accept(SS) -> receive(ms) -> send(ms) -> close(ms)

通信的两套系统

BSD 和 Posix

BSD使用AF(地址族),Posix使用PF(协议族)

UDP协议发送

客户端socket(CS)

CS = socket() -> sentto(CS, SS, buf) -> receivefrom(…) -> close(CS)

服务器socket(SS)

SS = socket() -> bind(SS) -> sentto(CS, SS, buf) -> receivefrom(…)

插入模块

lsmod: 列出所有的模块

insmod moduleName: 插入新模块

rmmod moduleName: 移除一个模块


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!