hnu云计算个人实验报告——实验六

本文详细描述了在AlmaLinux9环境中配置图形用户接口(如XWindowsSystem、GNOME和KDE)、定制用户环境(包括shell和X环境)以及远程操作Linux的方法。通过实例演示了如何安装桌面环境、启动和切换图形模式、自定义shell设置和使用X远程桌面协议进行远程连接。
摘要由CSDN通过智能技术生成

实验题目

Linux图形用户接口与定制用户环境

实验目的

实验6.1和实验6.2

实验环境

1. AlmaLinux release 9.0 (Red Hat分支)

2. VMware Workstation Pro 16

3. MobaXterm v20.0

实验内容及操作步骤:

实验6.1 Linux图形用户接口

3.1在虚拟机上安装GUI和桌面环境

1. 以root身份在tty2上登录

2. 配置阿里云开发者社区镜像源,安装和启用扩展软件源(存储库)

为了提升工程师的开发体验,Almalinux 9 有三个预启用存储库:

BaseOS —操作系统的大部分内容(默认启用)

Application Streams (AppStream) — 大多数开发人员工具(默认启用)

CodeReady Builder — 其他库和开发人员工具(默认不启用)

3. 执行下列命令安装X Windows System组件和GNOME和KDE桌面环境。

3.2 启动GUI

1. 以root身份在tty2上登录

2. 查看系统默认的启动目标服务组,并确保默认服务组为multi-user.target。

3. 切换到tty1,图形环境启动了吗?

没有启动图形化界面。

4. 以普通用户身份登录tty1并使用startx命令启动X的不同图形环境。

5. 结束图形环境并退出登录。

6.切换到tty2,通过切换系统运行级临时启动图形模式。这种方式启动图形环境,系统重启后自动恢 复默认的文本模式。

7. 切换到tty2,切换系统运行级返回文本模式。

图形界面消失了。

8. 切换到tty2,通过修改系统默认的启动目标服务组设定系统开机后自动启动图形模式。修改默认服 务组为graphical.target。然后再次重新引导系统。图形环境启动了吗?

3.3使用GNOMESDDM显示管理器

1. 配置使用SDDM  

2. 注销登录,返回SDDM显示器管理登录界面 用户登录后,在菜单中选择注销,退出桌面环境,TTY1是否能返回到图形登录界面?如果tty1不显 示图形登录界面,切换到tty2,重新启动图形环境。

不能。

3. 配置使用GDM

4. 注销登录,返回GDM显示器管理登录界面 用户登录后,在菜单中选择注销,退出桌面环境,TTY1是否能返回到图形登录界面?

GDM可以返回到图形登录界面。

3.4使用GNOME和KDE桌面环境

1. 系统重启后,在图形登录界面,选择自己的用户名称和不同的图形桌面环境登录。

2. GNOME和KDE项目都交付了各种应用程序,例如字处理器,文件管理器,文本编辑器等,作为代 码库的标准部分。 这些应用程序通常是Microsoft Windows平台上相应应用程序的直接竞争对手。 默认的Linux安装会安装许多此类应用程序,您可以从GNOME和KDE网站下载更多内容。在 GNOME和KDE Plasma桌面环境中浏览,并尝试识别可实现特定功能的应用程序的名称。 (可以通过打开终端窗口并执行ps -ux命令进行检索)

3. 在两个桌面环境中,探索主题功能。在KDE中设置主题后,启动GNOME应用程序,反之亦然。 访问路径:KDE开始菜单>>设置>>系统设置>>外观>>全局主题>>视觉风格&窗口装饰元素&颜色& 图标&光标&欢迎屏幕等。

4. 在KDE中,尝试启动GNOME应用程序,反之亦然。尝试在KDE和GNOME应用程序之间剪切和粘贴。

GNOME中启动KDE程序

3.5 为所有用户禁用 Wayland

1. 以 root 用户身份打开 /etc/gdm/custom.conf 文件。

2. 在文件的 [daemon] 部分找到以下行:

3. 通过删除 # 字符取消对行的注释。因此,行显示:

4. 重启系统:

3.6远程操作Linux系统图形界面

1. 安装X远程桌面协议xrdp

2. 开启网络防火墙的远程桌面协议端口3389

3. 在Mobaxterm中开启New session,选择RDP协议,填写虚拟机的IP地址、Linux系统用户和密 码,其中IP地址必填,用户名和密码可以不输入。(也可以使用windows自带的”远程桌面连接“)

