写在前面

本文为早期版本,可能有些许谬误,阅读时请注意甄别。

亲爱的探索者们:

欢迎踏上Linux实践征途!在启程之前,请仔细阅读这份导航手册:

  1. 知识储备

    • ✅ 完整阅读《Linux学习建议》
    • ✅ 掌握《Linux培训》核心知识
  2. 实践价值 每个任务都是真实场景的微缩景观,完成本作业你将收获:

    • 🛠️ Linux环境搭建与运维的工程化思维
    • 📝 技术文档写作的规范化能力
    • 🔍 从报错信息中定位问题的火眼金睛
  3. 学术准则 允许使用AI工具辅助学习,但必须遵守:

    • 🤖 所有AI生成内容必须经过终端验证
    • 🚫 禁止直接复制模型输出作为答案
    • 📚 引用第三方资源需按相关网站协议要求标注出处和作者

特别提示:实验室将使用代码查重工具对所有提交内容进行交叉验证,请确保作业的原创性。

第零章

Level 1

  • 掌握标准语法(标题/列表/代码块/表格)
  • 熟练使用扩展语法(流程图/时序图/LaTeX公式)
  • 实践Typora/VSCode等编辑器的进阶功能(目录生成/文档导出 PDF/HTML/版本控制)

Level 2

除了题目的答案,推荐使用 Markdown 详细记录以下内容:

  1. 操作日志:包含完整终端命令与输出
  2. 知识注解:对关键步骤添加原理说明
  3. 问题档案:记录遇到的错误及解决路径(建议使用代码块+注释的混合排版)

P.S. 优秀的笔记可以增加印象分哦~

Level 3(选做)

将记录的 Markdown 内容部署到个人博客系统(如 Wordpress、Typecho、Ghost、Hexo、Hugo、halo 等)。

在编写博客时,如果需要引用其他资料,请按照相关网站协议要求标注出处和作者

规范要求

演示:

https://hs.cnies.org/archives/part0-level1

编译链接

作业提交

提交地址https://f.wps.cn/g/IF4Q9gbs/

截止时间:2025年2月16日 23:59,过时不候

你需要填写:

  1. 姓名、学号、QQ号等个人信息
  2. 作业文件:包含作业答案的 Markdown 文件。请确保图片、超链接等元素链接准确、可被访问。你可以将图片上传到图床,或者将图片和 Markdown 文件一起打包提交,也可以导出 PDF 提交。如果图片无法正常显示将视为未完成。
  3. 博客地址:选做。需要提交永久可访问的部署链接,如果答案上传到博客可以只上传博客地址。
  4. 题目完成情况:勾选你完成的题目

第一章

zht想在自己的天选姬上装一个linux系统。

zht查阅资料后发现Ubuntu是生态较好的【发行版】之一,出于学习目的决定使用虚拟机进行安装。zht打开浏览器,在清华大学开源软件镜像站 下载了系统所需要的iso文件,通过搜索【虚拟机软件】得知VMware是其中一款使用广泛的软件。经过简单的教程学习与短暂的载入,zht成功的在虚拟机上安装了Ubuntu!西卡西,桌面空空如也。zht通过快捷键Ctrl + Alt + T】打开了终端,正式开启了自己的linux之旅。


1.在安装虚拟机时,zht创建了一个名为“youzicha”的用户。在终端中输入

pwd

(也就是print working directory)可以查看当前所处的文件夹,如在桌面时为 /home/youzicha

2.使用命令

ls

可以查看当前文件夹下的文件等,如 Desktop Documents Downloads etc.;点击图形化桌面上的Home文件夹,可以发现是一致的。

3.此时使用

cd Desktop

命令可以切换文件夹到Desktop下。


4.“我可是要成为linus linux的男人!” zht立马开始编写自己在Ubuntu上的第一个c程序。

他在Desktop文件夹下使用命令

mkdir firstStep

创建了一个名为"firstStep"的新文件夹 。

5.zht早就听过文本编辑器Vim的大名,于是他在终端输入

vim hello211Lab.c

打算使用vim创建并打开一个名叫hello211Lab.c的c文件。

6.发现出现如下信息:Command 'vim' not found, but can be installed with: …… “可恶,原来还要下载吗?vi你这家伙……” 根据提示,zht输入

