Tech-Roy Blog

技術分享 技術無界 開源至上

前期准备

  • 用泡泡龙电玩版Hekate
  • 用LineageOS的安卓TV15版本固件
  • 确保SD卡格式化为FAT32或exFAT
  • 确保Hekate版本大于等于6.0.3

MindTheGapps 简介

  • Download MindTheGapps: Custom Google Apps Package for Android
  • Why Choose MindTheGapps?
  • How to Install MindTheGapps

安装Gapps(安卓TV14系统内部没有)

  1. 确认Android TV系统已安装但尚未首次启动.
    1. 你提到已经“安装好了 Android TV 14 系统并进入过一次”,这属于已首次启动系统的状态。此时直接安装GApps会很可能引发系统崩溃。因此,需要先重置数据,再安装GApps。
  2. 启动到Recovery并执行Data清空。
    1. 长按 音量上 + 启动 Hekate → More Configs → 持 Volume Up 选 LineageOS Recovery,进入恢复模式。
    2. 在 Recovery 菜单中执行 Factory Reset → Format data / factory reset,清除 Android 的 data 和 cache 分区(不会影响 HOS 或 Switch 原系统)

    3. 下载合适的GApps包
      1. 根据你的系统版本(LineageOS 21 – Android 14)和架构(Switch v1 是 ARM64),选择对应的 GApps 包。对于 Android TV,推荐使用适配 TV 的包类型(如 MindTheGapps 或 OpenGApps TV stock)
      2. 下载这个包 → MindTheGapps-14.0.0-arm64-ATV-full-20240523_192016.zip

      3. 下载官网
    4. 通过Choose from SWITCH SD安装GApps
      1. 在Recovery中点击Apply Update → Choose from SWITCH SD


      2. 当看到“Signature verification failed”提示时选择“Yes”继续安装(这是正常情况)
    5. 回到Recovery主界面并重启
      1. 安装完毕后,选择Recovery中的“Back”或返回箭头,然后点击Reboot system now,系统将进入首次带GApps的Android TV
    6. 总结

Magisk

Youtube教学参考

References

简介

  • For Windows
    • 这是一个专门为Windows操作系统设计的系统信息收集脚本,使用Bash脚本编写。它能够在Windows的命令行环境(包括Git Bash、Cygwin、WSL等)中运行,通过调用Windows原生命令和工具来获取详细的系统配置信息。
  • For Linux
    • 这是一个专为Linux和macOS系统设计的系统信息收集脚本,同样使用Bash编写。它充分利用Linux系统的特性(如/proc文件系统、标准命令行工具)来获取详细的系统信息。

目的

  • For Windows
    • 快速诊断系统配置:帮助用户和IT管理员快速了解Windows主机的硬件和软件配置
    • 系统信息存档:在系统部署、故障排查或升级前记录系统状态
    • 远程技术支持:通过运行脚本获取详细信息,便于远程技术支持分析问题
    • 系统健康检查:监控关键系统指标,如内存使用、磁盘空间、CPU负载等
    • 网络配置分析:显示内外网IP地址、网络接口配置和地理位置信息
  • For Linux
    • 全面系统概览:提供从硬件到软件的完整系统快照
    • 性能监控基线:建立系统性能基准,用于后续的性能监控和调优
    • 服务器状态检查:适用于服务器管理和监控,特别关注运行时间和负载
    • 故障排除工具:为系统故障和性能问题提供诊断信息
    • 兼容性验证:检查系统是否满足特定软件或应用的运行要求

适用场景

  • For Windows
    • IT管理员进行系统审计和资产管理
    • 技术支持人员收集客户系统信息进行故障分析
    • 开发人员确认开发环境的硬件配置
    • 系统迁移或升级前的兼容性检查
    • 安全审计和合规性检查
  • For Linux
    • 服务器管理和监控
    • 云主机配置验证
    • 容器化环境的基础镜像检查
    • 分布式系统部署前的环境检查
    • 系统性能调优和容量规划
    • 安全加固和合规性审计

两个脚本的共同特点

  • 技术特点
    • 跨平台兼容性:虽然各自针对不同平台,但都使用标准的Bash语法
    • 无需安装:依赖系统内置命令,不需要额外安装软件包
    • 颜色化输出:使用绿色文本提高可读性
    • 模块化信息:信息按类别分组显示,结构清晰
    • 错误处理:对命令失败的情况有适当处理
  • 信息收集范围
    • 基本信息:主机名、用户名、操作系统版本
    • 硬件信息:CPU型号、内存大小、磁盘配置
    • 网络信息:IP地址(公网/内网)、网络接口、地理位置
    • 系统状态:运行时间、启动时间、时区
    • 存储信息:磁盘分区、挂载点、使用情况
  • 使用价值
    • 效率提升:自动化收集信息,避免手动检查每个项目
    • 标准化输出:提供一致的输出格式,便于比较和分析
    • 历史记录:可保存输出结果作为系统变更的参考
    • 可扩展性:可根据需要轻松添加新的信息收集功能
    • 教育和学习:帮助用户了解系统结构和配置

