活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

探索Arch Linux ARM版本在树莓派物联网项目中的实际应用案例与部署技巧

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-29 09:50:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. Arch Linux ARM简介

Arch Linux ARM是Arch Linux的ARM架构移植版本,专为嵌入式设备如树莓派设计。它继承了Arch Linux的核心特点:简洁、轻量、高度可定制和滚动更新模式。与其他树莓派操作系统相比,Arch Linux ARM提供了更接近原始Linux的体验,没有预装大量不必要的软件,使得系统资源占用更小,运行效率更高。

Arch Linux ARM的主要优势包括:

• 轻量级:最小化安装,仅包含必要的系统组件
• 滚动更新:持续获取最新软件包和安全补丁
• 高度可定制:用户可以根据需要构建自己的系统
• 强大的包管理:使用pacman包管理器,简单高效
• 活跃的社区支持:丰富的文档和社区资源

对于物联网项目而言,Arch Linux ARM的这些特点使其成为一个理想的选择。物联网设备通常资源有限,需要高效运行,同时要求系统稳定且易于维护。Arch Linux ARM的轻量级特性和滚动更新模式正好满足了这些需求。

2. Arch Linux ARM在树莓派上的安装与配置

2.1 硬件准备

在开始安装之前,确保你具备以下硬件:

• 树莓派(推荐使用树莓派3B+或更高版本以获得更好的性能)
• 至少8GB的MicroSD卡(推荐16GB或更大)
• 稳定的电源供应
• 网络连接(以太网或Wi-Fi)
• 用于初始配置的显示器、键盘和鼠标(可选,可通过SSH进行无头配置)

2.2 下载和刷写Arch Linux ARM镜像

首先,从Arch Linux ARM官方网站下载适合你的树莓派版本的镜像。以树莓派4为例:
  1. # 下载Arch Linux ARM镜像
  2. wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz
  3. # 验证下载的镜像
  4. sha1sum ArchLinuxARM-rpi-aarch64-latest.tar.gz
复制代码

接下来,准备MicroSD卡并刷写镜像:
  1. # 确定MicroSD卡设备名称(例如/dev/sdb或/dev/mmcblk0)
  2. lsblk
  3. # 卸载所有分区
  4. sudo umount /dev/sdb*
  5. # 创建分区表
  6. sudo fdisk /dev/sdb <<EOF
  7. o
  8. p
  9. n
  10. p
  11. 1
  12. +100M
  13. t
  14. c
  15. n
  16. p
  17. 2
  18. w
  19. EOF
  20. # 格式化分区
  21. sudo mkfs.vfat /dev/sdb1
  22. sudo mkfs.ext4 /dev/sdb2
  23. # 挂载分区
  24. sudo mkdir -p /mnt/root
  25. sudo mount /dev/sdb2 /mnt/root
  26. sudo mkdir -p /mnt/root/boot
  27. sudo mount /dev/sdb1 /mnt/root/boot
  28. # 解压并安装系统
  29. bsdtar -xpf ArchLinuxARM-rpi-aarch64-latest.tar.gz -C /mnt/root
  30. sync
  31. # 卸载分区
  32. sudo umount /mnt/root/boot /mnt/root
复制代码

2.3 初始配置

将MicroSD卡插入树莓派并启动。首次启动时,建议通过HDMI连接显示器和键盘进行初始配置。

登录系统,默认用户名为”alarm”,密码为”alarm”。还有root用户,密码为”root”。

首先,更新系统并设置基本配置:
  1. # 更新系统
  2. pacman -Syu
  3. # 设置时区
  4. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  5. hwclock --systohc
  6. # 设置主机名
  7. echo "my-rpi" > /etc/hostname
  8. # 配置本地主机名解析
  9. cat <<EOF >> /etc/hosts
  10. 127.0.0.1   localhost
  11. ::1         localhost
  12. 127.0.1.1   my-rpi.localdomain my-rpi
  13. EOF
  14. # 生成本地化设置
  15. echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
  16. locale-gen
  17. echo "LANG=en_US.UTF-8" > /etc/locale.conf
  18. # 创建新用户并设置密码
  19. useradd -m -G wheel -s /bin/bash myuser
  20. passwd myuser
  21. # 配置sudo
  22. pacman -S sudo
  23. EDITOR=nano visudo
  24. # 取消注释 "%wheel ALL=(ALL) ALL" 行
复制代码

2.4 网络配置

对于有线网络,系统通常会自动配置。对于Wi-Fi,需要安装和配置相关软件:
  1. # 安装Wi-Fi工具
  2. pacman -S iw wpa_supplicant dialog
  3. # 启用Wi-Fi服务
  4. systemctl enable netctl-auto@wlan0.service
  5. # 配置Wi-Fi连接
  6. wifi-menu
复制代码

2.5 SSH远程访问

为了便于远程管理,配置SSH访问:
  1. # 安装OpenSSH
  2. pacman -S openssh
  3. # 启用SSH服务
  4. systemctl enable sshd.service
  5. systemctl start sshd.service
  6. # 配置防火墙(可选)
  7. pacman -S ufw
  8. ufw enable
  9. ufw allow ssh
复制代码

3. Arch Linux ARM在物联网项目中的实际应用案例

3.1 家庭自动化系统

Arch Linux ARM可以作为家庭自动化系统的核心控制器,连接和管理各种智能设备。以下是一个基于Home Assistant的家庭自动化系统部署示例:
  1. # 安装必要的依赖
  2. pacman -S python python-pip python-virtualenv nginx
  3. # 创建Home Assistant用户
  4. useradd -rm homeassistant -G dialout
  5. # 切换到homeassistant用户
  6. sudo -u homeassistant -i
  7. # 创建虚拟环境
  8. cd /srv
  9. mkdir homeassistant
  10. cd homeassistant
  11. python3 -m venv .
  12. source bin/activate
  13. # 安装Home Assistant
  14. pip install homeassistant
  15. # 首次运行Home Assistant以创建配置
  16. hass
  17. # 退出虚拟环境并返回root用户
  18. exit
  19. # 创建systemd服务文件
  20. cat <<EOF > /etc/systemd/system/home-assistant@homeassistant.service
  21. [Unit]
  22. Description=Home Assistant
  23. After=network-online.target
  24. [Service]
  25. Type=simple
  26. User=%i
  27. ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"
  28. [Install]
  29. WantedBy=multi-user.target
  30. EOF
  31. # 启用并启动服务
  32. systemctl enable --now home-assistant@homeassistant.service
  33. # 配置Nginx反向代理
  34. cat <<EOF > /etc/nginx/nginx.conf
  35. worker_processes  1;
  36. error_log  /var/log/nginx/error.log warn;
  37. pid        /var/run/nginx.pid;
  38. events {
  39.     worker_connections  1024;
  40. }
  41. http {
  42.     include       /etc/nginx/mime.types;
  43.     default_type  application/octet-stream;
  44.     log_format  main  '\$remote_addr - \$remote_user [\$time_local] "\$request" '
  45.                       '\$status \$body_bytes_sent "\$http_referer" '
  46.                       '"\$http_user_agent" "\$http_x_forwarded_for"';
  47.     access_log  /var/log/nginx/access.log  main;
  48.     sendfile        on;
  49.     keepalive_timeout  65;
  50.     server {
  51.         listen 80;
  52.         server_name homeassistant.local;
  53.         location / {
  54.             proxy_pass http://localhost:8123;
  55.             proxy_set_header Host \$host;
  56.             proxy_redirect http:// https://;
  57.             proxy_http_version 1.1;
  58.             proxy_set_header Upgrade \$http_upgrade;
  59.             proxy_set_header Connection "upgrade";
  60.         }
  61.     }
  62. }
  63. EOF
  64. # 启用并启动Nginx
  65. systemctl enable --now nginx
复制代码

这个家庭自动化系统可以通过Web界面访问,并与各种智能设备(如智能灯泡、温控器、安防摄像头等)集成,实现场景联动和自动化控制。

3.2 环境监测站

