Linux从头开始学--学习笔记6--系统初始化,内存,swap,oom,网络和网络接口

613 阅读9分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

这是我从头开始学习Linux的学习笔记,后续还会更新。

记录自己的技术成长,也希望和大家分享交流,欢迎关注~

本笔记为coursera网站课程《Linux for Developers》的学习笔记

学习目标

  • Understand how the system boots, the role of GRUB and the contents of the /boot directory
  • Discuss the next steps of launching essential functions using systemd and its predecessors, SysVinit and Upstart
  • Kill the graphical desktop interface and enter a pure text-based terminal
  • Analyze memory usage and the role of swap space, and how the system reacts to running out of memory
  • Discuss how the system works with network devices and how they are identified and named
  • Configure and bring up or down network interfaces and networks

在这个模块中,让我们讨论系统的一些重要组件。 特别是,我们要谈论系统初始化我们要谈论内存,我们要谈论网络接口。

系统启动时,将经历多个阶段。 第一个是您的早期引导阶段,该阶段相当依赖于硬件,并且涉及启动Linux内核。 在大多数Linux系统上,这涉及使用所谓的GRUB,它使您可以在启动时选择其他操作系统,内核选项等。 在嵌入式系统上,您将执行其他操作,例如Das U-Boot。 下一阶段与各种系统服务的实际初始化有关,这实际上是系统管理的问题,而不是早期启动。 我们要谈的第二件事是内存。 我们想谈谈您的系统如何使用内存,以及在内存不足并必须使用所谓的交换空间时该如何处理。 此时,您可能会发现您的OOM杀手(Out of Memory杀手)被调用,它决定了内存不足时如何处理事务。我们要谈的第三件事是网络和网络设备。 我们想谈谈如何启用网络设备,确保它们根据需要上升或下降以及如何命名。 因此,让我们开始讨论这三个主题。

一.System Initialization

1.系统启动

所有基于x86的物理Linux系统(包括笔记本电脑,大多数工作站等)都使用称为GRUB的软件系统,该系统代表GRand Unified Bootloader,它处理系统启动的最早阶段。现在,GRUB具有许多重要功能,您可以启动到其他操作系统,在启动时进行选择。 这称为引导加载程序。

可能有一台装有Windows的计算机,一台以上具有Linux发行版的计算机,一台Red Hat,一台Ubuntu,一台Debian等。 因此,您可以在开始时进行选择。 在给定的操作系统中,您可以选择要启动的内核,也可以使用稍后将要讨论的其他初始ramdisk,也可以指定系统应以的不同选项。 此外,如果需要,您可以通过输入一个交互式系统来更改系统启动时的内容,该系统允许您更改系统启动时使用的选项和其他变量,而不必在计算机上实际更改配置文件。

在GRUB 2中,实际上只有一个配置文件,在重要的启动目录中,它称为“ grub.cfg”。 确切位置取决于您的系统类型。 在“ /etc/grub.d”下,有许多文件控制GRUB的工作方式, 在“ / etc / default”下,有一个名为 “ grub”,其中包含GRUB所需的基本参数。 这些文件可以手工编辑,并用于生成“ grub.cfg”。

当系统启动时, 它始于所谓的BIOS空间, 基本输入输出系统或CMOS,用于识别, 初始化最重要的系统并连接外围设备,例如 作为键盘和初始硬盘的输入, 这样您就可以实际加载内核了。 您可以在BIOS中选择有关启动外围设备的选择, 例如USB驱动器**。内核本身可以有不同的名称, 通常是“ vmlinuz”,然后附加一个版本号。** “ z”表示内核已压缩, 加载时会自动解压缩。

2./ boot目录

/ boot目录有多个可能的内核可以启动,每个内核都有四个与之关联的文件:

  • vmlinuz压缩内核
  • initramfs包含一个完整的初始根文件系统(作为ramdisk加载),以及一些必需的内核模块(通常是设备驱动程序)以及加载它们所需的程序,这些模块是加载实际文件系统所必需的,这时将其丢弃
  • config包含有关内核如何编译的所有详细信息;系统操作不需要
  • System.map列出了完整的内核符号表;它仅用于调试目的

