The Logic Layer

Linux教程

1. Linux基础

1.1 Linux简介

Linux是一种自由和开放源代码的类Unix操作系统,它是由Linus Torvalds于1991年首次发布的。Linux内核是Linux操作系统的核心,它负责管理硬件资源、提供系统服务和支持应用程序运行。

1.2 Linux的特点

1.3 Linux发行版

Linux发行版是基于Linux内核的完整操作系统,它包含了Linux内核、系统工具、应用程序和文档等。常见的Linux发行版包括:

1.4 Linux系统的组成

2. 命令行基础

2.1 Shell简介

Shell是Linux系统的命令行解释器,它是用户与Linux内核之间的接口。常见的Shell包括:

2.2 基本命令

2.2.1 文件和目录操作命令

# 查看当前目录
pwd

# 列出目录内容
ls
ls -l      # 详细列出
ls -la     # 列出所有文件(包括隐藏文件)
ls -h      # 人类可读的格式

# 切换目录
cd /path/to/directory
cd ~       # 切换到主目录
cd ..      # 切换到上级目录

# 创建目录
mkdir directory_name
mkdir -p parent_directory/child_directory  # 创建嵌套目录

# 创建文件
touch file_name

# 复制文件或目录
cp source_file destination_file
cp -r source_directory destination_directory  # 复制目录

# 移动文件或目录
mv source destination

# 删除文件
rm file_name
rm -f file_name  # 强制删除

# 删除目录
rmdir directory_name  # 删除空目录
rm -r directory_name  # 删除非空目录
rm -rf directory_name  # 强制删除非空目录

# 查看文件内容
cat file_name  # 显示整个文件
less file_name  # 分页显示文件
more file_name  # 分页显示文件
tail file_name  # 显示文件末尾
tail -f file_name  # 实时显示文件末尾
head file_name  # 显示文件开头

2.2.2 系统信息命令

# 查看系统信息
uname -a  # 显示所有系统信息
uname -r  # 显示内核版本

# 查看CPU信息
cat /proc/cpuinfo

# 查看内存信息
cat /proc/meminfo
free -h  # 人类可读的格式

# 查看磁盘信息
df -h  # 人类可读的格式

# 查看系统负载
uptime

# 查看登录用户
who
w

# 查看当前用户
whoami

2.2.3 网络命令

# 查看网络接口
ifconfig
ip addr

# 测试网络连接
ping hostname or ip_address

# 查看路由表
route -n
ip route

# 查看网络连接
netstat -tuln
ss -tuln

# 下载文件
wget url
curl -O url

# 远程登录
ssh username@hostname or ip_address

2.3 命令行技巧

3. 文件系统

3.1 Linux文件系统结构

Linux文件系统采用树形结构,从根目录(/)开始,向下延伸出各个子目录。常见的目录包括:

/           # 根目录
├── bin     # 基本命令二进制文件
├── boot    # 引导加载程序和内核文件
├── dev     # 设备文件
├── etc     # 系统配置文件
├── home    # 用户主目录
├── lib     # 共享库文件
├── media   # 可移动介质挂载点
├── mnt     # 临时挂载点
├── opt     # 可选软件包
├── proc    # 进程信息和系统状态
├── root    # 根用户主目录
├── run     # 运行时数据
├── sbin    # 系统管理命令二进制文件
├── srv     # 服务数据
├── sys     # 系统硬件信息
├── tmp     # 临时文件
├── usr     # 用户程序和数据
└── var     # 可变数据(日志、缓存等)

3.2 文件类型

3.3 文件权限

Linux文件系统使用权限来控制对文件和目录的访问。权限分为三类:所有者权限、组权限和其他用户权限。每种权限包括读(r)、写(w)和执行(x)权限。

# 查看文件权限
ls -l file_name

# 权限表示示例
-rw-r--r--  # 所有者有读写权限,组和其他用户有读权限
drwxr-xr-x  # 目录,所有者有读写执行权限,组和其他用户有读执行权限

# 修改文件权限
chmod permissions file_name

# 权限数字表示
# r=4, w=2, x=1
chmod 755 file_name  # 所有者有读写执行权限,组和其他用户有读执行权限
chmod 644 file_name  # 所有者有读写权限,组和其他用户有读权限

# 修改文件所有者
chown owner:group file_name

# 修改文件所属组
chgrp group file_name

3.4 链接文件

Linux支持两种类型的链接文件:硬链接和符号链接(软链接)。

# 创建硬链接
ln source_file hard_link

# 创建符号链接
ln -s source_file soft_link

# 硬链接与符号链接的区别:
# 1. 硬链接指向文件的inode,符号链接指向文件的路径
# 2. 硬链接不能跨文件系统,符号链接可以跨文件系统
# 3. 硬链接不能指向目录,符号链接可以指向目录
# 4. 删除源文件后,硬链接仍然有效,符号链接失效

4. 用户和权限管理