Arch Linux ARM非常适合用于环境监测站,收集温度、湿度、空气质量等数据。以下是一个基于树莓派的环境监测站部署示例:
  1. # 安装必要的依赖
  2. pacman -S python python-pip python-virtualenv git
  3. # 创建监测站用户
  4. useradd -rm monitor -G gpio
  5. # 切换到monitor用户
  6. sudo -u monitor -i
  7. # 创建虚拟环境
  8. cd /home/monitor
  9. python3 -m venv env
  10. source env/bin/activate
  11. # 安装Python库
  12. pip install RPi.GPIO adafruit-circuitpython-dht adafruit-circuitpython-ads1x15 flask flask-cors
  13. # 创建监测脚本
  14. cat <<EOF > /home/monitor/env_monitor.py
  15. #!/usr/bin/env python3
  16. import time
  17. import board
  18. import adafruit_dht
  19. import adafruit_ads1x15.ads1115 as ADS
  20. from adafruit_ads1x15.analog_in import AnalogIn
  21. from flask import Flask, jsonify
  22. from flask_cors import CORS
  23. # 初始化传感器
  24. dht22 = adafruit_dht.DHT22(board.D4, use_pulseio=False)
  25. i2c = board.I2C()
  26. ads = ADS.ADS1115(i2c)
  27. chan = AnalogIn(ads, ADS.P0)
  28. # 创建Flask应用
  29. app = Flask(__name__)
  30. CORS(app)
  31. @app.route('/api/v1/environment')
  32. def get_environment_data():
  33.     try:
  34.         temperature = dht22.temperature
  35.         humidity = dht22.humidity
  36.         air_quality = chan.value
  37.         
  38.         return jsonify({
  39.             'temperature': temperature,
  40.             'humidity': humidity,
  41.             'air_quality': air_quality,
  42.             'timestamp': time.time()
  43.         })
  44.     except Exception as e:
  45.         return jsonify({'error': str(e)}), 500
  46. if __name__ == '__main__':
  47.     app.run(host='0.0.0.0', port=5000)
  48. EOF
  49. chmod +x /home/monitor/env_monitor.py
  50. # 创建systemd服务文件
  51. cat <<EOF > /etc/systemd/system/env-monitor.service
  52. [Unit]
  53. Description=Environment Monitor
  54. After=network.target
  55. [Service]
  56. User=monitor
  57. WorkingDirectory=/home/monitor
  58. ExecStart=/home/monitor/env/bin/python env_monitor.py
  59. Restart=always
  60. [Install]
  61. WantedBy=multi-user.target
  62. EOF
  63. # 启用并启动服务
  64. systemctl enable --now env-monitor.service
  65. # 创建数据记录脚本
  66. cat <<EOF > /home/monitor/log_data.py
  67. #!/usr/bin/env python3
  68. import requests
  69. import time
  70. import sqlite3
  71. from datetime import datetime
  72. # 创建数据库
  73. conn = sqlite3.connect('/home/monitor/environment.db')
  74. c = conn.cursor()
  75. c.execute('''CREATE TABLE IF NOT EXISTS environment
  76.              (timestamp REAL, temperature REAL, humidity REAL, air_quality REAL)''')
  77. conn.commit()
  78. # 记录数据
  79. while True:
  80.     try:
  81.         response = requests.get('http://localhost:5000/api/v1/environment')
  82.         data = response.json()
  83.         
  84.         c.execute("INSERT INTO environment VALUES (?, ?, ?, ?)",
  85.                  (data['timestamp'], data['temperature'], data['humidity'], data['air_quality']))
  86.         conn.commit()
  87.         
  88.         print(f"Recorded: T={data['temperature']:.1f}°C, H={data['humidity']:.1f}%, AQ={data['air_quality']}")
  89.     except Exception as e:
  90.         print(f"Error: {e}")
  91.    
  92.     time.sleep(300)  # 每5分钟记录一次
  93. EOF
  94. chmod +x /home/monitor/log_data.py
  95. # 创建systemd服务文件用于数据记录
  96. cat <<EOF > /etc/systemd/system/env-logger.service
  97. [Unit]
  98. Description=Environment Data Logger
  99. After=network.target env-monitor.service
  100. [Service]
  101. User=monitor
  102. WorkingDirectory=/home/monitor
  103. ExecStart=/home/monitor/env/bin/python log_data.py
  104. Restart=always
  105. [Install]
  106. WantedBy=multi-user.target
  107. EOF
  108. # 启用并启动数据记录服务
  109. systemctl enable --now env-logger.service
复制代码

这个环境监测站可以实时收集环境数据,并通过REST API提供访问。数据同时被记录到SQLite数据库中,便于后续分析和可视化。

3.3 网络监控设备

Arch Linux ARM可以配置为网络监控设备,监控网络流量、设备状态和安全事件。以下是一个基于树莓派的网络监控设备部署示例:
  1. # 安装必要的软件
  2. pacman -S nmap tcpdump vnstat iptables python python-pip python-virtualproc git
  3. # 创建监控用户
  4. useradd -rm netmon -G network
  5. # 切换到netmon用户
  6. sudo -u netmon -i
  7. # 创建虚拟环境
  8. cd /home/netmon
  9. python3 -m venv env
  10. source env/bin/activate
  11. # 安装Python库
  12. pip install flask flask-cors psutil python-nmap
  13. # 创建网络监控脚本
  14. cat <<EOF > /home/netmon/network_monitor.py
  15. #!/usr/bin/env python3
  16. import os
  17. import json
  18. import time
  19. import subprocess
  20. import sqlite3
  21. from datetime import datetime
  22. from flask import Flask, jsonify, request
  23. from flask_cors import CORS
  24. import psutil
  25. import nmap
  26. # 创建数据库
  27. conn = sqlite3.connect('/home/netmon/network.db')
  28. c = conn.cursor()
  29. c.execute('''CREATE TABLE IF NOT EXISTS devices
  30.              (mac TEXT PRIMARY KEY, ip TEXT, hostname TEXT, vendor TEXT, first_seen REAL, last_seen REAL)''')
  31. c.execute('''CREATE TABLE IF NOT EXISTS traffic
  32.              (timestamp REAL, bytes_in REAL, bytes_out REAL)''')
  33. conn.commit()
  34. # 创建Flask应用
  35. app = Flask(__name__)
  36. CORS(app)
  37. # 初始化nmap扫描器
  38. nm = nmap.PortScanner()
  39. def scan_network():
  40.     """扫描网络以发现设备"""
  41.     network = "192.168.1.0/24"  # 根据你的网络调整
  42.     nm.scan(hosts=network, arguments='-sn')
  43.    
  44.     devices = []
  45.     for host in nm.all_hosts():
  46.         if 'mac' in nm[host]['addresses']:
  47.             mac = nm[host]['addresses']['mac']
  48.             ip = nm[host]['addresses']['ipv4']
  49.             hostname = nm[host].hostname() if nm[host].hostname() else "Unknown"
  50.             vendor = nm[host]['vendor'][mac] if mac in nm[host]['vendor'] else "Unknown"
  51.             
  52.             # 更新数据库
  53.             c.execute("INSERT OR REPLACE INTO devices VALUES (?, ?, ?, ?, COALESCE((SELECT first_seen FROM devices WHERE mac=?), ?), ?)",
  54.                      (mac, ip, hostname, vendor, mac, time.time(), time.time()))
  55.             conn.commit()
  56.             
  57.             devices.append({
  58.                 'mac': mac,
  59.                 'ip': ip,
  60.                 'hostname': hostname,
  61.                 'vendor': vendor
  62.             })
  63.    
  64.     return devices
  65. def get_network_traffic():
  66.     """获取网络流量统计"""
  67.     try:
  68.         with open('/proc/net/dev', 'r') as f:
  69.             data = f.readlines()
  70.         
  71.         for line in data:
  72.             if 'eth0' in line or 'wlan0' in line:  # 根据你的网络接口调整
  73.                 parts = line.split()
  74.                 bytes_in = int(parts[1])
  75.                 bytes_out = int(parts[9])
  76.                
  77.                 # 记录到数据库
  78.                 c.execute("INSERT INTO traffic VALUES (?, ?, ?)",
  79.                          (time.time(), bytes_in, bytes_out))
  80.                 conn.commit()
  81.                
  82.                 return {
  83.                     'bytes_in': bytes_in,
  84.                     'bytes_out': bytes_out,
  85.                     'timestamp': time.time()
  86.                 }
  87.     except Exception as e:
  88.         print(f"Error getting traffic data: {e}")
  89.    
  90.     return None
  91. @app.route('/api/v1/devices')
  92. def get_devices():
  93.     """获取已发现的设备列表"""
  94.     c.execute("SELECT * FROM devices ORDER BY last_seen DESC")
  95.     devices = []
  96.     for row in c.fetchall():
  97.         devices.append({
  98.             'mac': row[0],
  99.             'ip': row[1],
  100.             'hostname': row[2],
  101.             'vendor': row[3],
  102.             'first_seen': row[4],
  103.             'last_seen': row[5]
  104.         })
  105.    
  106.     return jsonify(devices)
  107. @app.route('/api/v1/traffic')
  108. def get_traffic():
  109.     """获取网络流量数据"""
  110.     traffic = get_network_traffic()
  111.     if traffic:
  112.         return jsonify(traffic)
  113.     else:
  114.         return jsonify({'error': 'Failed to get traffic data'}), 500
  115. @app.route('/api/v1/scan', methods=['POST'])
  116. def trigger_scan():
  117.     """触发网络扫描"""
  118.     devices = scan_network()
  119.     return jsonify({
  120.         'status': 'success',
  121.         'devices': devices,
  122.         'count': len(devices)
  123.     })
  124. @app.route('/api/v1/system')
  125. def get_system_info():
  126.     """获取系统信息"""
  127.     cpu_percent = psutil.cpu_percent(interval=1)
  128.     memory = psutil.virtual_memory()
  129.     disk = psutil.disk_usage('/')
  130.    
  131.     return jsonify({
  132.         'cpu_percent': cpu_percent,
  133.         'memory_percent': memory.percent,
  134.         'memory_total': memory.total,
  135.         'memory_used': memory.used,
  136.         'disk_percent': disk.percent,
  137.         'disk_total': disk.total,
  138.         'disk_used': disk.used,
  139.         'uptime': time.time() - psutil.boot_time()
  140.     })
  141. if __name__ == '__main__':
  142.     app.run(host='0.0.0.0', port=5000)
  143. EOF
  144. chmod +x /home/netmon/network_monitor.py
  145. # 创建systemd服务文件
  146. cat <<EOF > /etc/systemd/system/network-monitor.service
  147. [Unit]
  148. Description=Network Monitor
  149. After=network.target
  150. [Service]
  151. User=netmon
  152. WorkingDirectory=/home/netmon
  153. ExecStart=/home/netmon/env/bin/python network_monitor.py
  154. Restart=always
  155. [Install]
  156. WantedBy=multi-user.target
  157. EOF
  158. # 启用并启动服务
  159. systemctl enable --now network-monitor.service
  160. # 配置vnStat以监控网络流量
  161. pacman -S vnstat
  162. vnstat -u -i eth0  # 根据你的网络接口调整
  163. systemctl enable --now vnstat
  164. # 创建网络扫描定时任务
  165. cat <<EOF > /etc/systemd/system/network-scan.timer
  166. [Unit]
  167. Description=Network Scan Timer
  168. [Timer]
  169. OnBootSec=5min
  170. OnUnitActiveSec=30min
  171. Persistent=true
  172. [Install]
  173. WantedBy=timers.target
  174. EOF
  175. cat <<EOF > /etc/systemd/system/network-scan.service
  176. [Unit]
  177. Description=Network Scan
  178. [Service]
  179. Type=oneshot
  180. ExecStart=/usr/bin/curl -X POST http://localhost:5000/api/v1/scan
  181. EOF
  182. # 启用并启动定时任务
  183. systemctl enable --now network-scan.timer
