Linux基础复习第五天

Linux基础复习第五天

1./etc/passwd 这个文件有什么作用,记录的内容是什么

/etc/passwd 是 Linux的核心系统文件,用于存储用户账户的基本信息。它是用户身份验证、权限管理和进程控制的基础。尽管文件名包含 passwd,但它不存储加密后的密码(现代系统中密码通常存储在 /etc/shadow 文件中),而是记录用户的其他关键属性。

文件中的每一行对应一个用户账户,字段由冒号 : 分隔,共 7 个字段。格式如下:

username:password:UID:GID:GECOS:home_directory:shell

各字段含义

字段说明
1. username用户名(登录名)。这是用户登录系统时使用的唯一标识符。
2. password密码占位符。现代系统中该字段通常为 x*,表示密码实际存储在 /etc/shadow 中。
3. UID (User ID)用户的唯一数字标识符(User ID)。系统通过 UID 识别用户,而不是用户名。
4. GID (Group ID)用户的主组的唯一数字标识符(Group ID)。主组信息在 /etc/group 中定义。
5. GECOS用户描述信息(如全名、电话号码等)。通常用于注释或显示用户信息。
6. home_directory用户的主目录路径(Home Directory)。用户登录后默认进入此目录。
7. shell用户登录后使用的默认 Shell(命令解释器)。如 /bin/bash/sbin/nologin

以下是 /etc/passwd 文件中的典型条目:

root:x:0:0:root:/root:/bin/bash
  • 解释:
    • root:用户名。
    • x:密码占位符(实际密码在 /etc/shadow 中)。
    • 0:UID 为 0(root 用户的 UID 固定为 0)。
    • 0:GID 为 0(root 的主组 ID 为 0)。
    • root:GECOS 字段(用户描述信息)。
    • /root:root 用户的主目录。
    • /bin/bash:root 用户的默认 Shell。

2.如果我想获取上面文件的以:分隔的第一列内容,如何获取

可以使用以下几种常见的Linux命令:

  • 使用 cut 命令
    cut -d: -f1 /etc/passwd
    
    • 说明:

      • -d::指定字段分隔符为冒号 :
      • -f1:提取第一个字段(即用户名)。
      # 输出为:
      root
      daemon
      bin
      sys
      .......
      
  • 使用 awk 命令
    awk -F: '{print $1}' /etc/passwd
    
    • 说明:

      • -F::指定字段分隔符为冒号 :
      • {print $1}:打印每一行的第一个字段。
      # 输出为:
      root
      daemon
      bin
      sys
      .......
      
  • 使用 cat 和管道符
    cat /etc/passwd | awk -F: '{print $1}'
    
    • 说明:
      • cat /etc/passwd:读取文件内容。
      • |:将输出传递给 awk 处理。
      • awk -F: '{print $1}':提取用户名。
      • -F::指定字段分隔符为冒号 :

3.如何使用AWK获取上面文件第3列内容,并进行排序

/etc/passwd 的字段由冒号 : 分隔,第三列是 UID(用户标识符)。提取的 UID 可能包含重复值,且需要按 数值大小 排序。使用 awk 提取第三列并搭配使用 sort -n 实现的命令如下:

awk -F: '{print $3}' /etc/passwd | sort -n

说明:

  • -F::指定字段分隔符为冒号 :
  • {print $3}:打印每行的第三个字段(UID)。
  • |:将 awk 的输出传递给 sort
  • sort -n:按数值升序排序。

4.如何查看系统版本和内核版本

