Nura使用实例

fastfetch info

镜像地址 https://images.nura.eco/bpo/v26.06/nokia-n900/ 安装方法参考Maemo Leste

sysinfo

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

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

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系统,文件默认放到系统下载目录

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:~$

一些使用方法

检查电源信息

# 查询电源设备
n900:~# ls /sys/class/power_supply/
bq24150a-0  bq27200-0   isp1704
设备芯片作用
bq27200-0TI BQ27200电量计(Fuel Gauge)负责测量电池容量、百分比、电压、电流、剩余时间等
bq24150a-0TI BQ24150充电管理芯片负责控制充电电流、充电状态、过充保护等
isp1704NXP ISP1704USB 收发器 / USB 电源检测负责检测 USB 是否插入、VBUS 电压,以及 USB 充电相关状态
  • bq27200-0 → 看电池还剩多少电
  • bq24150a-0 → 控制怎么给电池充电
  • isp1704 → 检测有没有插 USB / 充电器
# 电量信息
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

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"

调整屏幕亮度

# 检查背光设备
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)