复制代码

这个网络监控设备可以定期扫描网络,发现连接的设备,监控网络流量,并提供REST API用于查询系统状态和网络信息。

4. Arch Linux ARM的部署技巧与最佳实践

4.1 系统安全加固

在物联网项目中,设备安全性至关重要。以下是一些加固Arch Linux ARM系统的技巧:
  1. # 更新系统
  2. pacman -Syu
  3. # 安装安全工具
  4. pacman -S fail2ban ufw clamav rkhunter
  5. # 配置防火墙
  6. ufw enable
  7. ufw default deny incoming
  8. ufw default allow outgoing
  9. ufw allow ssh
  10. ufw allow http
  11. ufw allow https
  12. # 配置fail2ban以保护SSH
  13. cat <<EOF > /etc/fail2ban/jail.local
  14. [sshd]
  15. enabled = true
  16. port = ssh
  17. filter = sshd
  18. logpath = /var/log/auth.log
  19. maxretry = 3
  20. bantime = 3600
  21. EOF
  22. # 启用并启动fail2ban
  23. systemctl enable --now fail2ban
  24. # 配置自动安全更新
  25. cat <<EOF > /etc/systemd/system/security-update.service
  26. [Unit]
  27. Description=Security Update
  28. After=network.target
  29. [Service]
  30. Type=oneshot
  31. ExecStart=/usr/bin/pacman -Syu --noconfirm
  32. [Install]
  33. WantedBy=multi-user.target
  34. EOF
  35. cat <<EOF > /etc/systemd/system/security-update.timer
  36. [Unit]
  37. Description=Security Update Timer
  38. [Timer]
  39. OnCalendar=weekly
  40. Persistent=true
  41. [Install]
  42. WantedBy=timers.target
  43. EOF
  44. # 启用并启动安全更新定时任务
  45. systemctl enable --now security-update.timer
  46. # 禁用root登录
  47. passwd -l root
  48. # 使用SSH密钥认证
  49. mkdir -p ~/.ssh
  50. chmod 700 ~/.ssh
  51. # 将你的公钥添加到~/.ssh/authorized_keys
  52. chmod 600 ~/.ssh/authorized_keys
  53. # 配置SSH以禁用密码认证
  54. cat <<EOF >> /etc/ssh/sshd_config
  55. PasswordAuthentication no
  56. ChallengeResponseAuthentication no
  57. EOF
  58. # 重启SSH服务
  59. systemctl restart sshd
复制代码

4.2 自动化部署脚本

为了简化Arch Linux ARM在多个树莓派上的部署,可以创建自动化部署脚本:
  1. #!/bin/bash
  2. # deploy.sh - Arch Linux ARM 自动化部署脚本
  3. # 检查是否以root权限运行
  4. if [ "$(id -u)" -ne 0 ]; then
  5.     echo "此脚本必须以root权限运行" >&2
  6.     exit 1
  7. fi
  8. # 配置参数
  9. HOSTNAME=${1:-"rpi-iot"}
  10. USERNAME=${2:-"iotuser"}
  11. PASSWORD=${3:-"iotpass"}
  12. WIFI_SSID=${4:-""}
  13. WIFI_PSK=${5:-""}
  14. # 更新系统
  15. pacman -Syu --noconfirm
  16. # 设置时区
  17. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  18. hwclock --systohc
  19. # 设置主机名
  20. echo "$HOSTNAME" > /etc/hostname
  21. # 配置本地主机名解析
  22. cat <<EOF >> /etc/hosts
  23. 127.0.0.1   localhost
  24. ::1         localhost
  25. 127.0.1.1   $HOSTNAME.localdomain $HOSTNAME
  26. EOF
  27. # 生成本地化设置
  28. echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
  29. locale-gen
  30. echo "LANG=en_US.UTF-8" > /etc/locale.conf
  31. # 创建新用户并设置密码
  32. useradd -m -G wheel -s /bin/bash $USERNAME
  33. echo "$USERNAME:$PASSWORD" | chpasswd
  34. # 配置sudo
  35. pacman -S --noconfirm sudo
  36. sed -i 's/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/' /etc/sudoers
  37. # 安装基础软件包
  38. pacman -S --noconfirm base-devel git vim htop wget curl
  39. # 配置Wi-Fi(如果提供了SSID和PSK)
  40. if [ -n "$WIFI_SSID" ] && [ -n "$WIFI_PSK" ]; then
  41.     pacman -S --noconfirm iw wpa_supplicant dialog
  42.    
  43.     # 生成Wi-Fi配置
  44.     wpa_passphrase "$WIFI_SSID" "$WIFI_PSK" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
  45.     chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
  46.    
  47.     # 启用Wi-Fi服务
  48.     systemctl enable netctl-auto@wlan0.service
  49. fi
  50. # 安装和配置SSH
  51. pacman -S --noconfirm openssh
  52. systemctl enable sshd.service
  53. # 配置SSH安全
  54. sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
  55. sed -i 's/#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config
  56. # 创建SSH目录并设置权限
  57. mkdir -p /home/$USERNAME/.ssh
  58. chmod 700 /home/$USERNAME/.ssh
  59. touch /home/$USERNAME/.ssh/authorized_keys
  60. chmod 600 /home/$USERNAME/.ssh/authorized_keys
  61. chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh
  62. # 禁用root登录
  63. passwd -l root
  64. # 安装和配置防火墙
  65. pacman -S --noconfirm ufw
  66. ufw enable
  67. ufw default deny incoming
  68. ufw default allow outgoing
  69. ufw allow ssh
  70. # 安装和配置fail2ban
  71. pacman -S --noconfirm fail2ban
  72. cat <<EOF > /etc/fail2ban/jail.local
  73. [sshd]
  74. enabled = true
  75. port = ssh
  76. filter = sshd
  77. logpath = /var/log/auth.log
  78. maxretry = 3
  79. bantime = 3600
  80. EOF
  81. systemctl enable fail2ban
  82. # 创建系统更新定时任务
  83. cat <<EOF > /etc/systemd/system/system-update.service
  84. [Unit]
  85. Description=System Update
  86. After=network.target
  87. [Service]
  88. Type=oneshot
  89. ExecStart=/usr/bin/pacman -Syu --noconfirm
  90. [Install]
  91. WantedBy=multi-user.target
  92. EOF
  93. cat <<EOF > /etc/systemd/system/system-update.timer
  94. [Unit]
  95. Description=System Update Timer
  96. [Timer]
  97. OnCalendar=weekly
  98. Persistent=true
  99. [Install]
  100. WantedBy=timers.target
  101. EOF
  102. systemctl enable system-update.timer
  103. # 清理包缓存
  104. pacman -Scc --noconfirm
  105. # 显示完成信息
  106. echo "部署完成!"
  107. echo "主机名: $HOSTNAME"
  108. echo "用户名: $USERNAME"
  109. echo "请将SSH公钥添加到 /home/$USERNAME/.ssh/authorized_keys"
  110. echo "然后重启系统以应用所有更改"
  111. # 重启系统
  112. reboot