效果图

  • For Windows
  • For Linux


适用于Windows版本脚本

  • 获取Win本机系统信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/bin/bash

# Windows 主机系统信息收集脚本
# 颜色设置
echo -e "\e[32m"

echo "=== Windows主机系统信息 ==="

# 主机名和用户名
echo "主机名: $(hostname)"
echo "用户名: ${USERNAME:-$USER}"

# 网络地址信息
echo "=== 网络地址信息 ==="

# 公网IP
if command -v curl &>/dev/null; then
public_ip=$(curl -s --max-time 5 ifconfig.me 2>/dev/null || curl -s --max-time 5 ipinfo.io/ip 2>/dev/null || echo "无法获取")
else
public_ip="无法获取 (curl未安装)"
fi
echo "公网IP地址: $public_ip"

# IP地理位置
if command -v curl &>/dev/null && [[ "$public_ip" != "无法获取" && "$public_ip" != "无法获取 (curl未安装)" ]]; then
echo -n "IP地理位置: "
location=$(curl -s --max-time 3 "ipinfo.io/$public_ip/json" 2>/dev/null | grep -E '"city"|"region"|"country"' | \
sed 's/.*: "//;s/",//' | tr '\n' ' ' | sed 's/ $//')
[[ -n "$location" ]] && echo "$location" || echo "未知"
else
echo "IP地理位置: 需要网络连接"
fi

# 内网IP地址
echo "内网IP地址:"
ipconfig 2>/dev/null | grep -E "(IPv4|IP.v4)" | grep -v "169.254." | while read line; do
interface=$(echo "$line" | cut -d' ' -f1 | tr -d ':')
ip=$(echo "$line" | cut -d: -f2 | sed 's/^[ \t]*//')
[[ -n "$ip" ]] && echo " $interface: $ip"
done

# 系统详细信息
echo "=== 系统详细信息 ==="

if command -v systeminfo &>/dev/null; then
sysinfo=$(systeminfo 2>/dev/null)

# 操作系统版本
os_version=$(echo "$sysinfo" | grep "OS Name" | head -1 | cut -d: -f2 | sed 's/^[ \t]*//')
echo "操作系统版本: $os_version"

echo "内核版本: $(uname -r)"

# 启动设备
boot_device=$(echo "$sysinfo" | grep -i "Boot Device" | head -1 | cut -d: -f2- | sed 's/^[ \t]*//')
[[ -n "$boot_device" ]] && echo "启动设备: $boot_device"

# 时区
time_zone=$(echo "$sysinfo" | grep -i "Time Zone" | head -1 | cut -d: -f2- | sed 's/^[ \t]*//')
[[ -n "$time_zone" ]] && echo "时区: $time_zone"

# 系统运行时间
boot_time=$(echo "$sysinfo" | grep -i "System Boot Time" | head -1 | cut -d: -f2- | sed 's/^[ \t]*//')
if [[ -n "$boot_time" ]]; then
echo "系统启动时间: $boot_time"

# 计算运行时间
boot_date=$(date -d "$boot_time" "+%s" 2>/dev/null || echo "")
if [[ -n "$boot_date" ]]; then
current_date=$(date "+%s")
uptime_seconds=$((current_date - boot_date))
days=$((uptime_seconds / 86400))
hours=$(( (uptime_seconds % 86400) / 3600 ))
minutes=$(( (uptime_seconds % 3600) / 60 ))
echo "系统运行时间: ${days}天 ${hours}小时 ${minutes}分钟"
fi
fi
else
echo "操作系统版本: 无法获取 (systeminfo未找到)"
echo "内核版本: $(uname -r)"
fi

# CPU信息
echo "=== CPU信息 ==="

if command -v wmic &>/dev/null; then
cpu_info=$(wmic cpu get name 2>/dev/null | tail -2 | head -1 | sed 's/^[ \t]*//;s/[ \t]*$//')
[[ -n "$cpu_info" && ! "$cpu_info" =~ "Name" ]] && echo "CPU型号: $cpu_info" || echo "CPU型号: 无法获取"
else
echo "CPU型号: 无法获取 (wmic未找到)"
fi

# 内存信息
echo "=== 内存信息 ==="

if command -v wmic &>/dev/null; then
memory_bytes=$(wmic computersystem get TotalPhysicalMemory 2>/dev/null | grep '[0-9]' | awk '{print $1}')
if [[ -n "$memory_bytes" ]]; then
memory_gb=$(echo "$memory_bytes" | awk '{printf "%.2f", $1/1024/1024/1024}')
echo "内存大小: ${memory_gb}GB"