查看系统版本
  • 方法一:使用 lsb_release 命令

    命令:lsb_release -a

    说明:显示系统的完整版本信息(名称、版本号、代号等)

    示例输出:

    Distributor ID: Ubuntu
    Description:    Ubuntu 22.04.5 LTS
    Release:        22.04
    Codename:       jammy
    

    注意事项:

    如果未安装 lsb_release,可以通过包管理器安装:

    • Ubuntu/Debiansudo apt install lsb-core
    • RHEL/CentOSsudo yum install redhat-lsb-core
  • 方法二:查看 /etc/os-release 文件

    命令:cat /etc/os-release

    说明:显示系统的详细版本信息,包括名称、版本号、ID等

    示例输出:

    PRETTY_NAME="Ubuntu 22.04.5 LTS"
    NAME="Ubuntu"
    VERSION_ID="22.04"
    VERSION="22.04.5 LTS (Jammy Jellyfish)"
    VERSION_CODENAME=jammy
    ID=ubuntu
    ID_LIKE=debian
    HOME_URL="https://www.ubuntu.com/"
    SUPPORT_URL="https://help.ubuntu.com/"
    BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
    PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
    UBUNTU_CODENAME=jammy
    
  • 方法三:查看 /etc/issue 文件

    命令:cat /etc/issue

    说明:显示系统的简要版本信息(通常用于登录界面)

    示例输出:

    Ubuntu 22.04.5 LTS \n \l
    
  • 方法四:使用 hostnamectl 命令(仅限 systemd 系统)

    命令:hostnamectl

    说明:显示系统信息,包括操作系统版本和内核版本

    示例输出:

     Static hostname: longlijisi
           Icon name: computer-vm
             Chassis: vm
          Machine ID: 2b29fbad6f144648bac3add2497fad97
             Boot ID: 7ac5783e1d694c2285324c7f945f41ec
      Virtualization: vmware
    Operating System: Ubuntu 22.04.5 LTS              
              Kernel: Linux 5.15.0-143-generic
        Architecture: x86-64
     Hardware Vendor: VMware, Inc.
      Hardware Model: VMware Virtual Platform
    
查看内核版本
  • 方法一:使用 uname 命令

    命令:uname -r

    说明:显示当前运行的内核版本号

    示例输出:

    5.15.0-143-generic
    

    扩展命令uname -a

    说明:显示所有内核信息(包括架构、主机名、内核版本等)

    示例输出:

    Linux longlijisi 5.15.0-143-generic #153-Ubuntu SMP Fri Jun 13 19:10:45 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
    
  • 方法二:查看 /proc/version 文件

    命令:cat /proc/version

    说明:显示内核版本和编译信息

    示例输出:

    Linux version 5.15.0-143-generic (buildd@lcy02-amd64-115) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #153-Ubuntu SMP Fri Jun 13 19:10:45 UTC 2025
    
  • 方法三:使用 dmesg 命令

    命令:sudo dmesg | grep "Linux version"

    说明:从系统日志中提取内核版本信息。

    示例输出:

    [    0.000000] Linux version 5.15.0-143-generic (buildd@lcy02-amd64-115) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #153-Ubuntu SMP Fri Jun 13 19:10:45 UTC 2025 (Ubuntu 5.15.0-143.153-generic 5.15.180)
    

5.如何更改系统源为国内源

在更换系统源之前,建议先对原始配置文件进行备份,并查看和确认系统版本

  • 使用 sed 命令自动替换
    # 替换主源和安全更新源为阿里云镜像
    sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
    sudo sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
    
  • 更新软件包索引

    完成源文件修改后,更新APT缓存以使新源生效:

    sudo apt update
    
  • 升级已安装的软件包(可选)

    如果需要升级系统中已安装的软件包到最新版本:

    sudo apt upgrade
    