复制代码

使用此脚本时,可以通过参数自定义主机名、用户名、密码和Wi-Fi设置:
  1. sudo ./deploy.sh my-iot-device iotuser securepassword MyWiFi MyWiFiPassword
复制代码

4.3 资源管理与优化

树莓派资源有限,因此优化资源使用对于物联网项目至关重要:
  1. # 安装系统监控工具
  2. pacman -S htop iotop iftop
  3. # 创建资源监控脚本
  4. cat <<EOF > /usr/local/bin/resource_monitor
  5. #!/bin/bash
  6. # 获取CPU使用率
  7. CPU_USAGE=\$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - \$1}')
  8. # 获取内存使用情况
  9. MEMORY_INFO=\$(free -m | awk 'NR==2{printf "%.2f%% (%dMB/%dMB)", \$3*100/\$2, \$3, \$2}')
  10. # 获取磁盘使用情况
  11. DISK_INFO=\$(df -h / | awk 'NR==2{printf "%s (%s/%s)", \$5, \$3, \$2}')
  12. # 获取系统温度
  13. TEMP=\$(vcgencmd measure_temp | cut -d= -f2)
  14. # 获取系统运行时间
  15. UPTIME=\$(uptime -p)
  16. # 显示信息
  17. echo "资源使用情况 - \$(date)"
  18. echo "CPU使用率: \$CPU_USAGE%"
  19. echo "内存使用: \$MEMORY_INFO"
  20. echo "磁盘使用: \$DISK_INFO"
  21. echo "系统温度: \$TEMP"
  22. echo "系统运行时间: \$UPTIME"
  23. echo "----------------------------------------"
  24. EOF
  25. chmod +x /usr/local/bin/resource_monitor
  26. # 创建日志轮转配置
  27. cat <<EOF > /etc/logrotate.d/resource-monitor
  28. /var/log/resource-monitor.log {
  29.     daily
  30.     rotate 7
  31.     compress
  32.     missingok
  33.     notifempty
  34.     create 644 root root
  35. }
  36. EOF
  37. # 创建资源监控定时任务
  38. cat <<EOF > /etc/systemd/system/resource-monitor.service
  39. [Unit]
  40. Description=Resource Monitor
  41. [Service]
  42. Type=oneshot
  43. ExecStart=/bin/bash -c '/usr/local/bin/resource_monitor >> /var/log/resource-monitor.log'
  44. [Install]
  45. WantedBy=multi-user.target
  46. EOF
  47. cat <<EOF > /etc/systemd/system/resource-monitor.timer
  48. [Unit]
  49. Description=Resource Monitor Timer
  50. [Timer]
  51. OnCalendar=hourly
  52. Persistent=true
  53. [Install]
  54. WantedBy=timers.target
  55. EOF
  56. # 启用并启动资源监控定时任务
  57. systemctl enable --now resource-monitor.timer
  58. # 配置zram以减少内存压力
  59. pacman -S zram-generator
  60. cat <<EOF > /etc/systemd/zram-generator.conf
  61. [zram0]
  62. zram-size = 512 # 大小以MB为单位
  63. compression-algorithm = lz4
  64. EOF
  65. # 启用zram
  66. systemctl enable systemd-zram-setup@zram0.service
  67. systemctl start systemd-zram-setup@zram0.service
  68. # 优化swap设置
  69. echo "vm.swappiness=10" >> /etc/sysctl.d/99-sysctl.conf
  70. sysctl -p
  71. # 禁用不必要的服务
  72. systemctl disable bluetooth.service
  73. systemctl disable avahi-daemon.service
  74. systemctl disable cups.service
  75. # 设置CPU性能模式
  76. cat <<EOF > /etc/systemd/system/cpufreq-performance.service
  77. [Unit]
  78. Description=Set CPU Performance Governor
  79. [Service]
  80. Type=oneshot
  81. ExecStart=/bin/sh -c "echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"
  82. [Install]
  83. WantedBy=multi-user.target
  84. EOF
  85. systemctl enable cpufreq-performance.service
  86. systemctl start cpufreq-performance.service
复制代码

4.4 远程管理与监控

