实验环境配置

Ubuntu18.04.5,Linux内核:5.9.6,VMware Workstation Pro,内存:4G,CPU:4x1=4核,外存:128G。
ubuntu安装、内核源码下载及环境配置参考我的另一篇博客 虚拟机安装Ubuntu18.04

实验目的

添加一个系统调用改变主机名称为自定义字符串
提示:参考/etc/hostname文件内容
其实就是把sys.c文件里的sethostname函数复制过来然后删除一个if语句

解压下载好的linux内核源码

作为自由软件,Linux 内核版本不断更新,新内核会修订旧内核的 bug,并增加若干新特性,如支持更多的硬件、具备更好的系统管理能力、运行速度更快、更稳定等。实验中所用的是5.9.6版本内核。

将下载的新内核压缩文件复制到/home 或其他比较空闲的目录中,然后进入压缩文件所在子目录,打开终端,输入"sudo su",回车,输入密码,以root身份运行,然后分两步解压缩:

(1)xz -d linux-5.9.6.tar.xz
大概执行 1 分钟左右,中间没有任何信息显示。
(2)tar –xvf linux-5.9.6.tar

添加系统调用的步骤

进入解压后的linux-5.9.6文件中,打开终端,输入"sudo su",回车,输入密码,以root身份运行。

1.分配系统调用号,修改系统调用表

vim ./arch/x86/entry/syscalls/syscall_64.tbl

下图,是我添加的335调用号,64和common不用深究,调用号,在末尾累加。

2.声明系统调用服务例程原型

Linux 系统调用服务例程的原型声明在文件 linux5.9.6/include/linux/syscalls.h 中,可在文件中添加如图 :

vim ./include/linux/syscalls.h

也可以打开vscode,打开syscalls.h文件直接修改

和"sys_sethostname"除了名字其他一模一样。

3.实现系统调用服务例程

下面为新的系统调用 magichostname 编写服务例程 sys_magichostname,通常添加在 sys.c 文件中(我放到了它的母体函数sethostname下面),其完整路径为:linux-5.9.6/kernel/sys.c:

vim ./kernel/sys.c

也可以在vscode中直接复制粘贴修改,更加方便,具体代码为:

SYSCALL_DEFINE2(magichostname, char __user *, name, int, len)
{int errno;char tmp[__NEW_UTS_LEN];if (len < 0 || len > __NEW_UTS_LEN)return -EINVAL;errno = -EFAULT;if (!copy_from_user(tmp, name, len)) {struct new_utsname *u;down_write(&uts_sem);u = utsname();memcpy(u->nodename, tmp, len);memset(u->nodename + len, 0, sizeof(u->nodename) - len);errno = 0;uts_proc_notify(UTS_PROC_HOSTNAME);up_write(&uts_sem);}return errno;
}

DEFINE2表示这个函数有两个参数,下面是sethostname函数的代码,能发现它们之间差的if语句在哪吗?

SYSCALL_DEFINE2(sethostname, char __user *, name, int, len)
{int errno;char tmp[__NEW_UTS_LEN]; //__NEW_UTS_LEN=64if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN))  //首先检查当前进程是否拥有CAP_SYS_ADMIN的授权return -EPERM;if (len < 0 || len > __NEW_UTS_LEN)return -EINVAL;errno = -EFAULT;if (!copy_from_user(tmp, name, len)) {  //copy_from_user将name指向的字符串从用户空间拷贝到内核空间,失败返回没有被拷贝的字节数,成功返回0struct new_utsname *u;down_write(&uts_sem);  //写者使用该函数来得到读写信号量sem,它会导致调用者睡眠,只能在进程上下文使用,用于获取Linux内核读写信号量中的写锁u = utsname();  //获取当前内核名称和其它信息,成功执行时,返回0。失败返回-1,errno被设为EFAULT,表示buf无效。memcpy(u->nodename, tmp, len);  //从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中memset(u->nodename + len, 0, sizeof(u->nodename) - len);errno = 0;uts_proc_notify(UTS_PROC_HOSTNAME);  //使用UTS namespace隔离hostnameup_write(&uts_sem);  //释放写锁}return errno;
}

重新编译内核

上面三个步骤已经完成添加一个新系统调用的所有工作,但是要让这个系统调用真正在内核中运行起来,还需要重新编译内核。

1、预先安装一些辅助工具包,如果没有编译过程中会出错:

apt-get install make
apt-get install libncurses5-dev
apt-get install libssl-dev
apt-get install bison
apt-get install flex
apt-get install pkg-config

2、清除残留的.config 和.o 文件

在开始完全重新编译之前,需要清除残留的.config 和.o 文件,后续如果编译过程中出现错误,再次开始完全重新编译之前也需要如此清理。方法是进入 linux-5.9.6 子目录,执行以下命令:

make mrproper

3、配置内核

make menuconfig

在出现的页面下方中选择"Save",一路回车,然后选择"Exit"退出。

4、编译内核,生成启动映像文件

内核配置完成后,执行 make 命令开始编译内核,如果编译成功,则生成 Linux 启动映像文件 bzImage(位于./arch/x86_64/boot/bzImage):

make

可使用 make -j2(双核 CPU)或 make -j4(4 核 CPU)来加快编译速度。编译过程中,可能会出现一些错误,通常都是因为缺少某个库,一般根据相应的错误提示,安装相应的包即可,然后重新编译。
我的虚拟机是4核的,所以我用如下命令:

make -j4

下面的所有指令都可添加"-j4" 来加快速度。

5、编译模块

make modules -j4

6、安装内核

安装模块:make modules_install
安装内核:make install

7、配置 grub 引导程序

update-grub2

该命令会自动修改 grub

8、重启系统

reboot -n

9、将使用新内核启动 linux,启动完成后进入终端查看内核版本