# 获取可用内存
free_bytes=$(wmic OS get FreePhysicalMemory 2>/dev/null | grep '[0-9]' | awk '{print $1 * 1024}')
if [[ -n "$free_bytes" ]]; then
free_gb=$(echo "$free_bytes" | awk '{printf "%.2f", $1/1024/1024/1024}')
used_gb=$(echo "$memory_bytes $free_bytes" | awk '{printf "%.2f", ($1-$2)/1024/1024/1024}')
echo "内存使用: 已用 ${used_gb}GB / 可用 ${free_gb}GB"
fi
else
echo "内存大小: 无法获取"
fi
else
echo "内存大小: 无法获取 (wmic未找到)"
fi

# 磁盘信息
echo "=== 磁盘分区信息 ==="

echo "逻辑磁盘信息:"
if command -v wmic &>/dev/null; then
wmic logicaldisk where "drivetype=3" get deviceid,size,freespace,volumename /format:list 2>/dev/null | \
tr -d '\r' | awk -F'=' '
/DeviceID/ {drive=$2}
/Size/ {size=$2/1024/1024/1024}
/FreeSpace/ {free=$2/1024/1024/1024; used=size-free}
/VolumeName/ {volumename=$2}
/^$/ && drive {
if (volumename == "") volumename="本地磁盘";
printf " %s (%s): 总大小=%.2fGB, 已用=%.2fGB, 可用=%.2fGB\n",
drive, volumename, size, used, free;
drive=""; volumename=""
}
'
else
echo " WMIC命令不可用"
fi

# 使用DF命令查看挂载点(备选方法)
if command -v df &>/dev/null; then
echo -e "\n使用DF命令查看挂载点:"
df -h 2>/dev/null | grep -E "^[A-Z]:" | while read line; do
echo " $line" | awk '{
printf " %s: 总大小=%s, 已用=%s, 可用=%s, 使用率=%s",
$1, $2, $3, $4, $5;
if (NF > 5) {
printf ", 挂载点=";
for(i=6;i<=NF;i++) printf "%s ", $i;
}
print ""
}'
done
fi

echo -e "\n=== 物理磁盘信息 ==="
if command -v wmic &>/dev/null; then
wmic diskdrive get model,size /format:list 2>/dev/null | \
tr -d '\r' | awk -F'=' '
/Model/ {model=$2}
/Size/ {size=$2/1024/1024/1024; printf " %s: %.2fGB\n", model, size}
' | head -10
else
echo " WMIC命令不可用"
fi

# 用户信息
echo -e "\n=== 当前登录用户 ==="
echo " 当前用户: ${USERNAME:-$USER}"

echo -e "\e[0m"

适用于Linux版本脚本

  • 获取Linux本机系统信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#!/bin/bash

# Linux/macOS 主机系统信息收集脚本
# 颜色设置
echo -e "\e[32m"

# 检测是Linux还是macOS
if [[ "$(uname)" == "Darwin" ]]; then
OS_TYPE="macOS"
else
OS_TYPE="Linux"
fi

echo "=== ${OS_TYPE}主机系统信息 ==="

# 主机名和用户名
echo "主机名: $(hostname)"
echo "用户名: $USER"

# 网络地址信息
echo "=== 网络地址信息 ==="

# 公网IP
if command -v curl &>/dev/null; then
public_ip=$(curl -s --max-time 5 ifconfig.me 2>/dev/null || curl -s --max-time 5 ipinfo.io/ip 2>/dev/null || echo "无法获取")
else
public_ip="无法获取 (curl未安装)"
fi
echo "公网IP地址: $public_ip"

# IP地理位置
if command -v curl &>/dev/null && [[ "$public_ip" != "无法获取" && "$public_ip" != "无法获取 (curl未安装)" ]]; then
echo -n "IP地理位置: "
location=$(curl -s --max-time 3 "ipinfo.io/$public_ip/json" 2>/dev/null | grep -E '"city"|"region"|"country"' | \
sed 's/.*: "//;s/",//' | tr '\n' ' ' | sed 's/ $//')
[[ -n "$location" ]] && echo "$location" || echo "未知"
else
echo "IP地理位置: 需要网络连接"
fi

# 内网IP地址
echo "内网IP地址:"
if command -v ip &>/dev/null; then
ip -4 addr show 2>/dev/null | grep -v "127.0.0.1" | grep inet | awk '{print " "$NF": "$2}'
elif command -v ifconfig &>/dev/null; then
ifconfig 2>/dev/null | grep -E "inet " | grep -v "127.0.0.1" | awk '{print " "$1": "$2}'
else
echo " 无法获取网络接口信息"
fi

# 系统详细信息
echo "=== 系统详细信息 ==="

if [[ "$OS_TYPE" == "macOS" ]]; then
echo "操作系统: macOS $(sw_vers -productVersion 2>/dev/null || echo '未知')"
elif [[ -f /etc/os-release ]]; then
source /etc/os-release
echo "操作系统: $NAME $VERSION"
else
echo "操作系统: 无法确定"
fi