对于物联网项目,远程管理和监控是必不可少的。以下是一些远程管理和监控的配置:
  1. # 安装监控工具
  2. pacman -S python python-pip python-virtualenv git
  3. # 创建监控用户
  4. useradd -rm monitor -G dialout,gpio
  5. # 切换到monitor用户
  6. sudo -u monitor -i
  7. # 创建虚拟环境
  8. cd /home/monitor
  9. python3 -m venv env
  10. source env/bin/activate
  11. # 安装Python库
  12. pip install flask psutil prometheus_client
  13. # 创建监控API脚本
  14. cat <<EOF > /home/monitor/monitor_api.py
  15. #!/usr/bin/env python3
  16. import time
  17. import os
  18. import psutil
  19. from flask import Flask, jsonify
  20. from prometheus_client import start_http_server, Summary, Gauge, Counter
  21. # 创建Flask应用
  22. app = Flask(__name__)
  23. # Prometheus指标
  24. REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')
  25. CPU_USAGE = Gauge('cpu_usage_percent', 'CPU usage in percent')
  26. MEMORY_USAGE = Gauge('memory_usage_percent', 'Memory usage in percent')
  27. DISK_USAGE = Gauge('disk_usage_percent', 'Disk usage in percent')
  28. TEMPERATURE = Gauge('cpu_temperature_celsius', 'CPU temperature in celsius')
  29. UPTIME = Gauge('system uptime_seconds', 'System uptime in seconds')
  30. def get_temperature():
  31.     """获取CPU温度"""
  32.     try:
  33.         with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
  34.             temp = float(f.read()) / 1000.0
  35.         return temp
  36.     except:
  37.         return 0.0
  38. @app.route('/api/v1/system')
  39. @REQUEST_TIME.time()
  40. def system_info():
  41.     """获取系统信息"""
  42.     cpu_percent = psutil.cpu_percent(interval=1)
  43.     memory = psutil.virtual_memory()
  44.     disk = psutil.disk_usage('/')
  45.     temp = get_temperature()
  46.     uptime = time.time() - psutil.boot_time()
  47.    
  48.     # 更新Prometheus指标
  49.     CPU_USAGE.set(cpu_percent)
  50.     MEMORY_USAGE.set(memory.percent)
  51.     DISK_USAGE.set(disk.percent)
  52.     TEMPERATURE.set(temp)
  53.     UPTIME.set(uptime)
  54.    
  55.     return jsonify({
  56.         'cpu_percent': cpu_percent,
  57.         'memory_percent': memory.percent,
  58.         'memory_total': memory.total,
  59.         'memory_used': memory.used,
  60.         'disk_percent': disk.percent,
  61.         'disk_total': disk.total,
  62.         'disk_used': disk.used,
  63.         'temperature': temp,
  64.         'uptime': uptime,
  65.         'timestamp': time.time()
  66.     })
  67. @app.route('/api/v1/processes')
  68. def processes():
  69.     """获取进程列表"""
  70.     processes = []
  71.     for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
  72.         try:
  73.             pinfo = proc.as_dict(['pid', 'name', 'cpu_percent', 'memory_percent'])
  74.             processes.append(pinfo)
  75.         except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
  76.             pass
  77.    
  78.     return jsonify(processes)
  79. @app.route('/health')
  80. def health_check():
  81.     """健康检查端点"""
  82.     return jsonify({'status': 'healthy'})
  83. if __name__ == '__main__':
  84.     # 启动Prometheus指标服务器
  85.     start_http_server(8000)
  86.    
  87.     # 启动Flask应用
  88.     app.run(host='0.0.0.0', port=5000)
  89. EOF
  90. chmod +x /home/monitor/monitor_api.py
  91. # 创建systemd服务文件
  92. cat <<EOF > /etc/systemd/system/monitor-api.service
  93. [Unit]
  94. Description=Monitor API
  95. After=network.target
  96. [Service]
  97. User=monitor
  98. WorkingDirectory=/home/monitor
  99. ExecStart=/home/monitor/env/bin/python monitor_api.py
  100. Restart=always
  101. [Install]
  102. WantedBy=multi-user.target
  103. EOF
  104. # 启用并启动监控API服务
  105. systemctl enable --now monitor-api.service
  106. # 安装和配置Telegraf以发送指标到InfluxDB或Prometheus
  107. pacman -S telegraf
  108. cat <<EOF > /etc/telegraf/telegraf.conf
  109. [global_tags]
  110.   host = "$HOSTNAME"
  111. [agent]
  112.   interval = "60s"
  113.   round_interval = true
  114.   metric_batch_size = 1000
  115.   metric_buffer_limit = 10000
  116.   collection_jitter = "0s"
  117.   flush_interval = "60s"
  118.   flush_jitter = "0s"
  119.   precision = ""
  120.   debug = false
  121.   quiet = false
  122.   logfile = ""
  123.   hostname = ""
  124.   omit_hostname = false
  125. [[outputs.influxdb]]
  126.   urls = ["http://your-influxdb-server:8086"]  # 替换为你的InfluxDB服务器地址
  127.   database = "iot_metrics"
  128.   retention_policy = "autogen"
  129.   write_consistency = "any"
  130.   timeout = "5s"
  131. [[inputs.cpu]]
  132.   percpu = true
  133.   totalcpu = true
  134.   collect_cpu_time = false
  135.   report_active = false
  136. [[inputs.disk]]
  137.   ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
  138. [[inputs.mem]]
  139. [[inputs.system]]
  140. [[inputs.net]]
  141.   interfaces = ["eth0", "wlan0"]  # 根据你的网络接口调整
  142. [[inputs.exec]]
  143.   commands = ["/usr/bin/vcgencmd measure_temp"]
  144.   name_override = "cpu_temperature"
  145.   data_format = "influx"
  146. EOF
  147. # 启用并启动Telegraf
  148. systemctl enable --now telegraf
  149. # 安装和配置Grafana(可选,用于可视化)
  150. pacman -S grafana
  151. # 启用并启动Grafana
  152. systemctl enable --now grafana
复制代码

5. 性能优化与故障排除

5.1 系统性能调优

Arch Linux ARM在树莓派上的性能调优对于物联网项目尤为重要:
  1. # 安装性能分析工具
  2. pacman -S perf sysstat
  3. # 配置sysstat以收集系统性能数据
  4. cat <<EOF >> /etc/sysstat/sysstat
  5. HISTORY=7
  6. EOF
  7. # 启用并启动sysstat
  8. systemctl enable --now sysstat
  9. # 创建CPU性能分析脚本
  10. cat <<EOF > /usr/local/bin/cpu_performance
  11. #!/bin/bash
  12. # 设置CPU性能模式
  13. echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
  14. # 禁用CPU节能功能
  15. echo 1 | tee /sys/devices/system/cpu/smt/control
  16. # 显示CPU信息
  17. echo "CPU 信息:"
  18. lscpu | grep "Model name\|CPU(s):\|Thread\|Core\|Socket"
  19. echo "CPU 频率:"
  20. cat /proc/cpuinfo | grep "MHz" | sort -u
  21. echo "CPU 调度器:"
  22. cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | sort -u
  23. EOF
  24. chmod +x /usr/local/bin/cpu_performance
  25. # 创建内存优化脚本
  26. cat <<EOF > /usr/local/bin/memory_optimize
  27. #!/bin/bash
  28. # 清理页面缓存
  29. sync; echo 1 > /proc/sys/vm/drop_caches
  30. # 清理目录项和inode缓存
  31. sync; echo 2 > /proc/sys/vm/drop_caches
  32. # 清理页面缓存、目录项和inode缓存
  33. sync; echo 3 > /proc/sys/vm/drop_caches
  34. # 显示内存使用情况
  35. free -h
  36. # 显示内存使用最多的进程
  37. ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
  38. EOF
  39. chmod +x /usr/local/bin/memory_optimize
  40. # 创建磁盘性能优化脚本
  41. cat <<EOF > /usr/local/bin/disk_optimize
  42. #!/bin/bash
  43. # 检查磁盘I/O调度器
  44. echo "磁盘I/O调度器:"
  45. for disk in \$(ls /sys/block/ | grep -E "sd[a-z]|mmcblk[0-9]"); do
  46.     echo "/dev/\$disk: \$(cat /sys/block/\$disk/queue/scheduler)"
  47. done
  48. # 设置I/O调度器为deadline(适合SSD/SD卡)
  49. for disk in \$(ls /sys/block/ | grep -E "sd[a-z]|mmcblk[0-9]"); do
  50.     echo deadline > /sys/block/\$disk/queue/scheduler
  51. done
  52. # 显示磁盘使用情况
  53. df -h
  54. # 显示磁盘I/O统计
  55. iostat -x 1 3
  56. EOF
  57. chmod +x /usr/local/bin/disk_optimize
  58. # 创建系统性能监控脚本
  59. cat <<EOF > /usr/local/bin/system_performance
  60. #!/bin/bash
  61. # 获取系统信息
  62. echo "=== 系统信息 ==="
  63. uname -a
  64. uptime
  65. echo -e "\n=== CPU 信息 ==="
  66. lscpu | grep "Model name\|CPU(s):\|Thread\|Core\|Socket"
  67. echo "CPU 温度: \$(vcgencmd measure_temp)"
  68. echo "CPU 使用率: \$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - \$1}')%"
  69. echo -e "\n=== 内存信息 ==="
  70. free -h
  71. echo "内存使用最多的进程:"
  72. ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
  73. echo -e "\n=== 磁盘信息 ==="
  74. df -h
  75. echo "磁盘I/O:"
  76. iostat -x 1 1
  77. echo -e "\n=== 网络信息 ==="
  78. ip a
  79. echo "网络连接:"
  80. ss -tuln
  81. echo -e "\n=== 系统日志 ==="
  82. journalctl -p 3 -xb --no-pager | tail -n 20
  83. EOF
  84. chmod +x /usr/local/bin/system_performance
  85. # 创建性能优化定时任务
  86. cat <<EOF > /etc/systemd/system/performance-optimization.service
  87. [Unit]
  88. Description=Performance Optimization
  89. [Service]
  90. Type=oneshot
  91. ExecStart=/usr/local/bin/cpu_performance
  92. ExecStart=/usr/local/bin/memory_optimize
  93. ExecStart=/usr/local/bin/disk_optimize
  94. [Install]
  95. WantedBy=multi-user.target
  96. EOF
  97. cat <<EOF > /etc/systemd/system/performance-optimization.timer
  98. [Unit]
  99. Description=Performance Optimization Timer
  100. [Timer]
  101. OnCalendar=daily
  102. Persistent=true
  103. [Install]
  104. WantedBy=timers.target
  105. EOF
  106. # 启用并启动性能优化定时任务
  107. systemctl enable --now performance-optimization.timer