5. 远程连接虚拟机Linux系统需要物理机和虚拟机在同一个子网下,如果物理机无法连通虚拟机,请 按以下方式修改物理机、VMware虚拟网络和虚拟机网络参数,确保三者IP地址的前3段一致。 1)物理机》win10开始菜单》设置》网络和共享中心》更改适配器设置》VMnet8(右键属性)》 TCP/IPV4(属性)IP地址:192.168.XX.1

3.7 本地显示和操作远程X Client

1. 打开终端软件MobaXterm的ssh会话,连接云服务器ECS,使用你自己的账号和密码登录。

2. 点击右上角❎关闭图标下方的黑色X符号按钮,启动本地X server,当X server启动成功后,该图 标变成彩色。

3. 本地显示远程X11应用程序

4. 点击右上角的❎关闭图标或者通过进程和任务控制关闭X11应用程序。

实验6.2 定制用户环境

3.1自定义shell环境

1. 由于本实验涉及root用户权限,请在本地虚拟机完成实验;使用的配置文件为文本模式的配置文 件,请在文本模式下完成。

2. 每次登录时,请更改相应的文件以更改您的环境。登录时,请确保具有以下功能: a. 更改主提示以向您显示当前目录的完整路径。 b. 显示一条消息,说明您的登录名和登录日期。 c. 定义一个别名num,该编号显示您当时已登录的用户数。 d. 将变量cheese设置为gouda。

3. 注销并再次登录。检查您在步骤1中定义的功能是否已激活。 a. 您的提示是否显示当前目录的完整路径? b. 您的讯息显示了吗? c. 可以使用num命令吗? d. 变量cheese是否设置为gouda?

4. 如果先前的所有问题都回答“是”,请继续执行步骤5。否则,请再次尝试步骤2和3来解决问题。

5. 启动子shell并回答以下问题。 •您的提示是否显示当前目录的完整路径? •您的消息显示了吗? •您可以使用num命令吗? •您可以在Vi中使用命令历史记录吗? •变量cheese是否设置为gouda?

不行。

6. 如果设置在子shell中也可用,请继续执行步骤9。否则,请继续执行步骤7。

7. 大多数设置(系统变量除外)仅适用于当前环境,而不传递给子shell。系统中有一个配置文件,该 文件也使设置可在子shell中使用。这是哪个文件? 思考该问题后继续执行步骤8。

8. 编辑.bash_profile/ .profile和.bashrc文件,以便正确的设置位于正确的配置文件中。 .bash_profile/ .profile中应包含哪些设置,.bashrc中应包含哪些设置?

9. 注销并再次登录,查看您的登录环境中是否设置了您的设置。还要检查设置是否在子shell中设置。

10. 在前面的步骤中,您更改了配置文件,然后注销并登录以激活新设置。如何在更改后的自定义文件 中激活设置而无需注销并再次登录?

11. 如果您不在登录shell中,请立即返回那里。

12. 从您的环境中删除num别名,而无需编辑.bashrc或.bash_profile文件。然后显示当前设置的别名 列表,并尝试执行num别名。

13. 将num别名添加到您的环境中,然后检查num是否再次存在。

3.2 自定义X环境

1. 按快捷键切换到tty1图形虚拟终端,使用您自己的名称登录KDE桌面环境。打开一 些应用程序,更改一些主题。打开系统设置>>开机和关机>>会话管理:选中登入时”恢复先前保持 的会话“,然后点击应用,然后注销。然后再次登录。您的打开应用程序会再次出现吗?

会再次出现。

收获与体会:

  1. 了解了图形化界面的配置,对终端间的相互切换更了解了。