echo "内核版本: $(uname -r)"
echo "系统架构: $(uname -m)"

# 系统运行时间
echo "=== 系统运行时间 ==="

if [[ "$OS_TYPE" == "macOS" ]]; then
# macOS获取运行时间
if command -v sysctl &>/dev/null; then
boot_time=$(sysctl -n kern.boottime 2>/dev/null | awk '{print $4}' | sed 's/,//')
if [[ -n "$boot_time" ]]; then
current_time=$(date +%s)
uptime_seconds=$((current_time - boot_time))
days=$((uptime_seconds / 86400))
hours=$(( (uptime_seconds % 86400) / 3600 ))
minutes=$(( (uptime_seconds % 3600) / 60 ))
seconds=$((uptime_seconds % 60))

echo "系统运行时间: ${days}天 ${hours}小时 ${minutes}分钟 ${seconds}秒"

# 显示启动时间
boot_date=$(date -r $boot_time "+%Y-%m-%d %H:%M:%S" 2>/dev/null)
[[ -n "$boot_date" ]] && echo "系统启动时间: $boot_date"
else
echo "系统运行时间: 无法获取"
fi
else
echo "系统运行时间: 无法获取 (sysctl命令不可用)"
fi
else
# Linux获取运行时间
if [[ -f /proc/uptime ]]; then
uptime_seconds=$(awk '{print $1}' /proc/uptime 2>/dev/null)
if [[ -n "$uptime_seconds" ]]; then
days=$((uptime_seconds / 86400))
hours=$(( (uptime_seconds % 86400) / 3600 ))
minutes=$(( (uptime_seconds % 3600) / 60 ))
seconds=$((uptime_seconds % 60))
echo "系统运行时间: ${days}天 ${hours}小时 ${minutes}分钟 ${seconds}秒"

# 显示启动时间
current_time=$(date +%s)
boot_time=$((current_time - ${uptime_seconds%.*}))
boot_date=$(date -d "@$boot_time" "+%Y-%m-%d %H:%M:%S" 2>/dev/null)
[[ -n "$boot_date" ]] && echo "系统启动时间: $boot_date"
else
echo "系统运行时间: 无法获取"
fi
else
echo "系统运行时间: 无法获取 (/proc/uptime不存在)"
fi
fi

# 显示uptime命令的输出作为补充
if command -v uptime &>/dev/null; then
echo -n "uptime命令输出: "
uptime_output=$(uptime 2>/dev/null)
[[ -n "$uptime_output" ]] && echo "$uptime_output" || echo "无法获取"
fi

# 时区信息
echo "=== 时区信息 ==="

if [[ -f /etc/timezone ]]; then
echo "时区: $(cat /etc/timezone)"
elif command -v timedatectl &>/dev/null; then
timezone=$(timedatectl show --property=Timezone --value 2>/dev/null)
[[ -n "$timezone" ]] && echo "时区: $timezone"
elif [[ -f /etc/localtime ]]; then
# 尝试从/etc/localtime推断时区
if [[ "$OS_TYPE" == "Linux" ]]; then
timezone_link=$(readlink /etc/localtime 2>/dev/null)
if [[ -n "$timezone_link" ]]; then
timezone=$(echo "$timezone_link" | sed 's|.*/zoneinfo/||')
echo "时区: $timezone"
fi
fi
fi

# 显示当前时间
echo "当前时间: $(date '+%Y-%m-%d %H:%M:%S')"

# CPU信息
echo "=== CPU信息 ==="

if [[ "$OS_TYPE" == "macOS" ]]; then
cpu_info=$(sysctl -n machdep.cpu.brand_string 2>/dev/null || echo "未知")
echo "CPU型号: $cpu_info"
echo "CPU核心数: $(sysctl -n hw.ncpu 2>/dev/null || echo "未知")"
elif [[ -f /proc/cpuinfo ]]; then
cpu_model=$(grep -m1 "model name" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed 's/^[ \t]*//')
cpu_cores=$(grep -c "^processor" /proc/cpuinfo 2>/dev/null || echo "未知")
echo "CPU型号: ${cpu_model:-未知}"
echo "CPU核心数: $cpu_cores"

# 显示CPU频率(如果可用)
cpu_mhz=$(grep -m1 "cpu MHz" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed 's/^[ \t]*//')
[[ -n "$cpu_mhz" ]] && echo "CPU频率: ${cpu_mhz} MHz"
else
echo "CPU型号: 无法获取"
fi

# 内存信息
echo "=== 内存信息 ==="

