Nokia N900 Archive - Nokia N900 WIKI: http://n900.xyz/docs/nokia_n900_wiki/ - Nokia N900安装Maemo Leste: http://n900.xyz/docs/nokia_n900_install_Maemo_Leste/ - tablets-dev.nokia.com存档: http://n900.xyz/docs/tablets-dev_nokia_com_archive/ - rescueOS: http://n900.xyz/docs/rescueOS/ - Nura使用实例: http://n900.xyz/docs/nura_usage/ # Nura使用实例 ![fastfetch info](/imgs/n900_nura_console_fastfetch_info.png 'fastfetch info') 镜像地址 安装方法参考[Maemo Leste](/docs/nokia_n900_install_Maemo_Leste/) ## sysinfo ```sh n900:~$ inxi -F System: Host: n900 Kernel: 7.0.5 arch: armv7l bits: 32 Console: pty pts/0 Distro: postmarketOS v26.06 Machine: Type: ARM System: Nokia N900 details: Nokia RX-51 board rev: 2204 Battery: ID-1: bq27200-0 charge: 5.9 Wh (95.2%) condition: 6.2/6.2 Wh (99.7%) health: calibration required CPU: Info: single core model: ARMv7 v7l variant: cortex-a8 bits: 32 type: UP Speed: N/A min/max: 125/600 core: No per core speed data found. Graphics: Message: No ARM data found for this feature. Display: unspecified server: N/A driver: N/A tty: 80x40 API: N/A Message: No API data available in console. Headless machine? Info: Tools: x11: xprop Audio: Device-1: n900-audio driver: rx51_audio API: ALSA v: k7.0.5 status: kernel-api Network: Message: No ARM data found for this feature. IF-ID-1: usb0 state: down mac: f2:a3:bb:ed:b5:62 IF-ID-2: wlan0 state: up mac: 82:f0:89:72:93:0f Drives: Local Storage: total: 59.55 GiB used: 616.9 MiB (1.0%) ID-1: /dev/mmcblk0 vendor: TDK model: TF32G size: 29.73 GiB type: Removable ID-2: /dev/mmcblk1 model: MMC32G size: 29.82 GiB type: Removable Partition: ID-1: / size: 28.38 GiB used: 566.2 MiB (1.9%) fs: ext4 dev: /dev/mmcblk0p2 ID-2: /boot size: 456.5 MiB used: 50.7 MiB (11.1%) fs: ext2 dev: /dev/mmcblk0p1 Swap: ID-1: swap-1 type: zram size: 348 MiB used: 1.5 MiB (0.4%) dev: /dev/zram0 Sensors: Src: /sys Message: No sensor data found in /sys/class/hwmon. Info: Memory: total: N/A available: 231.7 MiB used: 109.1 MiB (47.1%) Processes: 110 Uptime: 51m Init: systemd Shell: ash (busybox) inxi: 3.3.39 n900:~$ free -h total used free shared buff/cache available Mem: 231.7M 79.3M 37.9M 2.3M 114.5M 142.2M Swap: 348.0M 1.5M 346.5M n900:~$ cat /proc/cpuinfo processor : 0 model name : ARMv7 Processor rev 3 (v7l) BogoMIPS : 331.77 Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x1 CPU part : 0xc08 CPU revision : 3 Hardware : Nokia RX-51 board Revision : 2204 Serial : 0000000000000000 n900:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS mmcblk0 179:0 0 29.7G 0 disk ├─mmcblk0p1 179:1 0 487M 0 part /boot └─mmcblk0p2 179:2 0 29.3G 0 part / mmcblk1 179:16 0 29.8G 0 disk ├─mmcblk1p1 179:17 0 21G 0 part ├─mmcblk1p2 179:18 0 8G 0 part └─mmcblk1p3 179:19 0 768M 0 part mmcblk1boot0 179:32 0 512K 1 disk mmcblk1boot1 179:48 0 512K 1 disk nullb0 253:0 0 250G 0 disk zram0 254:0 0 348M 0 disk [SWAP] n900:~$ df -hai Filesystem Inodes Used Available Use% Mounted on proc 0 0 0 0% /proc sysfs 0 0 0 0% /sys dev 25.1K 515 24.6K 2% /dev run 29.0K 894 28.1K 3% /run configfs 0 0 0 0% /sys/kernel/config devpts 0 0 0 0% /dev/pts none 0 0 0 0% /sys/kernel/debug /dev/mmcblk0p2 3.4M 13.8K 3.4M 0% / securityfs 0 0 0 0% /sys/kernel/security tmpfs 29.0K 1 29.0K 0% /dev/shm cgroup2 0 0 0 0% /sys/fs/cgroup bpf 0 0 0 0% /sys/fs/bpf systemd-1 0 0 0 0% /proc/sys/fs/binfmt_misc mqueue 0 0 0 0% /dev/mqueue tracefs 0 0 0 0% /sys/kernel/tracing none 1.0K 1 1023 0% /run/credentials/systemd-journald.service fusectl 0 0 0 0% /sys/fs/fuse/connections tmpfs 1.0M 6 1024.0K 0% /tmp binfmt_misc 0 0 0 0% /proc/sys/fs/binfmt_misc /dev/mmcblk0p1 121.5K 98 121.4K 0% /boot none 1.0K 1 1023 0% /run/credentials/getty@tty1.service tmpfs 5.8K 43 5.7K 1% /run/user/10000 n900:~$ ``` ## SSH Server account info: user 147147 ```sh n900:~$sudo apk add openssh-server n900:~$sudo systemctl enable sshd n900:~$sudo systemctl start sshd n900:~$ systemctl status sshd ● sshd.service - OpenSSH Daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: dis> Active: active (running) since Thu 2026-10-15 14:33:42 GMT; 20min ago Invocation: 0899f59523634596b98d8201dbac52e4 Main PID: 1546 (sshd.pam) Tasks: 1 (limit: 564) Memory: 3.2M (peak: 4.2M) CPU: 2.728s CGroup: /system.slice/sshd.service └─1546 "sshd.pam: /usr/sbin/sshd.pam -D [listener] 0 of 10-100 sta> Oct 15 14:33:42 n900 systemd[1]: Started OpenSSH Daemon. Oct 15 14:33:43 n900 sshd.pam[1546]: Server listening on 0.0.0.0 port 22. Oct 15 14:33:43 n900 sshd.pam[1546]: Server listening on :: port 22. Oct 15 14:35:51 n900 sshd-session.pam[1664]: Connection closed by authenticatin> Oct 15 14:35:52 n900 sshd-session.pam[1669]: Connection closed by authenticatin> Oct 15 14:35:59 n900 sshd-session.pam[1671]: Accepted keyboard-interactive/pam > Oct 15 14:35:59 n900 sshd-session.pam[1671]: pam_unix(sshd:session): session op> Oct 15 14:36:00 n900 sshd-session.pam[1671]: pam_unix(sshd:session): session cl> Oct 15 14:36:09 n900 sshd-session.pam[1695]: Accepted publickey for user from 1> Oct 15 14:36:09 n900 sshd-session.pam[1695]: pam_unix(sshd:session): session op> n900:~$ cat > ~/hwinfo.py << 'EOF' #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys import time import platform from pathlib import Path def read_file(path, default="N/A"): try: with open(path, "r") as f: return f.read().strip() except Exception: return default def read_int(path, default=0): try: return int(read_file(path, "0")) except Exception: return default def human_size(size): for unit in ["B", "KB", "MB", "GB", "TB"]: if size < 1024: return f"{size:.1f} {unit}" size /= 1024 return f"{size:.1f} PB" def get_battery(): base = Path("/sys/class/power_supply/bq27200-0") if not base.exists(): # 尝试自动查找 for p in Path("/sys/class/power_supply").iterdir(): if (p / "capacity").exists(): base = p break else: return {"status": "未找到电池信息"} capacity = read_file(base / "capacity") status = read_file(base / "status") voltage = read_int(base / "voltage_now") / 1000000 current = read_int(base / "current_now") / 1000 # µA → mA temp = read_int(base / "temp") / 10 health = read_file(base / "health") technology = read_file(base / "technology") time_to_empty = read_file(base / "time_to_empty_now") cycle = read_file(base / "cycle_count") return { "capacity": f"{capacity}%", "status": status, "voltage": f"{voltage:.3f} V", "current": f"{current:.0f} mA", "temperature": f"{temp:.1f} °C", "health": health, "technology": technology, "time_to_empty": f"{time_to_empty} min" if time_to_empty != "N/A" else "N/A", "cycle_count": cycle, } def get_cpu(): model = "N/A" cores = 0 freqs = [] try: with open("/proc/cpuinfo") as f: for line in f: if line.startswith("model name") or line.startswith("Processor"): model = line.split(":")[1].strip() if line.startswith("processor"): cores += 1 except Exception: pass # CPU 频率 for i in range(cores or 1): freq_path = f"/sys/devices/system/cpu/cpu{i}/cpufreq/scaling_cur_freq" if os.path.exists(freq_path): mhz = read_int(freq_path) / 1000 freqs.append(f"{mhz:.0f} MHz") return { "model": model, "cores": cores or "N/A", "frequency": ", ".join(freqs) if freqs else "N/A", } def get_memory(): meminfo = {} try: with open("/proc/meminfo") as f: for line in f: key, value = line.split(":") meminfo[key.strip()] = int(value.strip().split()[0]) * 1024 # kB → bytes except Exception: return {} total = meminfo.get("MemTotal", 0) free = meminfo.get("MemFree", 0) available = meminfo.get("MemAvailable", free) buffers = meminfo.get("Buffers", 0) cached = meminfo.get("Cached", 0) used = total - available return { "total": human_size(total), "used": human_size(used), "available": human_size(available), "buffers/cache": human_size(buffers + cached), "usage": f"{(used / total * 100):.1f}%" if total else "N/A", } def get_disk(): import shutil disks = [] try: for line in open("/proc/mounts"): parts = line.split() if len(parts) < 3: continue device, mountpoint, fstype = parts[0], parts[1], parts[2] if not device.startswith("/dev/") or fstype in ("proc", "sysfs", "devtmpfs", "tmpfs", "devpts"): continue try: usage = shutil.disk_usage(mountpoint) disks.append({ "device": device, "mount": mountpoint, "fstype": fstype, "total": human_size(usage.total), "used": human_size(usage.used), "free": human_size(usage.free), "usage": f"{(usage.used / usage.total * 100):.1f}%", }) except Exception: continue except Exception: pass return disks def get_temperature(): temps = [] thermal = Path("/sys/class/thermal") if thermal.exists(): for zone in sorted(thermal.glob("thermal_zone*")): t = read_int(zone / "temp") if t > 1000: # 有些是毫摄氏度 t = t / 1000 typ = read_file(zone / "type", zone.name) temps.append(f"{typ}: {t:.1f} °C") return temps def get_backlight(): bl_path = Path("/sys/class/backlight") if not bl_path.exists(): return "N/A" for bl in bl_path.iterdir(): brightness = read_file(bl / "brightness") max_brightness = read_file(bl / "max_brightness") if brightness != "N/A" and max_brightness != "N/A": percent = int(brightness) * 100 // int(max_brightness) return f"{brightness}/{max_brightness} ({percent}%)" return "N/A" def get_uptime(): try: with open("/proc/uptime") as f: seconds = float(f.read().split()[0]) days = int(seconds // 86400) hours = int((seconds % 86400) // 3600) minutes = int((seconds % 3600) // 60) return f"{days}天 {hours}小时 {minutes}分钟" except Exception: return "N/A" def get_network(): nets = [] net_path = Path("/sys/class/net") if net_path.exists(): for iface in sorted(net_path.iterdir()): if iface.name == "lo": continue operstate = read_file(iface / "operstate") # 尝试获取 IP ip = "N/A" try: import subprocess out = subprocess.check_output(["ip", "-4", "addr", "show", iface.name], stderr=subprocess.DEVNULL).decode() for line in out.splitlines(): if "inet " in line: ip = line.strip().split()[1] break except Exception: pass nets.append(f"{iface.name}: {operstate} {ip}") return nets def main(): print("=" * 50) print(" Nokia N900 硬件信息") print("=" * 50) print(f"时间 : {time.strftime('%Y-%m-%d %H:%M:%S')}") print(f"主机名 : {platform.node()}") print(f"系统 : {platform.system()} {platform.release()}") print(f"架构 : {platform.machine()}") print(f"运行时间 : {get_uptime()}") print() # 电池 print("【电池】") bat = get_battery() for k, v in bat.items(): print(f" {k:16}: {v}") print() # CPU print("【CPU】") cpu = get_cpu() for k, v in cpu.items(): print(f" {k:16}: {v}") print() # 内存 print("【内存】") mem = get_memory() for k, v in mem.items(): print(f" {k:16}: {v}") print() # 磁盘 print("【磁盘】") disks = get_disk() if disks: for d in disks: print(f" {d['device']} → {d['mount']} ({d['fstype']})") print(f" 总容量: {d['total']} 已用: {d['used']} 可用: {d['free']} 使用率: {d['usage']}") else: print(" 未获取到磁盘信息") print() # 温度 print("【温度】") temps = get_temperature() if temps: for t in temps: print(f" {t}") else: print(" 未获取到温度传感器") print() # 背光 print("【背光】") print(f" 亮度 : {get_backlight()}") print() # 网络 print("【网络接口】") nets = get_network() if nets: for n in nets: print(f" {n}") else: print(" 未获取到网络接口") print() print("=" * 50) if __name__ == "__main__": main() EOF n900:~$ chmod +x hwinfo.py n900:~$ ./hwinfo.py ================================================== Nokia N900 硬件信息 ================================================== 时间 : 2026-10-16 00:54:24 主机名 : n900 系统 : Linux 7.0.5 架构 : armv7l 运行时间 : 0天 10小时 39分钟 【电池】 capacity : 80% status : Discharging voltage : 3.840 V current : -377 mA temperature : 37.1 °C health : Calibration required technology : Li-ion time_to_empty : 15780 min cycle_count : 0 【CPU】 model : ARMv7 Processor rev 3 (v7l) cores : 1 frequency : 600 MHz 【内存】 total : 231.7 MB used : 107.4 MB available : 124.3 MB buffers/cache : 90.4 MB usage : 46.4% 【磁盘】 /dev/mmcblk0p2 → / (ext4) 总容量: 28.4 GB 已用: 638.8 MB 可用: 26.3 GB 使用率: 2.2% /dev/mmcblk0p1 → /boot (ext2) 总容量: 456.5 MB 已用: 50.7 MB 可用: 381.4 MB 使用率: 11.1% 【温度】 bq27200-0: 37.1 °C 【背光】 亮度 : 60/255 (23%) 【网络接口】 tailscale0: unknown 100.125.241.40/32 usb0: down N/A wlan0: up 192.168.1.36/24 ================================================== n900:~$ ``` ## tailscale ```sh n900:~$ curl -fsSL https://tailscale.com/install.sh | sh n900:~$ sudo systemctl enable tailscaled Created symlink '/etc/systemd/system/multi-user.target.wants/tailscaled.service' → '/usr/lib/systemd/system/tailscaled.service'. n900:~$ sudo systemctl start tailscaled n900:~$ sudo systemctl status tailscaled ● tailscaled.service - Tailscale node agent Loaded: loaded (/usr/lib/systemd/system/tailscaled.service; enabled; preset: disabled) Active: active (running) since Thu 2026-10-15 15:33:10 GMT; 19s ago Invocation: b5e242db467f4042b361a5dee91cce4c Docs: https://tailscale.com/docs/ Main PID: 3322 (tailscaled) Status: "Needs login: " Tasks: 11 (limit: 564) Memory: 10M (peak: 10M) CPU: 2.223s CGroup: /system.slice/tailscaled.service └─3322 /usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --po> Oct 15 15:33:13 n900 tailscaled[3322]: Backend: logs: be:ec6de73828218c242db16930a0975a598aba378f3014e3d815c68498b101ad7d fe: Oct 15 15:33:13 n900 tailscaled[3322]: Switching ipn state NoState -> NeedsLogin (WantRunning=false, nm=false) Oct 15 15:33:13 n900 tailscaled[3322]: health(warnable=wantrunning-false): error: Tailscale is stopped. Oct 15 15:33:14 n900 tailscaled[3322]: blockEngineUpdates(true) Oct 15 15:33:14 n900 tailscaled[3322]: wgengine: Reconfig: configuring router Oct 15 15:33:14 n900 tailscaled[3322]: wgengine: Reconfig: user dialer Oct 15 15:33:14 n900 tailscaled[3322]: wgengine: Reconfig: configuring DNS n900:~$ sudo tailscale up To authenticate, visit: https://login.tailscale.com/a/18*******e01503c Success. n900:~$ tailscale status 100.125.241.40 n900 alairs@ linux - n900:~$ ``` 通过tailscale传送文件,e64是win系统,文件默认放到系统下载目录 ```sh n900:~$ tailscale status 100.125.241.40 n900 alairs@ linux - 100.105.83.21 e64 alairs@ windows active; relay "sfo", tx 3221464 rx 1372592 n900:~$ sudo tailscale file cp /home/user/apklist e64: apklist 1.73MiB 88.51KiB/s 100.00% ETA 00:00:00 n900:~$ ``` ## 一些使用方法 ### 检查电源信息 ```sh # 查询电源设备 n900:~# ls /sys/class/power_supply/ bq24150a-0 bq27200-0 isp1704 ``` |设备|芯片|作用| |-|-|-| |bq27200-0|TI BQ27200|电量计(Fuel Gauge)负责测量电池容量、百分比、电压、电流、剩余时间等| |bq24150a-0|TI BQ24150|充电管理芯片负责控制充电电流、充电状态、过充保护等| |isp1704|NXP ISP1704|USB 收发器 / USB 电源检测负责检测 USB 是否插入、VBUS 电压,以及 USB 充电相关状态| - bq27200-0 → 看电池还剩多少电 - bq24150a-0 → 控制怎么给电池充电 - isp1704 → 检测有没有插 USB / 充电器 ```sh # 电量信息 n900:~# cat /sys/class/power_supply/bq27200-0/status Discharging n900:~# cat /sys/class/power_supply/bq27200-0/capacity 53 # 充电芯片 n900:~# cat /sys/class/power_supply/bq24150a-0/status Not charging n900:~# cat /sys/class/power_supply/bq24150a-0/online 0 # USB 相关 # 是否插了 USB / 充电器,插着1,没插0 n900:/sys/class/power_supply/isp1704# cat online 0 # 电源类型 n900:/sys/class/power_supply/isp1704# cat type USB # 最大电流(µA,除以1000得到mA) n900:/sys/class/power_supply/isp1704# cat current_max 0 ``` 电池综合信息,确保先安装了`bc` ```sh echo "电量: $(cat /sys/class/power_supply/bq27200-0/capacity)%" echo "状态: $(cat /sys/class/power_supply/bq27200-0/status)" echo "电压: $(echo "scale=2; $(cat /sys/class/power_supply/bq27200-0/voltage_now)/1000000" | bc)V" echo "温度: $(echo "scale=1; $(cat /sys/class/power_supply/bq27200-0/temp)/10" | bc)°C" ``` ### 调整屏幕亮度 ```sh # 检查背光设备 n900:~# ls /sys/class/backlight/ acx565akm # 查询当前亮度 n900:~# cat /sys/class/backlight/acx565akm/brightness 1 # 查询最大亮度 n900:~# cat /sys/class/backlight/acx565akm/max_brightness 255 # 设置亮度 n900:~# echo 10 > /sys/class/backlight/acx565akm/brightness ``` _https://wiki.nura.eco/wiki/Nokia_N900_(nokia-n900)_