开发板通常采用 SOC,市面流通产品通常包括集成部分功能通用开发平台的核心板(参考 Virbox 核心板)和成品开发版(rk3399,三星6818等)。
权限
root 和用户
具有开发板的开发者拥有root权限,但对于将应用部署在别人的环境下的开发者,受限于平台厂商的要求,可能并没有 root 权限。
文件权限
root 用户可以查看所有系统文件,包括普通用户目录下的文件。
普通用户,可以查看部分系统目录文件权限,但无法修改和新建。
用户权限
用户只有在 home 的目录下当前的文件路径下才拥有完整权限。
查看所有用户拥有权限目录:
切换家目录:cd ~
系统目录与文件
Linux 所有目录有明确的约定,区分不同类型的文件(依赖库、可执行文件、配置文件等)。
隐藏
隐藏目录和文件,目录名称或文件名称第一个字符是 .
,文件会对所有用户隐藏,只有通过指定查看隐藏文件参数才可以看到(可以参考 Windows 隐藏文件)。
TODO 修改文件权限,可以隐藏普通文件名。
查看隐藏文件:ls -a
隐藏文件的安全性一般,通过指定命令可以查看;但可以避免用户误删文件。
Linux 系统中通常使用隐藏文件完成以下功能:
部分配置,保存在隐藏文件或目录下。例如:
firefly@firefly:~/.local/share$ pwd /home/firefly/.local/share /home/firefly/.local/sharefirefly@firefly:~/.local/share$ ls applications gnome-software gvfs-metadata keyrings recently-used.xbel
- vi 或 vim 编辑文件,当因为无权限修改文件后无法保存,退出后再次打开时会提示冲突,与源文件不同,是否需要修改等选项。其实在文档的同级目录下有一个临时文件生成,删除临时文件后,再次打开源文件不会提示“继续编辑”。
临时目录
/tmp
所有用户都有权限访问,约定存放临时文件,部分系统可能会定期清理临时目录。
/usr/tmp
部分 ARM-Linux 系统默认没有 /usr/tmp ,部分当前目录只有部分用户有权限。
唯一硬件信息不可靠
- 嵌入式开发板,SOC架构的芯片,小作坊规模的厂商可以生产,在当前的环境下没有唯一的ID信息。
- Linux系统开源,ARM-Linux 可以裁剪系统,通过系统应用层接口获取信息都不可靠。
获取可靠的硬件唯一ID
- 外置设备,例如竞品(Bitanswer)的比特精灵,提供唯一设备ID。
- 内置芯片,华为海思芯片生产时会给每一个芯片提供唯一ID。
- Virbox 核心板,核心板内置精锐5,精锐5出厂预设分配设备ID不重复。
硬件信息
系统映射
Linux 系统启动后,会将硬件信息映射到系统文件,所有用户权限(普通用户和root)可以查看,但不能修改。
映射到系统的文件,虽然在系统启动后无法更改,但不排除开发者通过修改 Linux 系统源码,来修改获取到的信息内容(未验证),例如:映射的硬件信息。
CPU
系统映射
- /proc/cpuinfo
查看信息
- cat /proc/cpuinfo 查看基本信息,所有版本的系统都支持。
- lscpu,部分系统支持(与 Linux 系统裁剪设置有关)。
CPU唯一序列号(不可靠)
部分厂商提供,可以通过 /proc/cpuinfo 获取,完全依赖于厂商(或核心板制造商)的策略。
访问 /proc/cpuinfo 文件,获取 CPU 信息,不同的板卡,CPU上显示的信息不同。
firefly@firefly:/sys/class/net$ cat /proc/cpuinfo
processor : 0
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 1
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 2
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 3
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 4
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd08
CPU revision : 2
processor : 5
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd08
CPU revision : 2
Serial : a8585fa55c006dc0
注意:Serial 字段,并非所有的 CPU 都有,部分厂商提供的开发板并无 Serial 信息。
网卡
网卡信息包括:网卡名称、IP地址、MAC地址
所有联网开发板都有唯一的MAC地址,并且在所在的局域网内必须保证唯一,一旦MAC地址冲突,就会造成无法接入局域网的问题,可以作为设备运行状态的标识。
系统映射
- /sys/class/net
查看信息
- ifconfig
配置静态IP
修改 /etc/network/interfaces
文件,修改格式参考以下内容:
firefly@firefly:/etc/network$ cat interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
address 10.10.1.7
netmask 255.255.255.0
network 10.10.1.1
broadcask 10.10.1.255
gateway 10.10.1.1
dns-nameservers 10.10.2.88
dns-nameservers 10.10.2.89
系统映射
/sys/class/net ,网卡信息在系统加载后会保存在系统运行目录,并根据网卡名称分别存放在不同的目录下。
firefly@firefly:/sys/class/net$ ls -l
total 0
lrwxrwxrwx 1 root root 0 Dec 16 12:28 eth0 -> ../../devices/platform/fe300000.ethernet/net/eth0
lrwxrwxrwx 1 root root 0 Dec 16 12:28 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 Dec 16 12:28 wlan0 -> ../../devices/platform/fe310000.dwmmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:2/net/wlan0
firefly@firefly:/sys/class/net$ cd eth0
firefly@firefly:/sys/class/net/eth0$ ls
addr_assign_type address carrier dev_id device duplex gro_flush_timeout ifindex link_mode name_assign_type operstate phys_port_name power queues statistics tx_queue_len uevent
addr_len broadcast carrier_changes dev_port dormant flags ifalias iflink mtu netdev_group phys_port_id phys_switch_id proto_down speed subsystem type
firefly@firefly:/sys/class/net/eth0$ cat address
2a:8c:c3:82:e5:5e
备注:通过读取 address 文件,即可获得网卡的 MAC 地址。
内存
内存总量在开发板出厂后不会发生改变,可以作为设备的硬件标识之一。
系统映射
- 基本信息:/proc/meminfo,包括内存(总量)以及使用系统运行过程中变化的数据(可用内存、空闲内存等)
查看命令
- cat /proc/meminfo
查看内存信息
firefly@firefly:~/.local/share$ cat /proc/meminfo
MemTotal: 2007992 kB
MemFree: 1064168 kB
MemAvailable: 1693528 kB
Buffers: 62484 kB
Cached: 517568 kB
SwapCached: 0 kB
Active: 501096 kB
Inactive: 257736 kB
Active(anon): 179368 kB
Inactive(anon): 13464 kB
Active(file): 321728 kB
Inactive(file): 244272 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 260 kB
Writeback: 0 kB
AnonPages: 178804 kB
Mapped: 194828 kB
Shmem: 14052 kB
Slab: 116008 kB
SReclaimable: 86016 kB
SUnreclaim: 29992 kB
KernelStack: 25392 kB
PageTables: 6400 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1003996 kB
Committed_AS: 1975780 kB
VmallocTotal: 258867136 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
存储(分区)
内置存储、多媒体存储都属于存储范围。
系统映射
- /proc/partitions,存储块基本信息
- /sys/block/mmcblk0/device/,存储块 mmcblk0 信息。
查看命令
- cat /proc/partitions
存储CID(唯一标识)
/sys/block/mmcblk0/device/cid,读取存储映射在系统目录下的文件,cid 即存储ID。
局限性:只有在 mmcblk0 类型的存储才能获得 CID ,否则如 mtdblock(SOC-Virbox 核心板)并未 CID 属性,无法获取。
firefly@firefly:/sys/block/mmcblk0/device$ ls
block driver erase_size life_time oemid prv serial
cid dsr ffu_capable manfid power raw_rpmb_size_mult subsystem
csd enhanced_area_offset fwrev name pre_eol_info rel_sectors type
date enhanced_area_size hwrev ocr preferred_erase_size rev uevent
firefly@firefly:/sys/block/mmcblk0/device$
firefly@firefly:/sys/block/mmcblk0/device$ cat cid csd
150100414a4e423452076d3eb6957400
d02701320f5903fff6dbffef8e404000
/proc/partitions 分析
对比没有外接任何存储,外接USB存储,外接SDCard时系统信息有何不同,确认 ARM 下如何获取有效的 partitions 信息。
一、原始-partitions_1_ori
没有外接任何设备的磁盘信息
major minor #blocks name
1 0 4096 ram0
179 0 15267840 mmcblk0
179 1 4096 mmcblk0p1
179 2 4096 mmcblk0p2
179 3 32768 mmcblk0p3
179 4 32768 mmcblk0p4
179 5 15083503 mmcblk0p5
179 96 4096 mmcblk0rpmb
179 64 4096 mmcblk0boot1
179 32 4096 mmcblk0boot0
二、增加U盘-partitions_2_U
外接U盘
major minor #blocks name
1 0 4096 ram0
179 0 15267840 mmcblk0
179 1 4096 mmcblk0p1
179 2 4096 mmcblk0p2
179 3 32768 mmcblk0p3
179 4 32768 mmcblk0p4
179 5 15083503 mmcblk0p5
179 96 4096 mmcblk0rpmb
179 64 4096 mmcblk0boot1
179 32 4096 mmcblk0boot0
8 0 3584000 sda ------- 与 partitions_1_ori 不同
8 1 3583984 sda1 ------- 与 partitions_1_ori 不同
其中,sda 和 sda1 是新增的存储空间。
三、增加存储卡-partitions_3_SDCard
外接SDCard
major minor #blocks name
1 0 4096 ram0
179 0 15267840 mmcblk0
179 1 4096 mmcblk0p1
179 2 4096 mmcblk0p2
179 3 32768 mmcblk0p3
179 4 32768 mmcblk0p4
179 5 15083503 mmcblk0p5
179 96 4096 mmcblk0rpmb
179 64 4096 mmcblk0boot1
179 32 4096 mmcblk0boot0
179 128 31166976 mmcblk2 ------- 与 partitions_1_ori 不同
179 129 262144 mmcblk2p1 ------- 与 partitions_1_ori 不同
179 130 30896640 mmcblk2p2 ------- 与 partitions_1_ori 不同
其中mmcblk2前缀的为外置新增的存储设备。
小结
- 相比 /proc/cpuinfo 和 /proc/meminfo 不会发生变更,存储作为 ARM 开发板的一部分,板卡生产时已经具备基本的存储,可以作为有效硬件信息的一部分。
- 收集信息。(1)收集 ram(0-n) 前缀的信息;(2)收集 mmcblk0 的信息(总存储空间大小),mmcblk0p1, mmcblk0p2 等都是拆分的逻辑存储(类似虚拟分区的概念)。