if [[ "$OS_TYPE" == "macOS" ]]; then
memory_bytes=$(sysctl -n hw.memsize 2>/dev/null)
if [[ -n "$memory_bytes" ]]; then
memory_gb=$(echo "$memory_bytes" | awk '{printf "%.2f", $1/1024/1024/1024}')
echo "内存大小: ${memory_gb}GB"
fi
elif [[ -f /proc/meminfo ]]; then
total_memory=$(grep -m1 "MemTotal" /proc/meminfo 2>/dev/null | awk '{print $2}')
if [[ -n "$total_memory" ]]; then
memory_gb=$(echo "$total_memory" | awk '{printf "%.2f", $1/1024/1024}')
echo "内存大小: ${memory_gb}GB"

free_memory=$(grep "MemAvailable" /proc/meminfo 2>/dev/null | awk '{print $2}')
if [[ -n "$free_memory" ]]; then
free_gb=$(echo "$free_memory" | awk '{printf "%.2f", $1/1024/1024}')
used_gb=$(echo "$total_memory $free_memory" | awk '{printf "%.2f", ($1-$2)/1024/1024}')
use_percent=$(echo "$total_memory $free_memory" | awk '{printf "%.1f", 100-($2*100/$1)}')
echo "内存使用: 已用 ${used_gb}GB / 可用 ${free_gb}GB (使用率: ${use_percent}%)"
fi
fi
else
echo "内存大小: 无法获取"
fi

# 磁盘信息
echo "=== 磁盘分区信息 ==="

echo "磁盘使用情况:"
if command -v df &>/dev/null; then
df -h 2>/dev/null | grep -E "^/dev/" | while read line; do
echo " $line" | awk '{
printf " %s: 总大小=%s, 已用=%s, 可用=%s, 使用率=%s, 挂载点=",
$1, $2, $3, $4, $5;
for(i=6;i<=NF;i++) printf "%s ", $i;
print ""
}'
done
else
echo " df命令不可用"
fi

echo -e "\n=== 物理磁盘信息 ==="

if [[ "$OS_TYPE" == "macOS" ]]; then
if command -v diskutil &>/dev/null; then
diskutil list 2>/dev/null | grep -A5 "/dev/disk" | while read line; do
if [[ "$line" =~ /dev/disk ]]; then
echo " $line"
fi
done
else
echo " diskutil命令不可用"
fi
elif command -v lsblk &>/dev/null; then
lsblk -d -o NAME,SIZE,TYPE,MODEL 2>/dev/null | grep disk | head -5
elif [[ -f /proc/partitions ]]; then
cat /proc/partitions 2>/dev/null | grep -v "major" | grep -E "^[[:space:]]*[0-9]" | awk '{print $4, $3}' | while read name size; do
if [[ "$name" =~ ^[hs]d[a-z]$ ]] || [[ "$name" =~ ^nvme ]]; then
size_gb=$(echo "$size" | awk '{printf "%.2f", $1/1024/1024}')
echo " $name: ${size_gb}GB"
fi
done
fi

# 用户信息
echo -e "\n=== 当前登录用户 ==="
echo " 当前用户: $USER"
if command -v who &>/dev/null; then
users=$(who 2>/dev/null | awk '{print $1}' | sort | uniq)
user_count=$(echo "$users" | wc -w 2>/dev/null)
[[ "$user_count" -gt 1 ]] && echo " 其他登录用户: $(echo "$users" | tr '\n' ' ')"

# 显示登录终端和登录时间
echo -e "\n 登录会话详情:"
who 2>/dev/null | head -5 | while read line; do
echo " $line"
done
fi

# 系统负载信息
echo -e "\n=== 系统负载信息 ==="
if [[ -f /proc/loadavg ]]; then
load=$(cat /proc/loadavg 2>/dev/null)
[[ -n "$load" ]] && echo " 系统负载: $load" || echo " 系统负载: 无法获取"
elif command -v sysctl &>/dev/null && [[ "$OS_TYPE" == "macOS" ]]; then
load=$(sysctl -n vm.loadavg 2>/dev/null)
[[ -n "$load" ]] && echo " 系统负载: $load" || echo " 系统负载: 无法获取"
fi

echo -e "\e[0m"

简单介绍

旁路由架构是:主路由依旧负责拨号和DHCP,而树莓派作为旁路由接入同一网段,通过静态IP和自定义路由规则,让家里的设备可以选择是否把流量交由树莓派处理。这种模式不会破坏原有网络结构,也能随时拔掉。

目的

在Docker中运行OpenWrt旁路网关(透明网关)

  • 结构图如下

开启网卡的混杂模式

  • 是为了让我们的虚拟机和宿主机能同时接收数据包
  • 以下二选一选择执行
    • 插线形式,请执行:
    1
    sudo ip link set dev eth0 promisc on
    • WIFI形式,请执行:
    1
    sudo ip link set dev wlan0 promisc on

下载OpenWrt镜像

  • 在终端界面执行以下命令,下载镜像文件
    1
    docker pull buddyfly/openwrt-aarch64


  • 下载完后,可选择查看镜像是否在docker镜像里,执行以下命令
    1
    docker images