4.1 用户管理

# 添加用户
useradd username
useradd -m username  # 创建用户时同时创建主目录
useradd -s /bin/bash username  # 指定用户的默认Shell

# 设置用户密码
passwd username

# 修改用户信息
usermod -l new_username old_username  # 修改用户名
usermod -d /new/home/directory username  # 修改用户主目录
usermod -s /new/shell username  # 修改用户默认Shell
usermod -aG groupname username  # 将用户添加到组

# 删除用户
userdel username
userdel -r username  # 删除用户时同时删除主目录

# 查看用户信息
id username
finger username

4.2 组管理

# 添加组
groupadd groupname

# 修改组信息
groupmod -n new_groupname old_groupname  # 修改组名

# 删除组
groupdel groupname

# 查看组信息
groups username  # 查看用户所属的组
cat /etc/group  # 查看所有组

4.3 权限管理

Linux系统使用权限来控制对文件和目录的访问。权限分为三类:所有者权限、组权限和其他用户权限。每种权限包括读(r)、写(w)和执行(x)权限。

4.3.1 文件权限

# 查看文件权限
ls -l file_name

# 修改文件权限
chmod permissions file_name

# 权限数字表示
# r=4, w=2, x=1
chmod 755 file_name  # 所有者有读写执行权限,组和其他用户有读执行权限
chmod 644 file_name  # 所有者有读写权限,组和其他用户有读权限

# 使用符号表示修改权限
chmod u+x file_name  # 给所有者添加执行权限
chmod g-w file_name  # 移除组的写权限
chmod o=r file_name  # 给其他用户设置读权限
chmod a+x file_name  # 给所有用户添加执行权限

4.3.2 目录权限

# 查看目录权限
ls -ld directory_name

# 修改目录权限
chmod permissions directory_name

# 目录权限说明:
# r:可以列出目录内容
# w:可以在目录中创建、删除和重命名文件
# x:可以进入目录

# 递归修改权限
chmod -R permissions directory_name

4.3.3 SUID、SGID和Sticky位

# SUID(Set User ID):执行文件时,以文件所有者的身份执行
chmod u+s file_name

# SGID(Set Group ID):执行文件时,以文件所属组的身份执行;对于目录,新创建的文件继承目录的组
chmod g+s file_name or directory_name

# Sticky位:对于目录,只有文件所有者和root可以删除文件
chmod +t directory_name

# 查看特殊权限
ls -l file_name
# SUID:所有者权限的x位变为s
# SGID:组权限的x位变为s
# Sticky位:其他用户权限的x位变为t

5. 进程管理

5.1 进程概述

进程是正在运行的程序的实例。每个进程都有一个唯一的进程ID(PID)。Linux系统使用进程来执行各种任务。

5.2 进程管理命令

# 查看进程
ps  # 查看当前终端的进程
ps aux  # 查看所有进程
ps -ef  # 查看所有进程,显示父进程ID

# 查看进程树
pstree

# 实时查看进程
top
top -u username  # 查看指定用户的进程
htop  # 交互式的进程查看工具

# 终止进程
kill PID  # 发送SIGTERM信号
kill -9 PID  # 发送SIGKILL信号,强制终止进程
killall process_name  # 终止所有同名进程
pkill process_name  # 终止匹配名称的进程

# 挂起和恢复进程
Ctrl+Z  # 挂起当前进程
fg  # 恢复前台进程
bg  # 恢复后台进程
jobs  # 查看后台进程

# 后台运行进程
command &
nohup command &  # 忽略挂断信号,进程在终端关闭后继续运行

5.3 进程优先级

Linux系统使用优先级来决定进程的调度顺序。优先级范围为-20(最高)到19(最低),默认优先级为0。

# 查看进程优先级
top  # 查看NI列
ps -l  # 查看PRI和NI列

# 修改进程优先级
nice -n priority command  # 以指定优先级启动进程
renice priority PID  # 修改正在运行的进程的优先级

6. 系统管理

6.1 系统服务管理

# 使用systemctl管理服务(systemd系统)
systemctl status service_name  # 查看服务状态
systemctl start service_name  # 启动服务
systemctl stop service_name  # 停止服务
systemctl restart service_name  # 重启服务
systemctl enable service_name  # 启用服务(开机自启)
systemctl disable service_name  # 禁用服务(开机不自启)
systemctl list-units --type=service  # 查看所有服务
systemctl list-enabled  # 查看已启用的服务

# 使用service管理服务(SysV init系统)
service service_name status
service service_name start
service service_name stop
service service_name restart

6.2 系统日志管理

Linux系统使用日志来记录系统事件和错误信息。常见的日志文件包括:

/var/log/messages  # 系统消息日志
/var/log/auth.log  # 认证日志
/var/log/secure  # 安全日志
/var/log/boot.log  # 启动日志
/var/log/cron  # 定时任务日志
/var/log/maillog  # 邮件日志
/var/log/httpd  # Apache日志
/var/log/mysql  # MySQL日志

