实验名称:实验2:观察Linux行为
实验目的
- 1、熟悉Linux文件系统
- 2、能够读取其中文件,获取信息
实验内容
- 以超级用户的身份登录Linux系统,并进入/proc目录,输入ls命令,查看该目录下的内容,同时查看每个文件的读、写权限。
- (1)请回答下列问题:
- CPU的类型和型号。
- 所使用的Linux版本。
- 从启动到当前时刻经过的时间。
- 当前内存状态。
- (2)编写一个程序,用来获得内核参数(任意的参数均可)。
- (3)编写一个程序,用来修改内核参数(任意的参数均可)。
实验环境
- VMware
- Linux
实验作业
在掌握Linux操作系统概念的基础上,通过proc文件系统观察整个系统的一些重要特征,编写程序,可以获得或修改系统的各种配置参数。
在Linux操作系统中,也提供了一套在用户态检查内核状态和系统特征的机制,即进程文件系统( process file system,简称 procfs)。比起Windows的任务管理器,proc文件系统的功能更强大,它能提供更多的系统信息,甚至能修改部分系统信息,还能通过编写程序扩充其中的内容(见实验5)。
早期的UNIX在设备文件目录/dev下设置了一个特殊的文件/dev/mem,这个文件在现在的Linux系统中仍然存在,通过这个文件可以读/写系统的整个物理内存,而物理内存的地址就用作读/写时文件内部的位移量。这个特殊文件可以像普通文件一样,进行read,write,Iseek等常规的文件操作,从而提供了一个在内核外部动态读/写包括内核映像和内核中各个数据结构及堆栈内容的手段。既可用于收集状态信息和统计信息,也可用于程序调试,还可以动态地改变一些数据结构或变量的内容。采用虚存以后,UNIX又增加了一个特殊文件/dev/kmem,对应于系统的整个虚存空间。这两个特殊文件的作用和表现出来的重要性促使人们对其功能加以进一步的拓展,在系统中增设了一个/proc目录,每当创建一个进程时就以其pid为文件名在这个目录下建立一个特殊文件,使得通过这个文件就可以读/写相应进程的用户空间和其他信息。
proc文件系统将进程信息、系统的硬件信息(包括CPU、内存状态及网卡等各种硬件设备)、系统相关机制(中断、I/O)等内容全部映射为虚拟的Linux文件。它以一种特殊的文件系统的方式,为访问系统内核数据的操作提供接口。也就是说,这个文件系统中所有的文件都是特殊文件,这些特殊文件一般与外部设备无关,所涉及的介质通常就是内存或CPU本身。当从一个特殊文件“读”出时,所读出的数据都是由系统内部按一定的规则临时生成的,或者从内存中收集、加工出来的,反之亦然。换言之,这些文件的内容都不存在于任何存储设备上,而是在读/写的时候才根据系统中的有关信息生成出来,或者映射到系统中的有关变量或数据结构。
下面来看Linux系统中 proc文件系统的具体内容。首先,系统中当前运行的每一个进程都有一个对应的目录在/proc下,以进程的ID号为目录名,它们就是读取进程信息的接口。



示例:
。
在/proc目录中,大部分文件都属于root,并且所有用户对其只拥有读权限,但有一个例外子目录sys。sys目录下的文件记录了内核各方面的运行参数,用户可以更改这些文件的值,结果是直接修改内核中的相应参数。下面举几个例子。
(1) /proclsys/kernel/acct
该文件有三个可配置值,根据日志所在的文件系统上可用空间的数量(以百分比表示),这些值控制何时开始进行进程记账:
①第1个值表示如果可用空间高于这个百分比值,则开始进程记账。
②第2个值表示如果可用空间低于这个百分比值,则停止进程记账。
③第3个值检查上面两个值的频率(以秒为单位)。
要更改这个文件的某个值,应该回送用空格分隔的一串数字。默认设置为4230,也就是说,如果包含日志的文件系统上只有少于2% 的可用空间,则这些值会使记账停止,如果有4%或更多可用空间,则再次启动记账。每30秒做一次检查。
示例图:

(2)/proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到错误消息,说明由于打开文件数已经达到了最大值,而不能打开更多文件,则可能需要增加该值。
示例图:

(3) /proc/sys/kernel/domainname
该文件允许配置网络域名。它没有默认值,可能已经设置了域名,也可能没有。
示例图:

(4)/proc/sys/kernel/hostname
该文件允许配置网络主机名。同样,它也没有默认值,可能设置了主机名,或者没有。
示例图:

(5) /proclsys/kernel/printk
该文件有4个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。关于不同日志级别的更多信息,请阅读 syslog(2)联机帮助页。该文件的4个值依次为:
①控制台日志级别。优先级高于该值的消息将被打印至控制台。
②默认的消息日志级别。将用该优先级来打印没有优先级的消息。
③最低的控制台日志级别。控制台日志级别可被设置的最小值(最高优先级)。④ 默认的控制台日志级别。控制台日志级别的默认值,默认设置为7417。
示例图:

(6) /proc/sys/kernel/shmall
该文件是在任何给定时刻系统可以使用的共享内存的总量(以页为单位)。
示例图:

(7)/proc/sys/kernel/shmmax
该文件指定内核所允许的最大共享内存段的大小(以字节为单位)。默认设置为33554432。
示例图:

(8)/proc/sys/kernel/shmmni
该文件表示用于整个系统共享内存段的最大数目,默认值为4096。
如上所述,/proclsys目录不仅提供了内核信息,而且可以通过它修改内核参数。但是必须很小心,因为修改可能造成系统崩溃。要改变内核的参数,只要用vi编辑或用echo参数重定向到文件中即可。
示例图:

实验结果
- 以超级用户的身份登录Linux系统,并进入/proc目录,输入ls命令,查看该目录下的内容,同时查看每个文件的读、写权限。

- 请回答下列问题:
- CPU的类型和型号。
cat cpuinfo

- 所使用的Linux版本。
cat version

- 从启动到当前时刻经过的时间。
cat uptime

- 当前内存状态。
cat meminfo

- 编写一个程序,用来获得内核参数(任意的参数均可)。
实验代码:
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#define SSIZE_MAX 10000
int main(int argc,char **argv)
{
int len;
char buf[SSIZE_MAX];
int fd=open(argv[1],O_RDONLY);
if(fd!=-1)
{
printf("open file is over\n");
len=read(fd,buf,SSIZE_MAX);
printf("%s",buf);
close(fd);
}
else
{
printf("i can not open this file /n");
}
return EXIT_SUCCESS;
}
运行图:

- 编写一个程序,用来修改内核参数(任意的参数均可)。
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#define SSIZE_MAX 10000
int main(int argc,char ** argv)
{
int len;
char buffer[100];
int fd=open(argv[1],O_RDWR|O_CREAT,0666);
if(fd!=-1)
{
ftruncate(fd,0);// qing kong wen jian nei rong
len=write(fd,argv[2],sizeof(argv[2]));
printf("%d,%s\n",len,argv[2]);
//printf("%s\n",argv[1]);
//sprintf(buffer,"echo %s > %s",argv[2],argv[1]);
//printf("%s\n",buffer);
//system(buffer);
close(fd);
}
else
{
printf("can not open the file\n");
}
return EXIT_SUCCESS;
}
运行图:


实验体会
通过本次实验对linux行为的观察,我基本掌握了/proc文件系统的使用与操作,通过该文件系统,我们可以很方便的获取内核参数信息以及正在运行的进程的信息。通过进行C语言编程操作,我们可以在程序中很方便的读写相应的内核信息,为以后的工作提供了极大的便利。
同时,在linux下编程使我更好理解了操作系统的原理架构,提升了能力。但在程序调试过程中,我还不够熟练,出现了很多错误,接下来我会针对相关问题有针对性提高能力。
[
](https://blog.csdn.net/weixin_43906500/article/details/112451148)