操作系统实验:添加系统调用修改主机名(hostname)
实验环境配置
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)相关推荐
- RedHat7修改主机名hostname
RedHat7修改主机名hostname 1.临时方法: [root@rehl7 ~]# hostname rehl8 #注销会话当前会话或者重新打开新会话就生效,OS重启失效. [root@rehl ...
- Linux查看主机信息及修改主机名hostname
一.查看主机信息 详细显示系统信息 [root@db1 ~]# uname -a 显示系统信息 [root@db1 ~]# uname 显示系统版本 [root@db1 ~]# cat /etc/re ...
- 云服务器修改主机名hostname
云服务器修改主机名hostname 1. 阿里云 2. 腾讯云 1. 阿里云 登录控制台页面可修改 详细可参考: 简说阿里云服务器搭建与简单项目部署. 2. 腾讯云 修改 hostname 文件:ca ...
- 阿里云修改主机名hostname
一.云服务的基本配置 因在学习如何部署k8s集群,所以购买了两台阿里云服务,配置分别如下: 华南A区: CPU: 1核 内存: 2 GB 操作系统: CentOS 7.3 64位 华南C区: CPU: ...
- Linux 永久修改主机名hostname
前言: 由于最近用3台机器,经常切换导致有容易区别的需求. 故想修改主机名. 实验环境:Ubuntu 17 教程: 1. 使用hostname 命令先临时修改 sudo hostname your_n ...
- Redhat 系统修改主机名 hostname
临时修改主机名 方法如下: #hostname newname //将newname替换为想要的主机名 如: #hostname test01 //将主机名修改为test01 永久修改主机名 (说明: ...
- Linux命令之获取和修改主机名hostname
概述 hostname 命令可以获取当前主机名和临时修改主机名. 语法 该命令的语法如下: hostname [选项] [参数] 该命令支持的选项有: 选项 说明 -a 显示主机别名 -d 显示DNS ...
- 【linux】主机名被改为bogon原理分析|修改主机名hostname的方法
目录 linux主机名被更改为bogon原理分析 修改主机名的方法 1.临时修改,重启失效 2.永久生效 linux主机名被更改为bogon原理分析 博客原址:http://blog.csdn.net ...
- Ubuntu16.04 永久修改主机名 hostname
1. 查看主机名 在终端输入 hostname 即可查看主机名 wohu@wohu:/$ hostname wohu wohu@wohu:/$ 2. 修改主机名 2.1 修改 /etc/hostnam ...
最新文章
- mvp关联activity生命周期_Rxjava+Retrofit统一异常处理与生命周期管理
- 生产环境提升rman备份速度----启动块跟踪
- oracle 韩思捷_Oracle数据库技术服务案例精选
- 分享一个.NET平台开源免费跨平台的大数据分析框架.NET for Apache Spark
- linux 第三章红帽子,红帽子 Linux_命令全解
- VC用ADO访问数据库全攻略 作者 相生昌
- 双11 拼多多iPhone 11系列香气扑鼻:最高降幅达1600元
- 【IDEA】报错:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
- 凸优化学习笔记(一):仿射集、凸集、锥
- 高德地图--根据地理位置获取经纬度
- 苹果笔记本安装windows系统
- scara机器人dh参数表_机器人之DH参数例子-SCARA机器人
- 【Bug解决】UnpicklingError: A load persistent id instruction was encountered, but no persistent_load.
- java实现日历打印
- 编码,隐匿在计算机软硬件背后的语言读书笔记(9)
- 2021年如何折腾小米平板2,装上win11
- UX设计师是做什么的,现在怎么样
- bat 格式化年月日时分秒
- Python GUI界面编程-初识
- 安卓手机阅读器_【BOOX彩屏】彩色墨水屏阅读器,BOOX Poke2 Color 使用体验
热门文章
- 马哥2016linux就业班+架构班+运维班全套
- mendeley引用参考文献不显示_【参考文献管理工具-1】使用Mendeley在Word中插入引用与参考文献...
- python爬虫文件下载很慢卡住线程_python爬虫多线程假死怎么解决?
- 2013年网站内容建设新趋势
- PhoneAccount流程解析(SIM卡管理器)拨号过程中解析PhoneAccount
- python 将小图放入较大的白色或黑色背景图片
- php json里面追加一个数组,如何往指定是json数组里面添加数据
- 贵安新区打造“三链融合”大数据核心区
- Nubia Z18 联通VoLte修复,基带文件
- FPGA-超声波避障小车(ego1)