sudo apt install vim

下载vim并进行下一步操作。

ps:vim的使用


"终于可以开始写代码啦!"zht在hello211Lab.c中输入

#include<stdio.h>
int main(int argc, char *argv[])
{
    printf("Hello! My 211Lab!");
    return 0;
}

ps:【Ubuntu 22.04国内源】

并*退出保存。“不对,我该怎么运行啊?”

7.经过资料查阅,zht知道了.c文件需要编译出可执行文件才能运行。

在安装好gcc后,终端输入

gcc hello211Lab

可以发现产生了新文件 hello211Lab

8.再次输入

./hello211Lab

即可运行程序得到结果 Hello! My 211Lab!

ps:关于main函数参数“int argc, char *argv[]”

此外,命令【echo】也可以进行程序编写。输入 echo >> <file></em></strong> 可以实现同样的效果,请注意:<strong>></strong> 会覆盖文件中的内容 ;而 <strong>>></strong> 则在文件末尾追加内容</p> <p>命令【<strong><em>cat</em></strong>】可以输出文件中的信息,如 <strong><em>cat hello211Lab.c</em></strong> 会直接得到上述代码块中的内容。</p> <hr /> <p>…………</p> <p><strong>多年以后,当面对眼前的电脑,zht书记将会想起编写hello211Lab.c的那个下午。</strong></p> <p>9.zht书记在 <strong>/home/youzicha</strong> 下使用命令【<strong>find</strong>】查找他在linux上所编写第一个c程序,不过他已记不清楚文件的全名,只知道是以Lab为结尾的c程序。</p> <pre><code>find /home/youzicha f -name '*Lab.c'

得到 ./Desktop/firstStep/hello211Lab.c

10.他使用【cp】命令为其复制建立了一个后缀名为.bak的副本;

cp hello211Lab.c hello211Lab.bak

11.在/Desktop下使用【mv】即 *mv firstStep/ . 将所有的文件移动到此处,并使用命令【rm

rm -r firstStep

删除了自己建立的第一个文件夹。

zht不语,只是一味地看着桌面。他在思考、思考。

良久,良久。

他输入了【touch】(touch finale) 建立了一个名为”finale“的文件。他使用vim在其中写下:

***万物迎春送残腊,一年结局在今宵。***

第二章

共包含两道日常使用场景的题目,每道题目给出了当前的用户和路径。每道题目可能有一条或者多条指令。

Deepseek R1

近期,Deepseek 上线了 V3 和 R1 模型火爆全网。陈茗研师姐想要在他的电脑上部署 Deepseek R1 模型,使用 llama.cpp 框架进行推理。

陈茗研师姐的电脑配置如下,请协助完成以下操作:

myggfetch_.png

一、安装 Docker

  1. 首先,陈茗研从清华大学镜像站下载 Docker 27.5.1 静态二进制包(https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/docker-27.5.1.tgz):

    7uHeck@LAPTOP-114514:~$ wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/docker-27.5.1.tgz
  2. 解压源码包到 /opt/docker

    7uHeck@LAPTOP-114514:~$ sudo mkdir -p /opt/docker 
    7uHeck@LAPTOP-114514:~$ sudo tar -xvzf docker-27.5.1.tgz -C/opt/docker
  3. 为了让当前用户在不切 root,或者不加 sudo 的情况下正常使用 Docker 命令,陈茗研师姐首先添加了 Docker 用户组

    7uHeck@LAPTOP-114514:~$ sudo groupadd docker

    将当前用户添加到用户组

    7uHeck@LAPTOP-114514:~$ sudo usermod -aG docker $USR

    使权限生效

    7uHeck@LAPTOP-114514:~$ newgrp docker

    检查是否生效

    7uHeck@LAPTOP-114514:~$ docker --version
  4. 编辑 /etc/systemd/system/docker.service 加入下面内容,然后通过 _____ 操作完成了保存并退出。此时已经将 Docker 注册为 service 服务。

    7uHeck@LAPTOP-114514:~$ vim /etc/systemd/system/docker.service
    
    # 然后加入了下面内容
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service
    Wants=network-online.target
    
    [Service]
    Type=notify
    ExecStart=/opt/docker/dockerd 
    ExecReload=/bin/kill -s HUP $MAINPID
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    TimeoutStartSec=0
    Delegate=yes
    KillMode=process
    Restart=on-failure
    StartLimitBurst=3
    StartLimitInterval=60s
    
    [Install]
    WantedBy=multi-user.target
  5. 添加执行权限并重新加载配置文件

    7uHeck@LAPTOP-114514:~$ sudo chmod +x /opt/docker/dockerd
  6. 启动 Docker

    7uHeck@LAPTOP-114514:~$ sudo systemctl daemon-reload