检查是否存在Docker虚拟网络(macnet)

  • 第一次执行之前,一般情况是没有的,不过我们还是要执行看看先
  • 查看所有网络列表
    1
    docker network ls
  • 如果出现重名,可执行下面命令用来删除已存在的同名网络
    1
    docker network rm `填写NAME`

创建Docker虚拟网络

  • 虚拟网络名称为macnet,驱动为macvlan模式,将subnet 10.10.10.0修改为你自己主路由的网段,gateway 10.10.10.1修改为你自己的主路由网关。
  • 图中的示范命令如下
    1
    docker network create -d macvlan --subnet=10.10.10.0/24 --gateway=10.10.10.1 -o parent=eth0 macnet
  • 以下二选一选择执行(以我自己的为例)
    • 插线形式,请执行:
    1
    docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macnet
    • WIFI形式,请执行:
    1
    docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=wlan0 macnet

如果不清楚自己的主路由器网关地址和网段,那就请看下面这一章节。

如何查看主路由器的网关地址和网段(Windows)

  • 通过路由器管理界面(通用方法)

  • 通过命令行形式查看
    • 按win键 + R键
    • 输入 cmd
    • 在命令行输入 ipconfig

验证【Docker虚拟网络】是否创建成功

  • 输入命令 docker network ls

启动OpenWrt容器

  • 执行下面命令
    1
    docker run --restart always -d --network macnet --privileged buddyfly/openwrt-aarch64:latest

查看运行中的OpenWrt容器

  • 执行下面命令
    1
    docker ps -a | grep openwrt

修改OpenWrt容器的IP地址

  • 进入容器内部
    1
    docker exec -it a94607d8119f ash


  • 编辑网卡文本
    1
    sudo nano /etc/config/network
  • 修改文件如下,将 option ipaddr '192.168.0.252' 改为你想作为旁路由网关的空闲地址(我的网段为 192.168.0.X),主路由IPV4地址改为你自己的即可。
    1
    2
    3
    option ipaddr '192.168.0.252'  # 252这是我自定义的
    option gateway '192.168.0.1' # 这是我的主路由IPV4地址
    option dns '192.168.0.1' # 保持和gateway一致
  • 重启容器网卡
    1
    /etc/init.d/network restart

校验【修改OpenWrt容器的IP地址】修改是否成功

  • 现在我们可以call下外部的主路由IP,试试连通性。
    1
    ping 192.168.0.1   # 换成你自己的

    显示和我的截图一样,收到数据包就可以了。

永久开启网卡混杂模式

  • 先退出docker容器,然后再去宿主机里进行下面操作
  • 先执行 sudo nano /etc/network/interfaces
  • 添加内容
    1
    2
    up ip link set eth0 promisc on    # 插线形式用这个
    up ip link set wlan0 promisc on # WIFI形式用这个
  • 添加内容后,按 ESC 并输入 :wq 正常保存
  • 用cat命令查看是否已写入 cat /etc/network/interfaces
  • 如果文件权限有问题,那执行下面操作
    1
    2
    ls -l /etc/network/interfaces
    sudo chmod 644 /etc/network/interfaces

登录树莓派旁路由网关系统(旁路网关配置)

  • 网址输入
    1
    http://192.168.0.252    # 改为你自己设置的
  • 初始用户名 root 密码 password
  • 先做最重要的事情:改密码。

更改系统主题

更改上级路由





网络加速设置



科学上网






配置旁路网关

  • 把局域网内需要连接的设备的WiFi改为手动配置
  • 然后IP地址改为192.168.0.XXX改为你愿意的地址
  • 子网掩码改为255.255.255.0
  • 路由器(网关)改为192.168.0.254,这个其实是OpenWrt的IPv4地址
  • DNS服务器改为192.168.0.254,同OpenWrt的IPv4地址

验证网关是否生效(树莓派验证)

  • ip route show
  • ping 8.8.8.8
  • curl -Iv https://www.youtube.com --connect-timeout 10
  • curl -Iv https://www.google.com --connect-timeout 10

简单介绍

在树莓派上折腾一个面板,像是在一台小小的飞船里加装一套“宇宙驾驶舱”。1Panel 本来面向 x86,但它已经提供了 arm64 的版本,正好吻合树莓派 4B 的架构,所以你完全可以在你的 Pi 上跑起来,让它像台袖珍服务器一样管理得井井有条。

准备工作

  1. 硬件要求
    • 树莓派4B(2GB或以上内存推荐)
    • MicroSD卡(至少16GB,建议Class 10或更高)
    • 电源适配器、网线或WiFi连接
  2. 安装Raspberry Pi OS
  3. 更新系统:通过SSH连接树莓派,运行
1
sudo apt update && sudo apt upgrade -y
  1. 安装Docker(1Panel必须依赖Docker)