6.如果添加了错误的国内源,比如使用ubuntu22.04但是添加了ubuntu20.04的源,会发生什么

  • 可能出现的问题
    (1)APT 更新失败
    • 执行sudo apt update时会报错:

      E: The repository 'http://archive.ubuntu.com/focal Release' does not have a Release file.
      

      或者:

      E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/... 404 Not Found
      

      因为focal源的地址(如http://archive.ubuntu.com/ubuntu/dists/focal/)在 Ubuntu 22.04 中并不存在。

    (2)软件包版本冲突
    • 如果错误源被保留并尝试安装软件包,APT 会尝试从focal源拉取旧版本的软件包,导致:
      • 软件包版本过低,与系统现有组件不兼容。
      • 依赖关系无法满足(例如,libssl1.1focal 中是 1.1.1,而 jammy 中是 3.0)。
    (3)系统不稳定
    • 安装的软件包可能与系统内核、库或其他服务不兼容,导致:
      • 系统崩溃或服务无法启动。
      • 安全漏洞未修复(因为 focal 的源可能已停止更新)。
    (4)无法升级系统
    • 执行 sudo apt upgradesudo do-release-upgrade 时会失败,因为系统无法找到正确的升级路径。
  • 预防措施
    • 修改源之前,要先确认系统版本。
    • 确认对应的版本后,要对原始配置文件进行备份
    • 配置国内镜像源,用命令进行替换。
    • 最后验证镜像源地址是否有误。
  • 补救措施

    如果已安装了来自 focal 源的软件包,需手动修复:

    • 清理缓存

      sudo apt clean
      
    • 修复依赖关系

      sudo apt --fix-broken install
      
    • 强制升级系统

      sudo apt full-upgrade
      
    • 删除错误源

      如果仍有残留错误源,编辑 /etc/apt/sources.list.d/ 中的文件,删除或修正 focal 相关条目。

7.如何更新系统中的软件包,apt update和apt upgrade有什么区别

  • apt updateapt upgrade 的区别
    命令功能特点
    apt update更新本地软件包列表(从配置的源获取最新的软件包信息)。- 不实际安装或升级任何软件包。
    - 仅刷新软件包版本信息。
    apt upgrade根据更新后的软件包列表,升级所有已安装的软件包到最新版本。- 实际下载并安装新版本的软件包。
    - 不会移除或安装额外的软件包(除非依赖关系要求)。
  • 更新系统软件包的完整步骤
    • 步骤 1:更新软件包列表

      sudo apt update
      
      • 作用:从 /etc/apt/sources.list/etc/apt/sources.list.d/ 中的源获取最新的软件包元数据(版本号、依赖关系等)。
    • 步骤2:升级已安装的软件包

      sudo apt upgrade
      
      • 作用:根据 apt update 获取的最新信息,升级所有可以升级的软件包。
    • 步骤3(可选):处理复杂依赖关系

      如果某些软件包升级需要移除旧版本或安装新依赖,使用:

      sudo apt full-upgrade
      
      • 作用:升级所有软件包,并智能处理依赖关系(可能删除或安装额外软件包)。
    • 步骤 4(可选):清理无用软件包

      升级完成后,清理不再需要的依赖项:

      sudo apt autoremove
      sudo apt autoclean
      

8.如何使用apt安装nginx

  • 步骤 1:更新系统软件包列表
    sudo apt update
    
  • 步骤 2:安装 Nginx
    sudo apt install nginx
    
  • 步骤 3:检查 Nginx 服务状态

    安装完成后,Nginx 会自动启动。检查服务状态以确认是否运行正常:

    sudo systemctl status nginx
    

9.Nginx默认使用的端口号是多少,安装后如何访问

Nginx 默认使用的端口号
  • HTTP 默认端口80
  • HTTPS 默认端口443(需配置 SSL/TLS 证书)
安装后访问 Nginx步骤
  • 本地访问(开发环境)
    • 直接访问

      • 打开浏览器,输入以下任意一种方式:

        http://localhost
        http://127.0.0.1
        
      • 如果 Nginx 配置了 HTTPS(默认443端口),输入:

        https://localhost
        https://127.0.0.1
        
    • 自定义端口访问

      • 如果修改了默认端口(例如8080),在浏览器中输入:

        http://localhost:8080
        
  • 远程服务器访问
    • 通过服务器 IP 地址访问

      • 获取服务器公网 IP(例如192.168.163.139),在浏览器中输入:

        http://192.168.163.139
        
      • 如果配置了 HTTPS:

        https://192.168.163.139
        
    • 通过域名访问

      • 如果域名已解析到服务器 IP(例如example.com),输入:

        http://example.com
        https://example.com
        
  • 验证 Nginx 是否运行
    • 检查服务状态

      sudo systemctl status nginx
      
      • 如果显示 active (running),说明服务正常运行。
    • 测试本地访问

      curl http://localhost
      
      • 正确输出应包含 Welcome to nginx!

10.apt安装的Nginx默认配置目录是什么

Nginx主配置目录/etc/nginx/文件夹中,

主配置文件路径为/etc/nginx/nginx.conf

  • 可以通过sudo nginx -t命令验证nginx配置文件路径

    输出为:
    
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
  • 还可以通过sudo nginx -c 路径名 指定nginx配置文件的路径。

11.如何查看当前机器监听了哪些端口号

  • 使用 netstat 命令

    netstat 是一个传统的网络工具,用于显示网络连接、路由表和接口统计信息。

    sudo netstat -ntlp
    
    • 参数说明:
      • -n:不解析主机名、服务名或用户ID,直接显示数字形式的 IP 地址和端口号(如 0.0.0.0:80 而非 *:http
      • -t:仅显示 TCP 协议 的连接和监听端口。
      • -l:仅显示处于 监听状态 (LISTEN) 的连接(即等待客户端连接的服务)。
      • -p:显示与每个连接相关的 进程 ID (PID) 和程序名称(如 nginxsshd)。
  • 使用 ss 命令(推荐)

    ssnetstat 的现代替代工具,性能更好且输出更简洁。

    sudo ss -tuln
    
    • 参数说明:
      • -t:TCP 端口。
      • -u:UDP 端口。
      • -l:仅显示监听状态的端口。
      • -n:不解析服务名和主机名。
  • 使用 lsof 命令

    lsof 可以列出所有打开的文件和网络连接,适合查看具体进程占用的端口。

    sudo lsof -i -P -n | grep LISTEN
    
    • 参数说明:
      • -i:显示网络连接。
      • -P:不将端口号转换为服务名。
      • -n:不解析 IP 地址为主机名。

12.什么是回环地址,为什么要有回环地址

回环地址(Loopback Address) 是一种特殊的 IP 地址,用于将网络请求从本地主机发送到自身,而不经过物理网络接口。它主要用于 本地测试网络诊断,确保数据包不会离开设备,而是直接由操作系统内部处理。

  • IPv4 的回环地址
    • 最常用地址127.0.0.1

    • 完整地址范围127.0.0.0/8(即所有以 127. 开头的地址,如 127.1.2.3)。

    • IPv6 的回环地址::1(零压缩形式)。

  • IPv6 的回环地址
    • 地址::1(全称为 0:0:0:0:0:0:0:1)。

    • 用途:与 IPv4 的 127.0.0.1 类似,用于本地测试。

  • 回环地址的存在是为了满足以下几个关键需求:
    本地网络协议测试
    • 验证协议栈功能:通过 ping 127.0.0.1ping ::1,可以快速检查本机的 TCP/IP 协议栈是否正常工作。
    • 无需物理网络:即使未安装网卡或未连接网络,也可以测试本地网络功能。
    本地服务调试
    • 开发和测试环境:开发者常使用回环地址运行本地服务(如 Web 服务器、数据库),并通过 http://127.0.0.1:端口 访问,避免依赖外部网络。
    • 隔离测试:确保某些服务仅在本地运行,不暴露给外部网络,提高安全性。
    网络配置排查
    • 区分本地和外部问题:如果服务无法访问,可以通过回环地址判断问题是出在本地协议栈还是外部网络。
    • 检查防火墙规则:确认防火墙是否阻止了本地服务的端口。
    路由器和网络设备的管理
    • 稳定标识设备:路由器等网络设备通常配置 loopback 接口(逻辑接口),其地址作为设备的唯一标识(如 192.168.1.1),即使物理接口故障,也能通过 loopback 接口管理设备。
    • 动态路由协议:OSPF、BGP 等协议使用 loopback 接口的地址作为 Router ID,确保路由信息的稳定性。
    安全防护
    • 防御攻击:在遭受 DDoS 攻击时,可以将被攻击的域名解析到 127.0.0.1,迫使攻击者攻击自己,从而缓解压力。
    • 限制访问:某些服务(如数据库)默认仅监听 127.0.0.1,防止外部未授权访问。

13.如何判断端口号是绑定到某个具体地址,还是所有地址

  • 使用 netstatss 命令

    这两个工具可以显示网络连接和监听端口的信息,包括绑定的地址和端口号。

    命令:

    sudo netstat -tulnp | grep <端口号>
    

    sudo ss -tulnp | grep <端口号>
    

    参数说明:

    • -t:显示 TCP 连接。
    • -u:显示 UDP 连接。
    • -l:仅显示监听状态的连接。
    • -n:以数字形式显示地址和端口(不解析为服务名)。
    • -p:显示进程信息(需要管理员权限)。
  • 实际场景示例
    场景 1:Web 服务监听所有地址
    $ sudo netstat -tulnp | grep 80
    tcp  0  0 0.0.0.0:80  0.0.0.0:*  LISTEN  1234/nginx
    tcp6  0  0 [::]:80  [::]:*  LISTEN  1234/nginx
    
    • 服务同时监听所有 IPv4 和 IPv6 地址的 80 端口。
    • 外部网络可以通过任意 IP 地址访问该服务。
    场景 2:Web 服务仅监听本地回环地址
    $ sudo netstat -tulnp | grep 80
    tcp  0  0 127.0.0.1:80  0.0.0.0:*  LISTEN  1234/nginx
    
    • 服务仅监听本地回环地址的 80 端口。
    • 外部网络无法访问该服务,只能通过 localhost127.0.0.1 访问。
    场景 3:Web 服务仅监听特定 IP
    $ sudo netstat -tulnp | grep 80
    tcp  0  0 192.168.1.100:80  0.0.0.0:*  LISTEN  1234/nginx
    
    • 服务仅监听 192.168.1.100 的 80 端口。
    • 外部网络只能通过 192.168.1.100 访问该服务。

14.如何通过终端软件将本地文件上传到Linux中,又如何下载文件到本地

  • 方法 1:使用 rzsz 命令(推荐用于支持 Zmodem 协议的终端,如windterm、xshell)
    • 首先安装 lrzsz
      • Debian/Ubuntu:

        sudo apt install lrzsz
        
      • CentOS/RHEL:

        sudo yum install lrzsz
        
    • 上传文件到Linux服务器
      • 在终端中运行rz命令,会弹出文件选择窗口,选择本地文件并确认上传。
    • 从Linux服务器下载文件到本地
      • 在终端中运行lz 文件名,会弹出保存文件的对话框,选择本地保存路径。
  • 方法2:使用scp命令(基于SSH的安全拷贝)
    • 上传本地文件到Linux服务器
      scp 本地文件路径 用户名@远程服务器IP:远程路径
      
      # 示例:
      scp file.txt longlijisi@192.168.163.139:/home/user/
      
      # 如果远程服务器的 SSH 端口不是默认的 22(例如 2222):
      scp -P 2222 file.txt longlijisi@192.168.163.139:/home/user/
      
      -P : 指定SSH端口号
      
    • 从Linux服务器下载文件到本地
      scp 用户名@远程服务器IP:远程文件路径 本地路径
      
      # 示例:
      scp user@192.168.163.139:/home/user/file.txt .
      
      # 如果远程服务器的 SSH 端口是非默认端口:
      scp -P 2222 longlijisi@192.168.163.139:/home/user/file.txt .
      
      -P : 指定SSH端口号
      
  • 方法3:使用rsync命令(适合大文件或断点续传)
    • 首先安装rsync
      • Debian/Ubuntu:

        sudo apt update && sudo apt install rsync
        
      • CentOS/RHEL:

        sudo yum install rsync
        
    • 上传文件到Linux服务器
      rsync -avzP 本地文件路径 用户名@服务器IP:远程路径
      
      # 示例:
      rsync -avzP file.txt longlijisi@192.168.163.139:/home/user/
      
    • 下载文件到本地
      rsync -avzP 用户名@服务器IP:远程文件路径 本地路径
      
      # 示例:
      rsync -avzP longlijisi@192.168.163.139:/home/user/file.txt .
      

      参数说明

      • -a:归档模式(保留文件属性)。
      • -v:显示详细信息。
      • -z:传输时压缩数据。
      • -P:支持断点续传。
  • 方法4:使用sftp命令(交互式文件传输)
    • 首先连接到需传输的Linux服务器
      sftp 用户名@服务器IP
      
      # 示例:
      sftp longlijisi@192.168.1.100
      
    • 上传文件
      • sftp> 提示符下使用 put 命令:

        put 本地文件路径
        
        # 示例,上传file.txt到服务器当前目录:
        put file.txt
        
    • 下载文件
      • 使用get命令

        get 远程文件路径
        
        # 示例:
        get /home/user/file.txt
        
    • 常用sftp命令
      命令说明
      ls查看远程服务器目录内容
      lls查看本地目录内容
      cd切换远程服务器目录
      lcd切换本地目录
      bye/exit退出 sftp 会话
  • 方法 5:使用 wgetcurl(适用于从 HTTP/FTP 下载文件)
    • 从远程服务器下载文件到本地
      • wget 示例:

        wget http://example.com/file.zip
        
      • curl 示例:

        curl -O http://example.com/file.zip
        
    • 上传文件到远程服务器(需支持 HTTP/FTP 服务

      • 通常不推荐使用 wget/curl 上传文件,建议使用 scpsftp

15.如何完全复制一个目录到指定路径

  • 方法1:使用cp命令(基础方法)

    如果目标路径不存在,cp 会自动创建目标目录。

    cp -r <源目录路径> <目标路径>
    
    • 复制整个目录,包含子目录和文件到目标路径
      # 示例:
      cp -r /path/to/source_directory /path/to/destination/
      
      # 参数说明:
      -r:递归复制,会保留目录结构和子目录
      
    • 直接复制目录内容到目标路径,但不创建子目录
      cp -r <源文件路径>* <目标路径>
      
      # 示例:
      cp -r /path/to/source_directory/* /path/to/destination/
      

      这会将 source_directory 下的所有内容复制到 destination 目录中,而不是在 destination 下创建同名子目录。

  • 方法2:使用rsync命令(推荐)
    rsync -av <源目录路径> <目标路径>
    
    • 复制整个目录到目标路径
      rsync -av /path/to/source_directory/ /path/to/destination/
      

      参数说明:

      • -a:归档模式(递归复制并保留所有属性,如权限、时间戳等)。
      • -v:显示详细进度。

      注意源路径末尾的斜杠:

      • 如果源路径末尾有 /(如 /source_directory/),rsync 会复制目录内容(不包含目录本身)。
      • 如果没有斜杠(如 /source_directory),rsync 会在目标路径下创建同名子目录(如 /destination/source_directory/)。
  • 方法3:使用tar命令(打包后解压)
    • 先将源目录打包为.tar文件:

      # 示例:
      tar -cvf archive.tar /path/to/source_directory/
      
      -c:创建新归档。
      -v:显示进度。
      -f:指定归档文件名。
      
    • 然后将.tar文件复制到目标路径:

      cp archive.tar /path/to/destination/
      
    • 在目标路径解压.tar文件即可:

      tar -xvf archive.tar -C /path/to/destination/
      
      -x:解压文件。
      -C:指定解压目录。
      

16./opt目录有什么作用

在 Linux 系统中,/opt 目录是一个标准文件系统层级结构(FHS)中定义的目录,主要用于存放可选的第三方软件包用户自定义的大型应用程序。它的设计目标是将非系统核心的软件与系统自带的软件分离,便于管理、维护和避免冲突。

  • 主要用于安装和存放第三方软件、非标准软件,用于区分系统自带软件,避免文件冲突或覆盖。
  • 每个软件在/opt下都有独立的子目录,便于统一管理、升级或卸载。
  • 适合部署需要独立环境或特定版本的应用程序。

17.如何使用一条命令创建多级目录

可以使用mkdir -p的命令选项

mkdir -p <目录路径>
  • 创建多级目录
    mkdir -p a/b/c/d
    
    # 一次性创建嵌套目录结构 a/b/c/d。如果 a、b、c 不存在,会自动创建。
    
  • 创建绝对路径的多级目录
    mkdir -p /opt/project/logs/backend
    
  • 批量创建多个多级目录
    mkdir -p dir1/subdir1 dir2/subdir2 dir3/subdir3
    
    # 可以同时创建三个独立的多级目录结构
    

18.什么是软链接什么是硬链接,区别是什么

  • 硬链接(Hard Link)

    硬链接是文件系统的**索引节点(inode)**的别名,多个文件名共享同一个inode和数据块。

    • 所有硬链接指向同一个inode。
    • 删除任意一个硬链接,只要还有一个硬链接存在的话,文件数据仍然可用。
    • 但它不能跨文件系统,inode是文件系统特有的。
    • 不可以对目录创建硬链接,避免文件系统的循环引用。
  • 软链接**(Symbolic Link)**

    软链接本质上是一个独立的文件,其内容是目标文件的路径名,类似于Windows的快捷方式。

    • 软链接有独立的inode,仅存储目标路径
    • 可以跨文件系统,甚至可以指向网络路径。
    • 可以对文件或者目录创建软链接。
    • 如果目标文件或目录被删除,软链接会实现,变成悬空链接。
  • 区别对比
    特性硬链接(Hard Link)软链接(Symbolic Link)
    inode 编号与源文件相同(共享同一个 inode)独立的 inode
    跨文件系统❌ 不支持(只能在同一文件系统内)✅ 支持(可以跨文件系统或分区)
    目录支持❌ 不支持(不能对目录创建硬链接)✅ 支持(可以对目录创建软链接)
    删除源文件后的效果✅ 数据仍然可用(只要硬链接存在)❌ 软链接失效(指向不存在的目标)
    文件权限一致性✅ 与源文件一致❌ 可能不同(软链接权限独立于目标文件)
    存储开销无额外存储(仅增加目录项)需要额外存储(保存路径字符串)
  • 工作机制场景对比
    • 硬链接
      • 文件系统通过 inode 管理数据块。每个文件名对应一个 inode,而 inode 记录了文件的元数据(如权限、大小、数据块位置)。

      • 硬链接是多个文件名共享同一个 inode 的多个目录项。例如:

        touch file1.txt        # 创建文件,inode 为 12345
        ln file1.txt hardlink  # 创建硬链接,hardlink 也指向 inode 12345
        
        • 删除 file1.txt 后,hardlink 仍然有效,因为数据块未被释放。
        • 只有当所有硬链接都被删除时,文件数据才会被真正释放。
    • 软链接
      • 软链接是一个 独立的文件,其内容是目标文件的路径。例如:

        ln -s file1.txt symlink  # 创建软链接,symlink 内容是 "file1.txt"
        
        • 访问 symlink 时,系统会读取其内容并跳转到 file1.txt
        • 如果 file1.txt 被删除或移动,symlink 会失效。
  • 命令创建
    • 硬链接

      ln source_file hardlink_name
      
      # 示例:
      ln file1.txt hardlink_to_file1.txt
      
    • 软链接

      ln -s target_file symlink_name
      
      # 示例:
      ln -s /path/to/file1.txt symlink_to_file1.txt
      

19.什么场景下使用软链接,什么场景下使用硬链接

  • 硬链接
    • 需要确保文件即使被误删也能保留(例如备份重要文件)。
    • 同一文件系统内需要多个文件名指向同一数据。
    • 不推荐用于目录(可能导致文件系统问题)。
  • 软链接
    • 需要跨文件系统或分区链接文件或目录。
    • 需要为目录创建快捷方式(例如将深层目录链接到更易访问的位置)。
    • 需要动态调整路径(例如版本管理、符号链接到动态库)。

20.创建一个软链接/opt/nginx,让其链接到nginx的配置目录

  • 首先,确认Nginx配置目录的路径

    可以通过一下命令进行查找:

    find / -name nginx.conf
    # 或者
    whereis nginx
    
  • 使用ln -s命令创建软链接
    sudo ln -s /etc/nginx /opt/nginx
    
    # 参数说明
    -s:表示创建软链接(符号链接)。
    /etc/nginx:目标目录(Nginx 配置目录)。
    /opt/nginx:软链接的路径。
    
  • 验证软链接是否创建成功
    ls -l /opt/nginx
    
    # 输出应类似:
    lrwxrwxrwx 1 root root 10 Jul  9 08:58 /opt/nginx -> /etc/nginx
    
    # 验证软链接是否正常工作:
    cat /opt/nginx/nginx.conf
    

    如果输出 Nginx 配置文件内容,则说明软链接有效。

21.如何判断一个文件是链接文件还是普通文件

  • ls -l 文件名或者ls -l命令查看当前文件夹的文件
    • 普通文件的第一个字符为**-**
    • 软链接文件的第一个字符**l,且会显示目标路径**。
  • file 文件名命令
    • file命令会直接说明文件类型

      • 普通文件:

        example.txt: ASCII text
        
      • 软链接:

        symlink: symbolic link to /etc/nginx
        
  • readlink 文件名命令
    • readlink专门用于读取软链接的目标路径
      • 如果是软链接,会输出目标路径
      • 如果是普通文件,则无输出或者报错
  • stat 文件名命令
    • 如果是普通文件File显示为文件名且无指向文件路径
    • 如果是软链接File显示为文件名并指向链接的目标路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值