实验成绩

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的实现,实现了学生信息的添加和查看、实验课程信息的添加和查看、选课功能等。由于篇幅限制,代码仅供参考: ```c++ #include <iostream> #include <string> #include <vector> #include <map> using namespace std; // 学生类 class Student { private: string id; // 学号 string name; // 姓名 string major; // 专业 int grade; // 年级 vector<string> courseList; // 已选课程列表 public: Student(string id, string name, string major, int grade) { this->id = id; this->name = name; this->major = major; this->grade = grade; } string getId() { return id; } string getName() { return name; } string getMajor() { return major; } int getGrade() { return grade; } // 添加已选课程 bool addCourse(string courseName) { if (courseList.size() >= 2) { // 每学期必修学分 cout << "每学期只能选两门实验课程!" << endl; return false; } for (string course : courseList) { // 检查是否已选该课程 if (course == courseName) { cout << "不能重复选课!" << endl; return false; } } courseList.push_back(courseName); cout << "选课成功!" << endl; return true; } // 查看已选课程 void viewCourseList() { if (courseList.empty()) { cout << "未选课程!" << endl; } else { cout << "已选课程:" << endl; for (string course : courseList) { cout << course << endl; } } } }; // 实验课程类 class Course { private: string name; // 课程名称 string labName; // 实验室名称 int maxNum; // 最大选课人数 vector<Student*> studentList; // 已选学生列表 public: Course(string name, string labName, int maxNum) { this->name = name; this->labName = labName; this->maxNum = maxNum; } string getName() { return name; } string getLabName() { return labName; } int getMaxNum() { return maxNum; } // 添加已选学生 bool addStudent(Student* student) { if (studentList.size() >= maxNum) { cout << "选课人数已满!" << endl; return false; } for (Student* s : studentList) { // 检查是否重复选课 if (s->getId() == student->getId()) { cout << "不能重复选课!" << endl; return false; } } studentList.push_back(student); cout << "选课成功!" << endl; return true; } // 查看已选学生 void viewStudentList() { if (studentList.empty()) { cout << "未选学生!" << endl; } else { cout << "已选学生:" << endl; for (Student* student : studentList) { cout << "学号:" << student->getId() << ",姓名:" << student->getName() << ",专业:" << student->getMajor() << ",年级:" << student->getGrade() << endl; } } } }; // 选课管理系统 class CourseSelectionSystem { private: map<string, Course*> courseMap; // 实验课程map,key为课程名称 vector<Student*> studentList; // 学生列表 public: // 添加学生 void addStudent() { cout << "请输入学号:"; string id; cin >> id; cout << "请输入姓名:"; string name; cin >> name; cout << "请输入专业:"; string major; cin >> major; cout << "请输入年级:"; int grade; cin >> grade; Student* student = new Student(id, name, major, grade); studentList.push_back(student); cout << "添加成功!" << endl; } // 查看学生信息 void viewStudentList() { if (studentList.empty()) { cout << "学生列表为空!" << endl; } else { cout << "学生列表:" << endl; for (Student* student : studentList) { cout << "学号:" << student->getId() << ",姓名:" << student->getName() << ",专业:" << student->getMajor() << ",年级:" << student->getGrade() << endl; student->viewCourseList(); // 查看已选课程 } } } // 添加实验课程 void addCourse() { cout << "请输入课程名称:"; string name; cin >> name; cout << "请输入实验室名称:"; string labName; cin >> labName; cout << "请输入最大选课人数:"; int maxNum; cin >> maxNum; Course* course = new Course(name, labName, maxNum); courseMap[name] = course; cout << "添加成功!" << endl; } // 查看实验课程信息 void viewCourseList() { if (courseMap.empty()) { cout << "实验课程列表为空!" << endl; } else { cout << "实验课程列表:" << endl; for (auto& kv : courseMap) { Course* course = kv.second; cout << "课程名称:" << course->getName() << ",实验室名称:" << course->getLabName() << ",最大选课人数:" << course->getMaxNum() << endl; course->viewStudentList(); // 查看已选学生 } } } // 学生选课 void selectCourse() { cout << "请输入学号:"; string id; cin >> id; Student* student = nullptr; for (Student* s : studentList) { if (s->getId() == id) { student = s; break; } } if (student == nullptr) { cout << "学号不存在!" << endl; return; } cout << "请输入要选的课程名称:"; string courseName; cin >> courseName; Course* course = courseMap[courseName]; if (course == nullptr) { cout << "课程不存在!" << endl; return; } course->addStudent(student); student->addCourse(courseName); } }; int main() { CourseSelectionSystem css; while (true) { cout << "请选择操作:" << endl; cout << "1. 添加学生" << endl; cout << "2. 查看学生信息" << endl; cout << "3. 添加实验课程" << endl; cout << "4. 查看实验课程信息" << endl; cout << "5. 学生选课" << endl; cout << "0. 退出" << endl; int choice; cin >> choice; switch (choice) { case 1: css.addStudent(); break; case 2: css.viewStudentList(); break; case 3: css.addCourse(); break; case 4: css.viewCourseList(); break; case 5: css.selectCourse(); break; case 0: return 0; default: cout << "输入错误,请重新输入!" << endl; break; } } return 0; } ``` 需要注意的地方有: 1. 学生和实验课程的信息需要使用类来封装,并且需要定义相应的getter和setter方法。 2. 学生和实验课程需要使用vector和map来存储,方便后续的查找和添加操作。 3. 选课需要检查学生是否已选该课程、每学期选课学分是否超过两门、选课人数是否已满等条件,需要仔细判断和处理。 4. 代码中使用了指针来存储学生和实验课程的对象,需要注意内存管理的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随行佯醉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值