uname -a

编写用户态程序测试新系统调用

1、编写测试C程序验证上述添加的系统调用:


我把ubuntu改成了Harmony(鸿蒙)!

2、编译程序

我的C程序名是"test.c"

gcc -o test test.c

3、执行程序

./test

然后重新打开终端,就会发现主机名修改成功!

4、运行效果

还有一个不需要syscall也能改主机名的方法!!!

直接上代码

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
#define STACK_SIZE (1024 * 1024)static char magic_stack[STACK_SIZE];char* const magic_args[] = {"/bin/bash", NULL};int magic_main(void* arg){printf("Accept!\n");sethostname("Harmony", 7);execv(magic_args[0], magic_args);printf("Wrong Answer!\n");return 1;
}int main(int argc, char **argv){printf("It's time to witness the miracle !\n");  //见证奇迹的时刻到了!int magic_pid = clone(magic_main, magic_stack + STACK_SIZE, CLONE_NEWUTS | SIGCHLD, NULL);waitpid(magic_pid, NULL, 0);return 0;
}

效果图

操作系统实验:添加系统调用修改主机名(hostname)相关推荐

  1. RedHat7修改主机名hostname

    RedHat7修改主机名hostname 1.临时方法: [root@rehl7 ~]# hostname rehl8 #注销会话当前会话或者重新打开新会话就生效,OS重启失效. [root@rehl ...

  2. Linux查看主机信息及修改主机名hostname

    一.查看主机信息 详细显示系统信息 [root@db1 ~]# uname -a 显示系统信息 [root@db1 ~]# uname 显示系统版本 [root@db1 ~]# cat /etc/re ...

  3. 云服务器修改主机名hostname

    云服务器修改主机名hostname 1. 阿里云 2. 腾讯云 1. 阿里云 登录控制台页面可修改 详细可参考: 简说阿里云服务器搭建与简单项目部署. 2. 腾讯云 修改 hostname 文件:ca ...

  4. 阿里云修改主机名hostname

    一.云服务的基本配置 因在学习如何部署k8s集群,所以购买了两台阿里云服务,配置分别如下: 华南A区: CPU: 1核 内存: 2 GB 操作系统: CentOS 7.3 64位 华南C区: CPU: ...

  5. Linux 永久修改主机名hostname

    前言: 由于最近用3台机器,经常切换导致有容易区别的需求. 故想修改主机名. 实验环境:Ubuntu 17 教程: 1. 使用hostname 命令先临时修改 sudo hostname your_n ...

  6. Redhat 系统修改主机名 hostname

    临时修改主机名 方法如下: #hostname newname //将newname替换为想要的主机名 如: #hostname test01 //将主机名修改为test01 永久修改主机名 (说明: ...

  7. Linux命令之获取和修改主机名hostname

    概述 hostname 命令可以获取当前主机名和临时修改主机名. 语法 该命令的语法如下: hostname [选项] [参数] 该命令支持的选项有: 选项 说明 -a 显示主机别名 -d 显示DNS ...

  8. 【linux】主机名被改为bogon原理分析|修改主机名hostname的方法

    目录 linux主机名被更改为bogon原理分析 修改主机名的方法 1.临时修改,重启失效 2.永久生效 linux主机名被更改为bogon原理分析 博客原址:http://blog.csdn.net ...

  9. Ubuntu16.04 永久修改主机名 hostname

    1. 查看主机名 在终端输入 hostname 即可查看主机名 wohu@wohu:/$ hostname wohu wohu@wohu:/$ 2. 修改主机名 2.1 修改 /etc/hostnam ...

最新文章

  1. mvp关联activity生命周期_Rxjava+Retrofit统一异常处理与生命周期管理
  2. 生产环境提升rman备份速度----启动块跟踪
  3. oracle 韩思捷_Oracle数据库技术服务案例精选
  4. 分享一个.NET平台开源免费跨平台的大数据分析框架.NET for Apache Spark
  5. linux 第三章红帽子,红帽子 Linux_命令全解
  6. VC用ADO访问数据库全攻略  作者 相生昌
  7. 双11 拼多多iPhone 11系列香气扑鼻:最高降幅达1600元
  8. 【IDEA】报错:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
  9. 凸优化学习笔记(一):仿射集、凸集、锥
  10. 高德地图--根据地理位置获取经纬度
  11. 苹果笔记本安装windows系统
  12. scara机器人dh参数表_机器人之DH参数例子-SCARA机器人
  13. 【Bug解决】UnpicklingError: A load persistent id instruction was encountered, but no persistent_load.
  14. java实现日历打印
  15. 编码,隐匿在计算机软硬件背后的语言读书笔记(9)
  16. 2021年如何折腾小米平板2,装上win11
  17. UX设计师是做什么的,现在怎么样
  18. bat 格式化年月日时分秒
  19. Python GUI界面编程-初识
  20. 安卓手机阅读器_【BOOX彩屏】彩色墨水屏阅读器,BOOX Poke2 Color 使用体验

热门文章

  1. 马哥2016linux就业班+架构班+运维班全套
  2. mendeley引用参考文献不显示_【参考文献管理工具-1】使用Mendeley在Word中插入引用与参考文献...
  3. python爬虫文件下载很慢卡住线程_python爬虫多线程假死怎么解决?
  4. 2013年网站内容建设新趋势
  5. PhoneAccount流程解析(SIM卡管理器)拨号过程中解析PhoneAccount
  6. python 将小图放入较大的白色或黑色背景图片
  7. php json里面追加一个数组,如何往指定是json数组里面添加数据
  8. 贵安新区打造“三链融合”大数据核心区
  9. Nubia Z18 联通VoLte修复,基带文件
  10. FPGA-超声波避障小车(ego1)