复制代码

5.2 常见问题及解决方案

在部署和使用Arch Linux ARM时,可能会遇到一些常见问题。以下是一些问题及其解决方案:

SD卡是树莓派最常见的故障点之一。以下是一些预防和解决方案:
  1. # 创建SD卡健康检查脚本
  2. cat <<EOF > /usr/local/bin/sd_card_health
  3. #!/bin/bash
  4. # 检查SD卡健康状态
  5. echo "=== SD卡健康检查 ==="
  6. # 检查文件系统错误
  7. echo "检查文件系统错误:"
  8. fsck -t vfat -f /dev/mmcblk0p1
  9. fsck -t ext4 -f /dev/mmcblk0p2
  10. # 检查SD卡寿命(如果支持)
  11. echo "检查SD卡寿命:"
  12. if [ -f /sys/block/mmcblk0/device/life_time ]; then
  13.     echo "SD卡寿命估计: \$(cat /sys/block/mmcblk0/device/life_time)"
  14. else
  15.     echo "此SD卡不支持寿命估计"
  16. fi
  17. # 检查坏块
  18. echo "检查坏块:"
  19. badblocks -sv /dev/mmcblk0p2
  20. # 显示磁盘使用情况
  21. echo "磁盘使用情况:"
  22. df -h
  23. # 显示I/O统计
  24. echo "I/O统计:"
  25. iostat -d /dev/mmcblk0 1 3
  26. EOF
  27. chmod +x /usr/local/bin/sd_card_health
  28. # 创建SD卡健康检查定时任务
  29. cat <<EOF > /etc/systemd/system/sd-card-health.service
  30. [Unit]
  31. Description=SD Card Health Check
  32. [Service]
  33. Type=oneshot
  34. ExecStart=/usr/local/bin/sd_card_health
  35. [Install]
  36. WantedBy=multi-user.target
  37. EOF
  38. cat <<EOF > /etc/systemd/system/sd-card-health.timer
  39. [Unit]
  40. Description=SD Card Health Check Timer
  41. [Timer]
  42. OnCalendar=weekly
  43. Persistent=true
  44. [Install]
  45. WantedBy=timers.target
  46. EOF
  47. # 启用并启动SD卡健康检查定时任务
  48. systemctl enable --now sd-card-health.timer
  49. # 创建SD卡备份脚本
  50. cat <<EOF > /usr/local/bin/sd_card_backup
  51. #!/bin/bash
  52. # 配置备份目录
  53. BACKUP_DIR="/mnt/backup"
  54. BACKUP_FILE="\$BACKUP_DIR/sd_card_backup_\$(date +%Y%m%d_%H%M%S).img"
  55. # 创建备份目录
  56. mkdir -p \$BACKUP_DIR
  57. # 显示备份开始信息
  58. echo "开始备份SD卡到 \$BACKUP_FILE"
  59. echo "这可能需要一些时间,请耐心等待..."
  60. # 备份SD卡
  61. dd if=/dev/mmcblk0 of=\$BACKUP_FILE bs=4M conv=fsync status=progress
  62. # 压缩备份文件
  63. echo "压缩备份文件..."
  64. gzip \$BACKUP_FILE
  65. # 显示备份完成信息
  66. echo "备份完成: \$BACKUP_FILE.gz"
  67. # 删除旧备份(保留最近3个)
  68. echo "清理旧备份..."
  69. ls -t \$BACKUP_DIR/sd_card_backup_*.gz | tail -n +4 | xargs rm -f
  70. EOF
  71. chmod +x /usr/local/bin/sd_card_backup
  72. # 创建SD卡备份定时任务
  73. cat <<EOF > /etc/systemd/system/sd-card-backup.service
  74. [Unit]
  75. Description=SD Card Backup
  76. [Service]
  77. Type=oneshot
  78. ExecStart=/usr/local/bin/sd_card_backup
  79. [Install]
  80. WantedBy=multi-user.target
  81. EOF
  82. cat <<EOF > /etc/systemd/system/sd-card-backup.timer
  83. [Unit]
  84. Description=SD Card Backup Timer
  85. [Timer]
  86. OnCalendar=monthly
  87. Persistent=true
  88. [Install]
  89. WantedBy=timers.target
  90. EOF
  91. # 启用并启动SD卡备份定时任务
  92. systemctl enable --now sd-card-backup.timer
复制代码