1
2
3
sudo apt install curl -y
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER # 添加当前用户到docker组,重启生效

重启树莓派:sudo reboot

安装脚本

树莓派上装好Ubuntu/Debian,然后直接跑1Panel官方脚本。脚本会自动检测你当前系统的架构并下载对应版本。如果你现在系统是64位(树莓派OS默认有64位版)

  1. 运行一键安装脚本
1
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
  • 脚本会自动检测ARM架构(树莓派兼容),安装过程约5-10分钟。
  • 提示设置安装目录(默认为/opt)、端口(默认36230)、用户名/密码(推荐自定义强密码)。
  • 如果提示Docker未安装,它会自动引导修复。



  1. 安装完成提示
    • 会出现访问地址,如http://<树莓派IP>:36230

访问1Panel

  1. 获取树莓派IP
    • 树莓派终端运行hostname -I | awk '{print $1}'
  2. 浏览器访问
    • 在电脑的浏览器输入http://<树莓派IP>:端口号/随机入口(例如http://192.168.0.109:36230/roy)
    • 随机入口指的是面板安全入口,在安装过程中有设置此配置。

  3. 首次登录
    • 使用安装时设置的用户名/密码。

  4. 获取信息
    • 如果找不到自己的用户名、密码、入口,可以在终端运行下面的命令进行查看。
    1
    sudo 1pctl user-info

版本信息

常见问题与优化

  • ARM兼容:树莓派4B完美支持,但部分应用需ARM版镜像(1Panel会自动选择)。
  • 与CasaOS共存:安装在不同端口,不会干扰。CasaOS默认80端口,1Panel用自定义端口。
  • 卸载:运行sudo 1pctl uninstall
  • 更新:面板内自动检查,或终端sudo 1pctl update
  • 性能:树莓派4B运行流畅,但安装多应用时监控温度(加散热片)。
  • 防火墙:如果启用ufw,开放端口:sudo ufw allow 端口号
  • 端口冲突:如果默认端口被占,安装时指定其他端口,或修改/opt/1panel/config/config.yaml后,重启服务:sudo systemctl restart 1panel
  • 修改密码:修改密码可执行命令 sudo 1pctl update password

参考材料

简单介绍

CasaOS是一个开源的家庭云系统,基于Docker生态设计,专为家庭场景打造。它提供简洁的Web界面,支持一键安装NAS、媒体服务器、智能家居等应用,非常适合树莓派4B作为家庭服务器使用。CasaOS完全兼容Raspberry Pi OS(推荐使用64位版本),安装过程简单,只需几分钟。

准备工作

  1. 硬件要求
    • 树莓派4B(2GB或以上内存推荐)
    • MicroSD卡(至少16GB,建议Class 10或更高)
    • 电源适配器、网线或WiFi连接
  2. 安装Raspberry Pi OS

安装系统依赖(更新系统)

  • 使用SSH连接树莓派
    • (默认用户:pi,密码:raspberry)
  • 运行以下命令更新软件包
    1
    sudo apt update && sudo apt upgrade -y
  • 安装curl(如果未安装)
    1
    sudo apt install curl -y

运行CasaOS脚本

CasaOS支持一键安装脚本。打开终端,运行以下命令:

1
curl -fsSL https://get.casaos.io | sudo bash
  • 脚本会自动下载并安装CasaOS,包括Docker依赖。
  • 安装过程会提示设置CasaOS管理员用户名和密码(默认用户名:casaos,密码:casaos,可自定义)。
  • 安装完成后,CasaOS会自动启动。

备选命令(如果curl不可用)

1
wget -qO- https://get.casaos.io | sudo bash


访问CasaOS Web界面

  1. 查找IP地址
    • 在树莓派终端运行:hostname -I(获取本地IP,如192.168.x.x)
  2. 浏览器访问
    • 在同一网络的电脑/手机浏览器输入:http://<树莓派IP>:80(例如:http://192.168.0.109)
    • 登录CasaOS(使用刚才设置的用户名/密码)
    • 首次登录会引导设置,之后即可浏览应用商店,一键安装如Nextcloud、Plex、Home Assistant等应用。


卸载CasaOS(可选)

打开终端,运行以下命令:

1
curl -fsSL https://get.casaos.io/uninstall | sudo bash

常见问题与提示

  • 端口冲突:默认使用80端口,如果已占用(如Apache),可编辑CasaOS配置文件修改端口。
  • 性能优化:树莓派4B运行CasaOS流畅,但安装应用时监控CPU/内存使用。建议使用SSD外接存储以提升速度。
  • 更新CasaOS:在Web界面“设置”中检查更新,或终端运行casaos-ctl update
  • 防火墙:如果启用ufw,确保开放80端口:sudo ufw allow 80

创建.bashrc

1
touch /home/roy/.bashrc


P.S.: “roy”为用户名,请替换为您的用户名。