二、下载模型

在 AI 社区 ModelScope 中,DeepSeek R1 模型的 GGUF 格式文件包含以下量化版本的模型

  • DeepSeek-R1-Distill-Llama-8B-GGUF
  • DeepSeek-R1-Distill-Qwen-1.5B-GGUF
  • DeepSeek-R1-Distill-Qwen-7B-GGUF
  • DeepSeek-R1-Distill-Qwen-14B-GGUF
  • DeepSeek-R1-Distill-Qwen-32B-GGUF

陈茗研师姐的电脑可以运行 ___ 参数的模型。

三、在 Docker 中部署和使用 llama.cpp

llama.cpp 的仓库链接为 https://github.com/ggerganov/llama.cpp.git,他使用下面指令将仓库克隆到本地

7uHeck@LAPTOP-114514:~$ git clone https://github.com/ggerganov/llama.cpp.git

他使用下面指令构建了使用 CUDA 的 llama.cpp:

7uHeck@LAPTOP-114514:llama.cpp$ docker build -t local/llama.cpp:full-cuda --target full -f .devops/cuda.Dockerfile .
7uHeck@LAPTOP-114514:llama.cpp$ docker run --gpus all -v ~/models:/models local/llama.cpp:full-cuda --run -m /models/?B/ggml-model-q4_0.gguf -p "Building a website can be done in 10 simple steps:" -n 512 --n-gpu-layers 1

服务器运维日常