3.使用GRUB(演示)

我们将演示如何使用GRUB选择不同的操作系统,让我们使用VMWare启动CentOS 7虚拟机。

可以在GRUB屏幕上选择要启动的内核。在这里可以选则是否以图形界面进入centos系统。

我采用如下方法:

在root用户权限下,设置centos系统默认的启动方式,输入命令如下:

systemctl set-default multi-user.target  //设置成命令模式
systemctl set-default graphical.target  //设置成图形模式

重启系统即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ng7hLdn-1614661890094)(C:\Users\YUANMU\AppData\Roaming\Typora\typora-user-images\image-20201212112653451.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibPaDUie-1614661890101)(C:\Users\YUANMU\AppData\Roaming\Typora\typora-user-images\image-20201212112836868.png)]

4.系统初始化

我们将考虑在内核启动和系统开始运行之后发生的情况。 在系统上运行的第一个程序称为init。 通常,它的进程ID为1,以后的进程具有更高的进程ID。启动需要多长时间是非常重要的。

SystemV初始化系统中, 从0到6有不同的运行级别。 我们将向您显示一张详细定义它们的表格。 但通常将完整的图形系统视为运行级别5运行级别1是单用户模式或紧急模式。对于没有图形界面的服务器,默认级别通常为3。 这是出于特殊目的, 例如,只有一个用户在那里维修系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Q5SZrn0-1614661890104)(C:\Users\YUANMU\AppData\Roaming\Typora\typora-user-images\image-20201212114111791.png)]

可以使用runlevel命令简单地显示当前运行级别,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fj4r7rjZ-1614661890107)(C:\Users\YUANMU\AppData\Roaming\Typora\typora-user-images\image-20201212114224384.png)]

某些发行版仍保留运行级别的概念,这些运行级别是根据systemd目标定义的,因此您可以使用诸如telinit之类的命令。telinit可用于更改系统的运行级别。例如,要从运行级别3转到运行级别5,请输入:

$ sudo /sbin/telinit 5

二.Memory

1.内存

Linux和所有现代操作系统一样,都使用虚拟内存系统(VM):虚拟内存大于物理内存。

每个进程都有其自己的受保护地址空间。地址是虚拟的,每当进程需要访问内存时,内核都必须将地址与物理地址进行转换。 **内核本身也使用虚拟地址。**但是,转换可以像偏移量一样简单,具体取决于体系结构和所使用的内存类型。内核允许将公平的内存份额分配给每个正在运行的进程,并协调进程之间共享内存的时间。此外,映射可用于将文件直接链接到进程的虚拟地址空间。

使用free-m或者free-mt可以查看内存使用情况(单位mb)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WOrlaES9-1614661890108)(C:\Users\YUANMU\AppData\Roaming\Typora\typora-user-images\image-20201212115403090.png)]

这个系统有972m的ram和511m的swap,正在使用的很多内存都在缓存中,其中大部分都用于缓存最近访问过的文件的内容。如果释放此缓存,则内存使用量将大大减少。这可以通过(以root用户身份)执行:

2.释放内存

因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被cache占用掉,导致系统使用SWAP空间影响性能,例如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。,此时就需要执行释放内存(清理缓存)的操作了。可以手动释放内存:

sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches'
sudo sh -c 'echo 2 > /proc/sys/vm/drop_caches'
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

1:释放页缓存 2:释放dentries和inodes 3:释放所有缓存

如果我们需要释放所有缓存,就输入下面的命令: echo 3 > /proc/sys/vm/drop_caches

释放后结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NqhsUGiP-1614661890110)(C:\Users\YUANMU\AppData\Roaming\Typora\typora-user-images\image-20201212120231525.png)]

**应用程序不能直接写入磁盘等存储介质。它们与虚拟内存系统连接,通常首先将写入的数据块放入高速缓存或缓冲区中,然后在方便或有必要时将其刷新到磁盘中。**因此,在大多数系统中,此缓冲/缓存层中使用的内存要比应用程序直接用于其他目的的内存更多

3.swap

Linux采用了一个虚拟内存系统,在该虚拟内存系统中,操作系统可以像实际拥有的更多内存一样运行。这种内存过量使用通过两种方式起作用:

一种:许多程序并未使用所有被授予使用权限的内存。有时,这是因为子进程利用COW(写时复制)技术继承了父级内存区域的副本,在这种技术中,子进程仅在有更改时才获得唯一的副本(逐页)。

另一种:当内存压力变得很重要时,可以将较少活动的内存区域换出到磁盘,以便仅在需要时再次调用。这种交换通常是针对一个或多个专用分区或文件进行的;Linux允许多个交换区域,因此可以动态调整需求。每个区域都有一个优先级,并且在填充较高优先级区域之前不会使用较低优先级区域。

可以使用如下命令查询可交换区域:

[root@localhost ayuan]# cat /proc/swaps
Filename				Type		Size	Used	Priority
/dev/sda2                               partition	524284	7432	-2

总的524284,已经使用的是7432。

唯一涉及交换的命令是用于格式化交换文件或分区的mkswap,用于启用一个(或所有)交换区域的swapon和用于禁用一个(或所有)交换区域的swapoff

在任何给定时间,大多数内存都用于缓存文件内容,以防止实际超出实际需要的次数或次优顺序或时间。这样的内存页面永远不会被交换掉,因为后备存储就是文件本身,因此写出交换内容将毫无意义。

与其他操作系统不同,内核本身使用的Linux内存(而不是应用程序内存)从不交换。

4.线程模型

除了实际的执行程序外,还有其他信息, 例如环境变量,附加的内存区域, 当前目录和正在使用的文件是什么,等等。如果一个进程中有多个线程, 他们共享此信息。 进程只是程序的运行实例。

拥有多线程程序会很好,这有两个原因。 例如,您可能一次执行多次相同的任务。 例如,您可以拥有一台服务器, 正在处理许多客户, 对于每个客户端,您将创建一个线程来处理该客户端, 或者您可能有一个正在做多件事的过程。

有多种编码多线程程序的方法, 但是可移植的方法是使用所谓的POSIX线程库或pthreads库。写一次的理想选择 并在任何地方使用,并具有完整的可移植性只是一个理想,很难实现。

5.OOM内存不足杀手

当Linux内核承受极大内存压力时,它将调用可怕的OOM(内存不足)杀手。这试图选择杀死“最佳”进程以帮助系统正常恢复。

我们将迫使系统在内存不足的情况下观察发生的情况。要做的第一件事是打开一个终端窗口,然后在其中键入:$ sudo tail -f /var/log/messages

可以关闭交换区域,再打开交换区域

$ sudo /sbin/swapoff -a
$ sudo /sbin/swapon -a

现在我们运行一个消耗大量内存的程序

/* simple program to defragment memory, J. Cooperstein 2/04
 @*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define MB (1024*1024)


int main(int argc, char **argv)
{
int j, m;
char *c;
if (argc < 2) {
fprintf(stderr,
"You must give the memory in MB to waste, aborting\n");
exit(EXIT_FAILURE);
}
m = atoi(argv[1]);
for (j = 0; j < m; j++) {
/* yes we know this is a memory leak, no free, that’s the idea! */
c = malloc(MB);
memset(c, j, MB);
printf("%5d", j);
fflush(stdout);
}
printf("All memory allocated, pausing 5 seconds\n");
sleep(5);
printf("Quitting and releasing memory\n");
exit(EXIT_SUCCESS);
}

需要消耗多少MB作为参数。

三.Networking

1.网络和网络接口

Linux中的绝大多数网络编程都是使用socket interface完成的。因此,符合标准的程序只需很少的信息就可以在Linux上正常工作。

Linux网络实现中有许多增强功能和新功能,例如新型的地址和协议系列。例如,Linux提供了netlink接口,该接口允许打开内核子系统与应用程序(或其他内核子系统)之间的socket连接。它已被有效地部署以实现防火墙和路由应用程序。

有线以太网网络设备的名称已被称为eth0eth1等,而无线设备的名称已被称为wlan0wlan1等。

通过ifconfig实用程序收集有关系统上活动网络接口的基本信息:

[root@localhost ayuan]# /sbin/ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.126.158  netmask 255.255.255.0  broadcast 192.168.126.255
        inet6 fe80::31bb:a215:3b5a:3505  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:5f:00:d9  txqueuelen 1000  (Ethernet)
        RX packets 1191  bytes 546739 (533.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 638  bytes 55460 (54.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 76  bytes 6624 (6.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 76  bytes 6624 (6.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:d9:d6:5a  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        

// inet :网卡的IP地址。
// netmask :网络掩码。
// broadcast :广播地址。
inet 192.168.1.135 netmask 255.255.255.0 broadcast 192.168.1.255
 
 
// 网卡的IPv6地址
inet6 fe80::2aa:bbff:fecc:ddee prefixlen 64 scopeid 0x20<link>
 
// 连接类型:Ethernet (以太网) HWaddr (硬件mac地址)
// txqueuelen (网卡设置的传送队列长度)
ether 00:aa:bb:cc:dd:ee txqueuelen 1000 (Ethernet)
 
 
// RX packets 接收时,正确的数据包数。
// RX bytes 接收的数据量。
// RX errors 接收时,产生错误的数据包数。
// RX dropped 接收时,丢弃的数据包数。
// RX overruns 接收时,由于速度过快而丢失的数据包数。
// RX frame 接收时,发生frame错误而丢失的数据包数。

显示的信息包括有关硬件MAC地址,MTU(最大传输单元)和设备所绑定的IRQ的信息。还显示发送,接收或导致错误的数据包和字节数。可见,有一个绑定到eth32网卡,以及回送接口lo,该接口处理绑定到该计算机的网络流量。

可以通过查看**/ proc / net / dev来**以缩写形式查看统计信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9z3SzAt0-1614661890111)(C:\Users\YUANMU\AppData\Roaming\Typora\typora-user-images\image-20201212145737380.png)]

2.Using Predictable Network Interface Device Names

我们将考虑如何实际命名网络接口设备。

曾经有一段时间,这是一个非常静态的情况。您的计算机连接了一个或多个网络设备,它们没有随时间变化,它们通常是有线设备,而不是无线设备。因此,为其分配一个特定名称并坚持使用,并使用该名称在您所有的系统管理脚本中都是可以接受的。

当您考虑无线时,您可能有许多可用的无线网络, 您必须选择一个,依此类推。 另外,就连以太网连接而言或网卡,您的计算机上可能连接了多个网卡。如果您不知道找到这些设备的顺序,可能会有问题。

所有发行版采用的现代方法称为可预测的网络接口设备方案。他们可以使用实际的地理描述,也可以使用实际的连接的位置(所谓的MAC地址)您拥有的硬件设备,无论是无线网卡还是以太网卡。或者您可以回到原来的简单顺序它的文件系统如eth0,eth1,wlan0,wlan1等。**所有这些都可以通过管理来更改。**您可以决定想要什么。为了在网络设备上进行系统管理,您必须知道他们的名字。

3.Networking and Network Interfaces

To bring a network connection up and assign a static address, you can do:

$ sudo /sbin/ifconfig eth0 up 192.***.1.100

To bring it up and get it an assigned address from a DHCP server, you can do:

// 配置ip地址
ifconfig eth0 192.***.1.100
 
// 配置ip地址和子网掩码
ifconfig eth0 192.***.1.100 netmask 255.255.255.0
 
// 配置ip地址、子网掩码和广播地址
ifconfig eth0 192.***.1.100 netmask 255.255.255.0 broadcast 192.***.1.255

尽管ifconfig已经可靠地使用了很多年,但是ip实用程序是较新的(并且用途更多)。从技术上讲,它效率更高,因为它使用netlink socket ** 而不是ioctl**系统调用。

可以使用ip和ifconfig配置ip地址

$ ip link  %显示所有网络接口的信息
$ ip -s link show eth0   %显示有关eth0网络接口的信息
$ sudo ip addr add 192.***.1.7 dev eth0   %设置eth0的IP地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmapaIHi-1614661890112)(C:\Users\YUANMU\AppData\Roaming\Typora\typora-user-images\image-20201212151813121.png)]

都看到这里了,不如点个赞哦~

在这里插入图片描述