系统崩溃是另一个常见问题。以下是一些预防和解决方案:
  1. # 创建系统崩溃诊断脚本
  2. cat <<EOF > /usr/local/bin/system_crash_diagnosis
  3. #!/bin/bash
  4. # 创建诊断目录
  5. DIAG_DIR="/var/log/system_diagnosis_\$(date +%Y%m%d_%H%M%S)"
  6. mkdir -p \$DIAG_DIR
  7. echo "系统崩溃诊断 - \$(date)" > \$DIAG_DIR/diagnosis.log
  8. echo "诊断目录: \$DIAG_DIR" >> \$DIAG_DIR/diagnosis.log
  9. # 收集系统信息
  10. echo "收集系统信息..." >> \$DIAG_DIR/diagnosis.log
  11. uname -a > \$DIAG_DIR/system_info.txt
  12. uptime >> \$DIAG_DIR/system_info.txt
  13. dmesg > \$DIAG_DIR/dmesg.log
  14. journalctl -b -p err > \$DIAG_DIR/system_errors.log
  15. # 收集内存信息
  16. echo "收集内存信息..." >> \$DIAG_DIR/diagnosis.log
  17. free -h > \$DIAG_DIR/memory_info.txt
  18. cat /proc/meminfo > \$DIAG_DIR/meminfo.txt
  19. # 收集CPU信息
  20. echo "收集CPU信息..." >> \$DIAG_DIR/diagnosis.log
  21. lscpu > \$DIAG_DIR/cpu_info.txt
  22. cat /proc/cpuinfo > \$DIAG_DIR/cpuinfo.txt
  23. vcgencmd measure_temp > \$DIAG_DIR/cpu_temp.txt
  24. # 收集磁盘信息
  25. echo "收集磁盘信息..." >> \$DIAG_DIR/diagnosis.log
  26. df -h > \$DIAG_DIR/disk_usage.txt
  27. fdisk -l > \$DIAG_DIR/disk_partitions.txt
  28. cat /proc/partitions > \$DIAG_DIR/partitions.txt
  29. # 收集网络信息
  30. echo "收集网络信息..." >> \$DIAG_DIR/diagnosis.log
  31. ip a > \$DIAG_DIR/network_interfaces.txt
  32. ss -tuln > \$DIAG_DIR/network_connections.txt
  33. # 收集进程信息
  34. echo "收集进程信息..." >> \$DIAG_DIR/diagnosis.log
  35. ps auxf > \$DIAG_DIR/processes.txt
  36. top -bn1 > \$DIAG_DIR/top.txt
  37. # 收集服务状态
  38. echo "收集服务状态..." >> \$DIAG_DIR/diagnosis.log
  39. systemctl list-units --type=service --state=failed > \$DIAG_DIR/failed_services.txt
  40. # 收集日志文件
  41. echo "收集日志文件..." >> \$DIAG_DIR/diagnosis.log
  42. journalctl --since "1 day ago" > \$DIAG_DIR/journal.log
  43. tail -n 100 /var/log/messages > \$DIAG_DIR/messages.log 2>/dev/null || echo "No messages log" > \$DIAG_DIR/messages.log
  44. # 创建系统恢复脚本
  45. cat <<EOT > \$DIAG_DIR/system_recovery.sh
  46. #!/bin/bash
  47. # 系统恢复脚本 - \$(date)
  48. echo "开始系统恢复..."
  49. # 更新系统
  50. pacman -Syu --noconfirm
  51. # 重置系统服务
  52. systemctl daemon-reload
  53. systemctl reset-failed
  54. # 检查并修复文件系统
  55. fsck -t ext4 -f /dev/mmcblk0p2
  56. # 清理包缓存
  57. pacman -Scc --noconfirm
  58. # 重新生成initramfs
  59. mkinitcpio -P
  60. # 更新grub(如果使用)
  61. # grub-mkconfig -o /boot/grub/grub.cfg
  62. echo "系统恢复完成。建议重启系统。"
  63. EOT
  64. chmod +x \$DIAG_DIR/system_recovery.sh
  65. echo "诊断完成。请检查 \$DIAG_DIR 目录中的文件。"
  66. echo "如果需要恢复系统,请运行 \$DIAG_DIR/system_recovery.sh"
  67. EOF
  68. chmod +x /usr/local/bin/system_crash_diagnosis
  69. # 创建系统崩溃监控服务
  70. cat <<EOF > /etc/systemd/system/system-crash-monitor.service
  71. [Unit]
  72. Description=System Crash Monitor
  73. After=network.target
  74. [Service]
  75. Type=simple
  76. ExecStart=/bin/bash -c 'while true; do if [ -f /var/crash/* ]; then /usr/local/bin/system_crash_diagnosis; rm -f /var/crash/*; fi; sleep 60; done'
  77. Restart=always
  78. [Install]
  79. WantedBy=multi-user.target
  80. EOF
  81. # 启用并启动系统崩溃监控服务
  82. systemctl enable --now system-crash-monitor.service
  83. # 配置内核转储
  84. cat <<EOF >> /etc/sysctl.conf
  85. kernel.panic = 10
  86. kernel.panic_on_oops = 1
  87. kernel.softlockup_panic = 1
  88. kernel.hung_task_panic = 1
  89. vm.panic_on_oom = 1
  90. EOF
  91. # 应用内核参数
  92. sysctl -p
  93. # 创建系统恢复脚本
  94. cat <<EOF > /usr/local/bin/system_recovery
  95. #!/bin/bash
  96. echo "系统恢复脚本 - \$(date)"
  97. # 创建恢复日志
  98. RECOVERY_LOG="/var/log/system_recovery_\$(date +%Y%m%d_%H%M%S).log"
  99. echo "系统恢复开始 - \$(date)" > \$RECOVERY_LOG
  100. # 检查文件系统
  101. echo "检查文件系统..." >> \$RECOVERY_LOG
  102. fsck -t ext4 -f /dev/mmcblk0p2 >> \$RECOVERY_LOG 2>&1
  103. # 更新系统
  104. echo "更新系统..." >> \$RECOVERY_LOG
  105. pacman -Syu --noconfirm >> \$RECOVERY_LOG 2>&1
  106. # 重置系统服务
  107. echo "重置系统服务..." >> \$RECOVERY_LOG
  108. systemctl daemon-reload >> \$RECOVERY_LOG 2>&1
  109. systemctl reset-failed >> \$RECOVERY_LOG 2>&1
  110. # 清理包缓存
  111. echo "清理包缓存..." >> \$RECOVERY_LOG
  112. pacman -Scc --noconfirm >> \$RECOVERY_LOG 2>&1
  113. # 重新生成initramfs
  114. echo "重新生成initramfs..." >> \$RECOVERY_LOG
  115. mkinitcpio -P >> \$RECOVERY_LOG 2>&1
  116. # 清理临时文件
  117. echo "清理临时文件..." >> \$RECOVERY_LOG
  118. rm -rf /tmp/* >> \$RECOVERY_LOG 2>&1
  119. # 检查磁盘空间
  120. echo "检查磁盘空间..." >> \$RECOVERY_LOG
  121. df -h >> \$RECOVERY_LOG 2>&1
  122. # 检查系统服务状态
  123. echo "检查系统服务状态..." >> \$RECOVERY_LOG
  124. systemctl list-units --type=service --state=failed >> \$RECOVERY_LOG 2>&1
  125. echo "系统恢复完成 - \$(date)" >> \$RECOVERY_LOG
  126. echo "恢复日志保存在: \$RECOVERY_LOG"
  127. # 询问是否重启
  128. read -p "是否现在重启系统? (y/n): " choice
  129. if [ "\$choice" = "y" ] || [ "\$choice" = "Y" ]; then
  130.     echo "重启系统..."
  131.     reboot
  132. else
  133.     echo "恢复完成,但系统未重启。"
  134. fi
  135. EOF
  136. chmod +x /usr/local/bin/system_recovery
复制代码

5.3 系统备份与恢复策略

对于物联网项目,可靠的备份与恢复策略至关重要:
  1. # 创建系统备份脚本
  2. cat <<EOF > /usr/local/bin/system_backup
  3. #!/bin/bash
  4. # 配置备份参数
  5. BACKUP_DIR="/mnt/backup"
  6. BACKUP_NAME="system_backup_\$(date +%Y%m%d_%H%M%S)"
  7. BACKUP_PATH="\$BACKUP_DIR/\$BACKUP_NAME"
  8. # 创建备份目录
  9. mkdir -p \$BACKUP_PATH
  10. echo "开始系统备份 - \$(date)"
  11. echo "备份目录: \$BACKUP_PATH"
  12. # 创建备份日志
  13. BACKUP_LOG="\$BACKUP_PATH/backup.log"
  14. echo "系统备份日志 - \$(date)" > \$BACKUP_LOG
  15. # 备份系统配置
  16. echo "备份系统配置..." >> \$BACKUP_LOG
  17. tar -czf \$BACKUP_PATH/etc_backup.tar.gz /etc 2>> \$BACKUP_LOG
  18. # 备份系统服务
  19. echo "备份系统服务..." >> \$BACKUP_LOG
  20. systemctl list-unit-files > \$BACKUP_PATH/systemd_services.txt 2>> \$BACKUP_LOG
  21. # 备份已安装的软件包
  22. echo "备份已安装的软件包..." >> \$BACKUP_LOG
  23. pacman -Qqe > \$BACKUP_PATH/pacman_packages.txt 2>> \$BACKUP_LOG
  24. # 备份用户数据
  25. echo "备份用户数据..." >> \$BACKUP_LOG
  26. tar -czf \$BACKUP_PATH/home_backup.tar.gz /home 2>> \$BACKUP_LOG
  27. # 备份系统日志
  28. echo "备份系统日志..." >> \$BACKUP_LOG
  29. journalctl > \$BACKUP_PATH/journal.log 2>> \$BACKUP_LOG
  30. # 备份crontab
  31. echo "备份crontab..." >> \$BACKUP_LOG
  32. crontab -l > \$BACKUP_PATH/crontab_backup.txt 2>> \$BACKUP_LOG
  33. # 创建系统还原脚本
  34. cat <<EOT > \$BACKUP_PATH/system_restore.sh
  35. #!/bin/bash
  36. # 系统还原脚本 - \$(date)
  37. BACKUP_PATH="\$(dirname "\$0")"
  38. RESTORE_LOG="/var/log/system_restore_\$(date +%Y%m%d_%H%M%S).log"
  39. echo "系统还原开始 - \$(date)" > \$RESTORE_LOG
  40. echo "备份路径: \$BACKUP_PATH" >> \$RESTORE_LOG
  41. # 检查备份完整性
  42. echo "检查备份完整性..." >> \$RESTORE_LOG
  43. if [ ! -f "\$BACKUP_PATH/etc_backup.tar.gz" ]; then
  44.     echo "错误: 系统配置备份文件不存在" >> \$RESTORE_LOG
  45.     exit 1
  46. fi
  47. if [ ! -f "\$BACKUP_PATH/home_backup.tar.gz" ]; then
  48.     echo "错误: 用户数据备份文件不存在" >> \$RESTORE_LOG
  49.     exit 1
  50. fi
  51. # 恢复系统配置
  52. echo "恢复系统配置..." >> \$RESTORE_LOG
  53. tar -xzf \$BACKUP_PATH/etc_backup.tar.gz -C / >> \$RESTORE_LOG 2>&1
  54. # 恢复用户数据
  55. echo "恢复用户数据..." >> \$RESTORE_LOG
  56. tar -xzf \$BACKUP_PATH/home_backup.tar.gz -C / >> \$RESTORE_LOG 2>&1
  57. # 重新安装软件包
  58. echo "重新安装软件包..." >> \$RESTORE_LOG
  59. pacman -S --needed - < \$BACKUP_PATH/pacman_packages.txt >> \$RESTORE_LOG 2>&1
  60. # 重新启用系统服务
  61. echo "重新启用系统服务..." >> \$RESTORE_LOG
  62. while read service state; do
  63.     if [ "\$state" = "enabled" ]; then
  64.         systemctl enable \$service >> \$RESTORE_LOG 2>&1
  65.     fi
  66. done < <(awk '{print \$1, \$2}' \$BACKUP_PATH/systemd_services.txt)
  67. # 恢复crontab
  68. echo "恢复crontab..." >> \$RESTORE_LOG
  69. if [ -f "\$BACKUP_PATH/crontab_backup.txt" ]; then
  70.     crontab \$BACKUP_PATH/crontab_backup.txt >> \$RESTORE_LOG 2>&1
  71. fi
  72. # 重新生成initramfs
  73. echo "重新生成initramfs..." >> \$RESTORE_LOG
  74. mkinitcpio -P >> \$RESTORE_LOG 2>&1
  75. echo "系统还原完成 - \$(date)" >> \$RESTORE_LOG
  76. echo "还原日志保存在: \$RESTORE_LOG"
  77. # 询问是否重启
  78. read -p "是否现在重启系统? (y/n): " choice
  79. if [ "\$choice" = "y" ] || [ "\$choice" = "Y" ]; then
  80.     echo "重启系统..."
  81.     reboot
  82. else
  83.     echo "还原完成,但系统未重启。"
  84. fi
  85. EOT
  86. chmod +x \$BACKUP_PATH/system_restore.sh
  87. # 压缩备份
  88. echo "压缩备份..." >> \$BACKUP_LOG
  89. cd \$BACKUP_DIR
  90. tar -czf \$BACKUP_NAME.tar.gz \$BACKUP_NAME >> \$BACKUP_LOG 2>&1
  91. rm -rf \$BACKUP_NAME
  92. # 清理旧备份(保留最近5个)
  93. echo "清理旧备份..." >> \$BACKUP_LOG
  94. ls -t \$BACKUP_DIR/system_backup_*.tar.gz | tail -n +6 | xargs rm -f >> \$BACKUP_LOG 2>&1
  95. echo "备份完成 - \$(date)" >> \$BACKUP_LOG
  96. echo "备份文件: \$BACKUP_DIR/\$BACKUP_NAME.tar.gz"
  97. echo "备份日志: \$BACKUP_LOG"
  98. EOF
  99. chmod +x /usr/local/bin/system_backup
  100. # 创建系统备份定时任务
  101. cat <<EOF > /etc/systemd/system/system-backup.service
  102. [Unit]
  103. Description=System Backup
  104. [Service]
  105. Type=oneshot
  106. ExecStart=/usr/local/bin/system_backup
  107. [Install]
  108. WantedBy=multi-user.target
  109. EOF
  110. cat <<EOF > /etc/systemd/system/system-backup.timer
  111. [Unit]
  112. Description=System Backup Timer
  113. [Timer]
  114. OnCalendar=weekly
  115. Persistent=true
  116. [Install]
  117. WantedBy=timers.target
  118. EOF
  119. # 启用并启动系统备份定时任务
  120. systemctl enable --now system-backup.timer
  121. # 创建远程备份脚本(需要配置SSH密钥)
  122. cat <<EOF > /usr/local/bin/remote_backup
  123. #!/bin/bash
  124. # 配置远程备份参数
  125. REMOTE_USER="backup"
  126. REMOTE_HOST="backup.example.com"
  127. REMOTE_DIR="/backups"
  128. BACKUP_NAME="system_backup_\$(date +%Y%m%d_%H%M%S).tar.gz"
  129. LOCAL_BACKUP="/mnt/backup/\$BACKUP_NAME"
  130. # 创建本地备份
  131. /usr/local/bin/system_backup
  132. # 传输备份到远程服务器
  133. echo "传输备份到远程服务器..."
  134. scp \$LOCAL_BACKUP \$REMOTE_USER@\$REMOTE_HOST:\$REMOTE_DIR/
  135. # 清理本地备份
  136. rm -f \$LOCAL_BACKUP
  137. echo "远程备份完成: \$REMOTE_USER@\$REMOTE_HOST:\$REMOTE_DIR/\$BACKUP_NAME"
  138. EOF
  139. chmod +x /usr/local/bin/remote_backup
  140. # 创建远程备份定时任务
  141. cat <<EOF > /etc/systemd/system/remote-backup.service
  142. [Unit]
  143. Description=Remote Backup
  144. [Service]
  145. Type=oneshot
  146. ExecStart=/usr/local/bin/remote_backup
  147. [Install]
  148. WantedBy=multi-user.target
  149. EOF
  150. cat <<EOF > /etc/systemd/system/remote-backup.timer
  151. [Unit]
  152. Description=Remote Backup Timer
  153. [Timer]
  154. OnCalendar=monthly
  155. Persistent=true
  156. [Install]
  157. WantedBy=timers.target
  158. EOF
  159. # 启用并启动远程备份定时任务
  160. systemctl enable --now remote-backup.timer
复制代码

6. 总结与展望

Arch Linux ARM作为一个轻量级、高度可定制的Linux发行版,在树莓派物联网项目中展现出了巨大的潜力和优势。通过本文的探讨,我们了解了Arch Linux ARM在树莓派上的安装与配置方法,以及在家庭自动化、环境监测和网络监控等物联网项目中的实际应用案例。同时,我们还探讨了系统安全加固、自动化部署、资源管理和性能优化等部署技巧,以及常见问题的解决方案和备份恢复策略。

Arch Linux ARM的主要优势在于其简洁性和灵活性,它允许开发者根据项目需求构建最小化的系统,只包含必要的组件,从而提高系统效率和安全性。其滚动更新模式确保了系统始终保持最新状态,获得最新的功能和安全补丁。此外,Arch Linux ARM强大的包管理系统和活跃的社区支持也为物联网项目的开发和维护提供了便利。

然而,Arch Linux ARM也有一些挑战需要注意。由于其滚动更新模式,系统可能会偶尔出现不稳定的情况,需要开发者具备一定的Linux系统管理能力。此外,相比其他树莓派操作系统,Arch Linux ARM的初始配置相对复杂,需要更多的手动设置。

展望未来,随着物联网技术的不断发展和树莓派等嵌入式设备性能的提升,Arch Linux ARM在物联网项目中的应用前景将更加广阔。我们可以期待以下几个方面的发展:

1. 更好的物联网支持:随着物联网设备的普及,Arch Linux ARM可能会提供更多针对物联网场景的优化和预配置选项,简化部署流程。
2. 增强的安全性:随着物联网安全问题的日益突出,Arch Linux ARM可能会集成更多安全功能,如默认加密、安全启动和更强的访问控制。
3. 边缘计算支持:随着边缘计算的兴起,Arch Linux ARM可能会提供更多边缘计算框架和工具的支持,使其成为边缘计算节点的理想选择。
4. 容器化支持:随着容器技术在物联网中的应用,Arch Linux ARM可能会提供更好的容器化支持,如轻量级容器运行时和编排工具。
5. 低功耗优化:随着对能源效率的重视,Arch Linux ARM可能会提供更多低功耗优化选项,延长电池供电的物联网设备的运行时间。

更好的物联网支持:随着物联网设备的普及,Arch Linux ARM可能会提供更多针对物联网场景的优化和预配置选项,简化部署流程。

增强的安全性:随着物联网安全问题的日益突出,Arch Linux ARM可能会集成更多安全功能,如默认加密、安全启动和更强的访问控制。

边缘计算支持:随着边缘计算的兴起,Arch Linux ARM可能会提供更多边缘计算框架和工具的支持,使其成为边缘计算节点的理想选择。

容器化支持:随着容器技术在物联网中的应用,Arch Linux ARM可能会提供更好的容器化支持,如轻量级容器运行时和编排工具。

低功耗优化:随着对能源效率的重视,Arch Linux ARM可能会提供更多低功耗优化选项,延长电池供电的物联网设备的运行时间。

总之,Arch Linux ARM作为一个强大而灵活的操作系统,为树莓派物联网项目提供了一个优秀的平台。通过掌握其部署技巧和最佳实践,开发者可以构建高效、安全、可靠的物联网解决方案,充分发挥树莓派的潜力。随着技术的不断发展,Arch Linux ARM在物联网领域的应用将更加广泛和深入。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则