cjgg 的博客宕机了,他想要收集并分析错误信息,整理文件结构,同时生成报告,你们帮他完成这个挑战嘛?

  1. 首先,cj 需要从从远程服务器 www.galaxry.top114514 端口用户 GalaxryX300/home/GalaxryX300/logs 目录下载压缩包 web_logs.tar.gz 到本地 /home/angel/logs,他使用了下面指令创建并将文件传输到本地:

    angel@LAPTOP-114514:~$ scp -P 114514 GalaxryX300@www.galaxry.top:/home/GalaxryX300/logs/web_logs.tar.gz /home/angel/logs
  2. 解压 web_logs.tar.gz,生成目录 web_logs,删除原压缩包:

    angel@LAPTOP-114514:~$ tar -xvzf /home/angel/logs/web_logs.far.gz -C /home/angel/logs
    angel@LAPTOP-114514:~$ rm /home/angel/logs/web_logs.far.gz
  3. 使用下面命令将 web_logs 目录的树状结构输出到 /home/angel/logs/dir_tree.txt

    angel@LAPTOP-114514:~$ tree /home/angel/logs/web_logs >/home/angel/logs/dir_tree.txt
  4. 查看了 web_logs 目录结构,cjgg 决定在 web_logs 目录中查找所有扩展名为 .log 的文件,并使用 file 命令确认它们的类型:

    angel@LAPTOP-114514:~$ find /home/angel/logs/web_logs f -name "*.log" file {} \;
  5. 在所有 .log 文件中搜索包含 ERROR 的行,将结果保存到 /opt/logs/error_summary.txt,然后统计 error_summary.txt 的总行数:

    angel@LAPTOP-114514:~$ grep -r "ERROR" /home/angel/logs/web_logs/*.log > /opt/logs/error_summary.txt
    angel@LAPTOP-114514:~$ wc -l opt/logs/error_summary.txt
  6. error_summary.txt 按字母顺序排序,去重后统计每种错误出现的次数,结果保存为 error_stats.txt

    angel@LAPTOP-114514:~$ sort /opt/logs/error_summary.txt | uniq -c > /opt/logs/error_stats.txt
  7. cjgg 根据日志的信息进行分析后果断找到了问题所在。将修复完成后的日志打包为 web_logs_fixed.tar.gz,进行一系列分析后得到了 error_summary_fixed.txt。cjgg 将它对比原始 error_summary.txt,输出差异到 diff_result.txt

     angel@LAPTOP-114514:~$ diff /opt/logs/error_summary.txt /opt/logs/error_summary_fixed.txt > /opt/logs/diff_result.txt

第三章

  1. 有一天,wyh为了完成操作系统的一份大作业,找了一个开源的os项目,他把它clone了下来,并且开始在ubuntu22.04系统中搭配环境,使用apt包管理工具。

    首先,他看到了CMakeLists.txt中有对cmake版本号的要求

    cmake_minimum_required(VERSION 3.10)
    project(AdvancedOS)

    首先要求cmake的最低版本是3.10,他使用了cmake --version来查看cmake的版本以及其他信息,但是遇到了error

    N: Unable to locate package cmake
    N: Unable to locate package cmake
    E: No packages found

    不过,wyh一眼就看出了问题所在,他执行了sudo apt install cmake,便解决了这个问题,并且再次执行cmake --version,了解了软件包中cmake的版本信息

    Package: cmake
    Version: 3.22.1-1ubuntu1.22.04.2
    Priority: optional
    Section: devel
    Origin: Ubuntu

    在当前软件包下,cmake的版本号是3.22.1,符合CMakeLists.txt的要求。但是,wyh很好奇,如果错误安装了不符合要求的cmake版本,会发生什么问题,于是他使用wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz,tar -zvxf cmake-3.9.0-Linux-x86_64.tar.gz,下载预编译的二进制文件(网址是https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz)解压缩,并且使用export PATH=pwd/cmake-3.9.0-Linux-x86_64/bin:$PATH添加了环境变量。

    安装了cmake 3.9.0,并且进行编译,遇到了以下错误

    CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
     CMake 3.10 or higher is required.  You are running version 3.9.0
    
    -- Configuring incomplete, errors occurred!

    提示说,需要cmake 3.10或者更高版本,3.9.0的版本太低,然后他执行了rm -rf cmake-3.9.0-Linux-x86_64,删除了cmake,并且使用wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz重新下载了cmake 3.22.1版本,并且使用sudo apt install build-essential qtbase5-dev qtbase5-dev-tools libqt5charts5-dev安装了一系列依赖build-essential qtbase5-dev qtbase5-dev-tools libqt5charts5-dev

    然后wyh想要确定目录结构是否正确

    正确的目录结构

    AdvancedOS/
    ├── CMakeLists.txt
    ├── include/
    │   ├── kernel.h
    │   ├── advanced_kernel.h
    │   ├── network.h
    │   ├── user_auth.h
    │   ├── disk_manager.h
    │   ├── logger.h
    │   └── mainwindow.h
    ├── src/
    │   ├── kernel.cpp
    │   ├── advanced_kernel.cpp
    │   ├── network.cpp
    │   ├── user_auth.cpp
    │   ├── disk_manager.cpp
    │   ├── logger.cpp
    │   ├── mainwindow.cpp
    │   └── main.cpp
    └── build/

    而wyh发现当前的目录结构缺少build文件夹,使用mkdir build创建了该文件夹,使用cd /build进入了该文件夹然后使用camke ..进行编译,生成了Makefile构建文件,最后使用make ..,读取 Makefile 文件中的规则,决定哪些文件需要重新编译,并执行相应的命令来生成目标文件(如可执行文件、库文件等),完成了这项大作业。

    提示:cmake需要 CMakeLists.txtmake 需要 Makefile

  2. 小明参加了一个比赛,比赛内容是使用yolo进行目标检测,但是小明自己的显卡不足以支持大模型的训练,所以小明选择在某平台租用服务器进行训练。 首先,小明需要将本地的数据集打包成一个压缩文件,他使用tar -cvfz datdsets.tgz datasets 进行压缩,压缩成.tgz格式,并且使用scp -P 45847 datasets.taz root@i-2.gpushare.com:/hy-tmp,使用ssh传输协议,上传到服务器端口号为45847,用户为root,主机名为i-2.gpushare.com,本地相对路径为datasets,远地服务器路径为/hy-tmp。上传之后,请使用tar -xzfv /hy-tmp/datasets.tgz -C /hy-tmp对压缩文件进行解压缩,然后小明需要对数据集进行处理,他编写了test.py,并运行,因为小明还要处理其他事情,使用他使用nohup python test.py&在后台运行,并得知了此进程的作业ID:[1]和进程ID:[7520]。运行之后,小明想看一下当前运行的所有进程,于是使用了ps aux。但是,粗心的小明忽然想起自己犯了一个错误,使用kill 7520结束了该进程,修改错误后,重新运行,处理好数据集后,小明便开始训练模型了,训练完成后,小明使用scp -P 45847 datasets.taz root@i-2.gpushare.com:/hy-tmp/ultralytics/runs/detect/train1 result/从远程服务器将训练结果传输到本地,远程服务器地址为/hy-tmp/ultralytics/runs/detect/train1,本地相对路径为result,小明发现训练结果还不错,就结束了训练。

  3. 有一天,小李想在ubuntu:22.04系统中做一个小实验,因为VM太慢了,所以小李选择在docker中使用docker pull ubuntu:22.04拉取一个ubuntu:22.04的镜像,然后小李使用docker run buntu:22.04运行这个容器,在经过一系列操作后,小李完成了实验,小明使用docker ps -a和dcoker pause 72fa7d384222查看所有容器并且暂停了CONTAINER ID为72fa7d384222的容器,然后,小李使用docker rmi ubuntu尝试删除ubuntu这个镜像,但是他遇到了一个错误

    Error response from daemon: conflict: unable to remove repository reference "ubuntu" (must force) - container 72fa7d384222 is using its referenced image b1d9df8ab815

    但小李一下子就想到了怎么解决,用docker stop 72fa7d384222和docker rmi ubuntu成功删除了容器和镜像。

  4. 你的任务是在 Linux 系统上下载、配置并运行OpenShot。 tips: 下载 AppImage 文件,网址为https://github.com/OpenShot/openshot-qt/releases/download/v3.1.1/OpenShot-v3.1.1-x86_64.AppImage 赋予执行权限 运行 AppImage 文件

    wget https://github.com/OpenShot/openshot-qt/releases/download/v3.1.1/OpenShot-v3.1.1-x86_64.AppImage
    chmod +x OpenShot-v3.1.1-x86_64.AppImage
    ./OpenShot-v3.1.1-x86_64.AppImage
  5. 你现在获得了一个myiso.iso文件,你需要将其挂载到/mnt/iso目录下,注意该目录现在是不存在的,使用指令一和指令二完成这一步,在处理完成后,你还需要使用指令三解除挂载

    Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”。

    注意:“挂载点”的目录需要以下几个要求:

    (1)目录事先存在,可以用mkdir命令新建目录;

    (2)挂载点目录不可被其他进程使用到;

    (3)挂载点下原有文件将被隐藏。

    sudo makdir /mnt/iso
    sudo mount -o loop myiso.iso /mnt/iso
    sudo unmount /mnt/iso
  6. 假如你是一家公司的系统管理员,负责管理公司内部的多台服务器。某天,小智想要通过指令一SSH连接公司内部一台服务器(IP地址:192.168.1.100,用户名为zht),却发现无法连接,且该服务器上的Web服务也无法访问,所以你首先输入指令二查看所有网络接口信息,之后用指令三检查了网络的连通性,又通过指令四和指令五扫描检查服务器的SSH端口和HTTP端口是否开放,并输入指令六(请使用iproute2工具集中的命令)显示所有监听端口。假设服务器使用的是iptables作为防火墙工具,使用指令七查看当前防火墙规则(以root身份),并使用指令八添加规则允许SSH连接。如果HTTP端口开放但Web服务仍然无法访问,使用指令九检查httpd服务的状态,并使用指令十启动httpd服务。之后使用指令十一抓取服务器(网络接口为ens33)的网络流量,分析是否有异常流量或攻击行为。

    1.ssh zht@192.168.1.100
    2.ip addr show
    3.ping 192.168.1.100
    4.nmap -p 192.168.1.100
    5.nmap -p 80 192.168.1.100
    6.ss -tuln
    7.sudo iptables -L
    8.sudo iptables -A INPUT -p tup --dport 22 -j ACCEPT
    9.sudo systemctl status httpd
    10.sudo systemctl start httpd
    11.sudo systemctl -i ens33
计算机小白一枚
最后更新于 2025-07-23