进入编辑模式

1
2
cd /home/roy/
sudo nano /home/roy/.bashrc

~./.bashrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 添加用户本地 bin 目录到 PATH
# Global Environment Variable
export PATH="$HOME/.local/bin:$PATH"

# Hexo
alias hexocgd="hexo clean && hexo generate && hexo deploy"
alias hexo4000="hexo clean && hexo generate && hexo server"

# Quickly Command
alias rmd="rm -rf"
#alias e="vim ~/.bashrc"
alias e="nano ~/.bashrc"
alias s="source ~/.bashrc"
alias c="clear"
alias la="ls -la"
alias ll="ls -lah --color=auto"
alias grep="grep --color=auto"
alias catbashrc="cat ~/.bashrc"
alias ipcheck="ip route get 8.8.8.8"
alias testgoogle="curl -Iv https://www.google.com --connect-timeout 10"
alias testyoutube="curl -Iv https://www.youtube.com --connect-timeout 10"
alias restartdhcpcd="sudo systemctl restart dhcpcd"
alias dockerrestart="sudo systemctl daemon-reload && sudo systemctl restart docker && sudo systemctl status docker"
alias wificheck="sudo nmcli dev wifi list"
alias editdhcpcdconfig="sudo nano /etc/dhcpcd.conf"
alias rpishutdown="sudo shutdown -h now"
alias rpireboot="sudo reboot"

# Docker command
alias dps='docker ps -a --format "table {{.Names}}\t{{.ID}}\t{{.Status}}\t{{.Image}}"'

# Quickly come to file address
alias ..="cd .."
alias ...="cd ../.."
alias ~="cd /home/roy"

# Functions
# Create a directory and immediately enter it
mkcd() {
mkdir -p "$1" && cd "$1"
}

使其生效

1
source /home/roy/.bashrc

查看文件是否创建

1
ls -la /home/roy/.bashrc

拥有文件所有权限

1
sudo chmod -R 777 /home/roy/.bashrc

前言

各位看官,此篇是DIY个人NAS的第一篇,首先我们来给树莓派单板机安装RPI OS,然后在此基础上,我们可以安装各种第三方应用来实现NAS的基础服务。

所需设备

  • 树莓派4B型号
  • TF内存卡64G
  • TF读卡器
  • 树莓派电源线
  • 网线
  • HDMI线
  • Mini HDMI线转换头
  • 显示器

步骤

  1. 首先我们需要对TF内存卡格式化加安装树莓派OS系统。
  2. 把TF内存卡插入到TF读卡器内。
  3. 先下载Raspberry Pi Imager(树莓派镜像烧录工具)
  4. 从树莓派官网下载烧录工具imager_1.8.5(下载最新的版本),不然其他平台很难保证其安全性。
    4.1 点击 –> 树莓派官网下载链接
    4.2 进入主页,点击最上面导航栏的’Software’

    4.3 往下拉,找到’Download for XXX’

    4.4 下载到本地盘任意位置即可

    4.5 下载完后,双击进行安装,一直点击’下一步’即可,或者安装到任意你喜欢的盘符位置
  5. 点击树莓派启动盘制作工具进行烧录树莓派OS系统。

    5.1 点击【树莓派设备·选择设备】参考下面截图,来配置个人需求。

    5.2 点击【操作系统·选择操作系统】
    这里补充一下:
    如果要节省功耗,请选择Raspberry Pi OS(Legacy,64-bit)Lite版本,因为此系统无桌面,只有命令行。
    如果不担心功耗,请选择Raspberry Pi OS(Legacy,64-bit)Full版本,此版本是有桌面界面。


    5.3 点击【储存设备·选择存储设备】

    5.4 然后点击’下一步’,会出现弹框,点击’编辑设置’




    5.5 最后点击’保存’与’下一步’,会出现警告弹框,再点击’确认’即可,会删除卡内现存数据,如需要,提前做好备份。

  6. 烧录完毕,关闭烧录框。
  7. 桌面会出现提示XX格式化的弹框,无需担心,点击’取消’即可。
  8. 把TF卡拔出后插入到树莓派里。
  9. 插上MiniHDMI转换器,用HDMI线链接树莓派与显示器。
  10. 开机,等待几分钟,让树莓派进行系统初始化。
  11. 进入命令行界面后,输入登录用户名和登录密码。
  12. 恭喜,此时已经成功安装了树莓派OS系统。

结束语

完成上面每一步后,接下来我们可以DIY这个乌班图系统,请各位看官们持续关注这个技术博客,感谢~!

“技術分享 技術無界 開源至上”

记录篇章链接

  1. 链接1
  2. 链接2
  3. 链接3
  4. 链接4
  5. 链接5

制作感受

从XX

参考链接

  1. 参考1
  2. 参考2
  3. 参考3
  4. 参考4
  5. 参考5
0%