# 查看日志文件
cat /var/log/messages
tail -f /var/log/messages  # 实时查看日志

# 使用journalctl查看systemd日志
journalctl
journalctl -u service_name  # 查看指定服务的日志
journalctl --since "1 hour ago"  # 查看最近1小时的日志
journalctl --tail 100  # 查看最近100条日志

6.3 系统备份和恢复

# 使用tar命令备份文件和目录
tar -cvf backup.tar /path/to/directory  # 创建备份
tar -cvzf backup.tar.gz /path/to/directory  # 创建压缩备份
tar -xvf backup.tar  # 恢复备份
tar -xvzf backup.tar.gz  # 恢复压缩备份

# 使用dd命令备份磁盘和分区
dd if=/dev/sda of=/dev/sdb bs=4M  # 备份整个磁盘
dd if=/dev/sda1 of=partition.img bs=4M  # 备份分区
dd if=partition.img of=/dev/sda1 bs=4M  # 恢复分区

# 使用rsync命令同步文件和目录
rsync -av /source/directory /destination/directory  # 同步目录
rsync -av -e ssh /source/directory user@remote_host:/destination/directory  # 远程同步

6.4 系统性能监控

# 查看CPU使用情况
top
mpstat
vmstat

# 查看内存使用情况
free -h
vmstat

# 查看磁盘使用情况
df -h
iostat

# 查看网络使用情况
netstat -tuln
ss -tuln
iptraf
iftop

# 查看系统负载
uptime
w

# 使用sar命令收集系统性能数据
sar -u 1 10  # 每1秒收集一次CPU使用情况,共收集10次
sar -r 1 10  # 每1秒收集一次内存使用情况,共收集10次
sar -n DEV 1 10  # 每1秒收集一次网络使用情况,共收集10次

7. 软件包管理

7.1 Debian/Ubuntu系统的软件包管理

# 更新软件包列表
apt update

# 升级软件包
apt upgrade
apt full-upgrade

# 安装软件包
apt install package_name
apt install package1 package2  # 安装多个软件包

# 卸载软件包
apt remove package_name
apt purge package_name  # 卸载软件包并删除配置文件

# 搜索软件包
apt search package_name

# 查看软件包信息
apt show package_name

# 清理缓存
apt clean
apt autoclean

# 自动移除不需要的依赖
apt autoremove

7.2 CentOS/RHEL系统的软件包管理

# 更新软件包
yum update
dnf update  # CentOS 8+使用dnf

# 安装软件包
yum install package_name
dnf install package_name  # CentOS 8+使用dnf

# 卸载软件包
yum remove package_name
dnf remove package_name  # CentOS 8+使用dnf

# 搜索软件包
yum search package_name
dnf search package_name  # CentOS 8+使用dnf

# 查看软件包信息
yum info package_name
dnf info package_name  # CentOS 8+使用dnf

# 清理缓存
yum clean all
dnf clean all  # CentOS 8+使用dnf

# 列出已安装的软件包
yum list installed
dnf list installed  # CentOS 8+使用dnf

7.3 从源码编译安装软件

# 下载源码包
wget https://example.com/package-version.tar.gz

# 解压源码包
tar -xvzf package-version.tar.gz

# 进入源码目录
cd package-version

# 配置
./configure
./configure --prefix=/usr/local/package  # 指定安装目录

# 编译
make

# 安装
make install

# 卸载
make uninstall

8. 网络配置

8.1 网络接口配置

# 查看网络接口信息
ifconfig
ip addr

# 启用/禁用网络接口
ifup interface_name
ifdown interface_name
ip link set interface_name up
ip link set interface_name down

# 配置网络接口(临时)
ip addr add ip_address/netmask dev interface_name
ip route add default via gateway_ip

# 配置网络接口(永久)
# Debian/Ubuntu系统
/etc/network/interfaces

# CentOS/RHEL系统
/etc/sysconfig/network-scripts/ifcfg-interface_name

# systemd网络配置
/etc/systemd/network/

8.2 DNS配置

# 配置DNS服务器
/etc/resolv.conf

# 添加DNS服务器
nameserver 8.8.8.8
nameserver 8.8.4.4

# 测试DNS解析
nslookup example.com
dig example.com
host example.com

8.3 防火墙配置

# 使用iptables配置防火墙
# 查看规则
iptables -L
iptables -L -n

# 添加规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # 允许SSH连接
iptables -A INPUT -p tcp --dport 80 -j ACCEPT  # 允许HTTP连接
iptables -A INPUT -j DROP  # 拒绝所有其他入站连接

# 保存规则
# Debian/Ubuntu系统
iptables-save > /etc/iptables/rules.v4

# CentOS/RHEL系统
iptables-save > /etc/sysconfig/iptables

# 使用firewalld配置防火墙(CentOS 7+)
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --reload