2019年10月27日 星期日

filesystem

檔案系統是檔案和目錄放在儲存裝置的格式,儲存裝置可以是硬碟的一個分割、Flash 晶片、RAM 等。Linux 系統會有個根目錄 (roofs),本身會有個檔案系統,其下目錄可掛載其它檔案系統。

 註:roofs 是 root file system 的縮寫,直接翻譯是「根檔案系統」,是指整個檔案目錄階層架構的頂端,而不是指特定檔案系統,翻成「根目錄」較不會混淆。

看目前支援的檔案系統
cat /proc/filesystems

選擇適合的檔案系統:唯讀或可寫、wear-leveling、空間大小、唯讀的在開機時需要額外建立可寫分割、基於 RAM 的減少 kernel 或應用可用的記憶體。隨時可能斷電、省空間、延長壽命、效能
  • ext4 適合硬碟 (ext2/3/4)
  • f2fs (flash file system) 適合快閃碟 (SSD、USB 隨身碟)
  • FAT32 適合跨平台使用,無法存大於 3.9 GiB 的檔案,寫入時 disconnect 易於損壞,沒檢查再寫入會導致資料遺失。
  • JFFS2 是可寫壓縮的檔案系統,使用 LZMA 壓縮,支援日誌和 wear leveling。
  • SquashFS 是唯讀壓縮的檔案系統,當有 gzip 時使用 LZMA 壓縮,可比 JFFS2 省 20-30% 空間。沒有 bad block management 不適合 NAND。
  • UBIFS 適合 NAND
  • NTFS 用在 Windows 電腦,在 Linux 效能不好。
  • exFAT 用在大於 32 GiB 的 SD 記憶卡,不然還是使用 FAT32,在 Linux 效能和穩定度比 NTFS 好。
  • HFS, HFS+ 用在 Apple 設備,但在 Linux 效能不好,且功能有限。
  • APFS 也用在 Apple 設定,但太新而 Linux 沒支援。
  • xfs and btrfs
  • nilfs2
  • FUSE (User space filesystems):在 user space 執行
  • cramfs:
    • Compressed ROM Filesystem. zlib 壓縮的唯讀當按系統,沒有完整的 Metadata。
    • 限制:256 MB、216files
    • 所有檔案 root 擁有,不存所有 permissions,不存 timestamps。inode overhead 只有 12 bytes
    • mkcramfs -m dev.cramfs.txt rootfs.cramfs
    • http://sourceforge.net/projects/cramfs
tmpfs
OverlayFS:用來 merge 一個唯讀檔案系統和一個可寫檔案系統。
mini_fo:由 OverlayFS 取代。

JFFS2 raw flash 可寫

分割工具
fdisk 用在 MBR 碟。
gdisk 用在 GPT 碟。

OpenWrt

ext4
opkg install e2fsprogs #工具程式
opkg install kmod-fs-ext4 #檔案系統不支援時安裝驅動程式

f2fs
opkg install f2fs-tools #工具程式
opkg install kmod-fs-f2fs #檔案系統不支援時安裝驅動程式


NTFS
opkg install ntfsprogs_ntfs-3g #工具程式
opkg install ntfs-3g #檔案系統不支援時安裝驅動程式

HFS 和 HFS+
opkg install hfsfsck #工具程式
opkg install kmod-fs-hfs kmod-fs-hfsplus #檔案系統不支援時安裝驅動程式

其它檔案系統
opkg update && opkg list | grep kmod-fs #列出 OpenWrt 支援的當按系統
opkg list | grep FILESYSTEM_NAME #找檔案系統的工具程式

參考

  • https://openwrt.org/docs/guide-user/storage/filesystems-and-partitions
  • https://openwrt.org/docs/techref/filesystems
  • Linux 需要在 / 掛載 RFS (root filesystem) 執行一些程式才能成功啟動。 RFS 可以在記憶體、或透過網路連結,可以跟 kernel image “attached” 在一起載入到記憶體。
  • Linux 天生檔案導向,透過 VFS (Virtual FileSystem) 提供統一的檔案系統界面,共用函數如 caching 等,未必需要實體儲存裝置。

2019年10月26日 星期六

git backup and restore

git clone --mirror git://github.com/user/project.git
cd project.git
edit config # you can change the repo url
git push


其它
git remote update
git --git-dir project.git remote update
git bundle

AM335x

http://www.ti.com/product/AM3358

ARM® Cortex®-A8 32‑Bit RISC Processor

功能AM3351AM3352AM3354AM3356AM3357AM3358AM3359
最快600MHz1000MHz1000MHz800MHz800MHz1000MHz800MHz
3D 加速--v--vv
PRU---basicv無 EtherCAT slavev
CAN-
vvvvvv
ZCE 包裝
1x USB
1x EMAC
vvvv
有限 PRU IO
---
ZCZ 包裝
2x USB
2x EMAC
-vvvvvv

週邊

2x USB 2.0 High-Speed DRD (Dual-Role Device),內建 PHY

2x Industrial Gigabit Ethernet MACs

2x CAN

2x McASP (Multichannel Audio Serial Ports)

  • 獨立收傳,速度可達 50 MHz,各有 256 bytes buffer
  • 支援 TDM, I2S, 數位 Audio 界面 (SPDIF, IEC60958-1, AES-3)
  • AM335x Audio Driver's Guide (找不到)
  • Sitara SDK Linux Audio (找不到)

6x UART

  • 只有 UART1 的 DCD, DSR, DTR, RI 可以接出來
  • 只有 UART0 有支援 wake-up
  • UART/IrDA/CIR

2x Master and Slave McSPI Serial Interfaces

3x MMC, SD, SDIO Ports

Up to Three I2C Master and Slave Interfaces

Up to Four Banks of General-Purpose I/O (GPIO) Pins

Up to Three External DMA Event Inputs that can Also be Used as Interrupt Inputs

Eight 32-Bit General-Purpose Timers

One Watchdog Timer

SGX530 3D Graphics Engine

LCD Controller

8x 12-Bit ADC

  • 200K Samples per Second
  • 輸入選自 8 類比輸入的多工。
  • 可設定 Operate as a 4-Wire, 5-Wire, or 8-Wire Resistive Touch Screen Controller (TSC) Interface

Up to Three 32-Bit eCAP Modules

Up to Three Enhanced High-Resolution PWM Modules (eHRPWMs)

http://tenderlovemaking.com/2014/01/19/enabling-ttyo1-on-beaglebone.html
http://blog.pignology.net/2013/05/getting-uart2-devttyo1-working-on.html

TI Evaluation Board

軟體

  • echo cancellation
  • codec

參考

2019年10月19日 星期六

[OpenWrt] start over

重生
  • 安全 (failsafe) 模式:只開機到基本可運作狀態,可修改大部分設定和調整套件,修正因為設定錯誤等而造成無法存取的問題。
  • 回復出廠預設值 (factory reset):回復到安裝 OpenWrt 後的原始狀態。
  • 復原 (recovery) 或解救 (rescue) 模式:在損壞的機器安裝新韌體。

安全模式

安全模式只有在 root 分割是唯讀的 squashfs 時支援。可執行
grep squash /proc/mounts
來檢查,回類似
/dev/root /rom squashfs ro,relatime 0 0

開機時,有兩秒的時間可進入安全模式,依機型大致有 3 種進入方式:
  1. LED SYS (或 Power) 閃爍時按 Reset,會變成快閃。
  2. 收到給 192.168.1.255:4919 的封包時按 Reset。
  3. 觀看 serial console 訊息,輸入「f」。
然後可以 ssh 192.168.1.1 (15.05 以前是 telnet 192.168.1.1) 進入或 serial console 下指令。

安全模式指令
mount_root:掛載 jffs2 分割 (出廠後有修改的部份) 到 /overlay。然後可進行修正。

回復出廠預設值

正常開機後或在安全模式都可以回復出廠預設值。使用 squashfs / overlayfs 設定的皆支援,因為回復出廠預設值的作法是 erasing and reformatting the overlayfs。x86 使用 ext4 read-write rootfs 不支援。

參考來源

延伸閱讀

https://wiki.openwrt.org/doc/howto/generic.failsafe
overlay, firstboot, rootfs_data

2019年10月18日 星期五

iproute2

傳統上 Linux 使用 net-tools 工具程式 arp、ifconfig、和 route 來設定或查看網路,但這些功能有所限制。Linux kernel 2.2 之後使用重新設計的網路子系統,也需要新的工具程式。

iproute2 是 Linux 上管理 TCP/IP 網路的一套工具程式,包括網路界面、routing、tunnels、traffic control、和網路相關 device drivers,通常以套件 iproute 或 iproute2 發行。iproute2 工具程式使用 netlink 協定跟 Linux kernel 溝通。

net-toolsiproute2說明
ifconfig if[:n] ip[/len| netmask nm]ip addr add ip[/len] dev if界面 if 設定或新增 (有 :n) IPv4 位址 ip。netmask nmnm 需轉換成 prefix 長度 len
ifconfig if add ip/len界面 if 新增 IPv6 位址 ip,prefix 長度為 len
ifconfigip addr, ip link, ip -s其它 Address and link 設定
routeip routeRouting tables
arpip neighNeighbors
iptunnelip tunnelTunnels
nameififrename, ip link set name網路界面改名
ipmaddrip maddr群播
netstatip -s, ss, ip route顯示網路統計

除了 ip 指令,還有 ss, bridge, rtacct, rtmon, tc, ctstat, lnstat, nstat, routef, routel, rtstat, tipc, arpd 和 devlink。

參考
  1. https://en.wikipedia.org/wiki/Iproute2 
  2. https://wiki.linuxfoundation.org/networking/iproute2
  3. https://lartc.org/howto

2019年10月12日 星期六

5G

5G 世代有三大目標:eMBB、URLLC、和 mMTC。

eMBB (Enhanced Mobile Broadband, 增強型行動寬頻通訊):針對不同涵蓋範圍有不同需求,包括廣域覆蓋和熱點傳輸。廣域覆蓋主要需求是無縫的覆蓋和較高的移動速度,並高於現有的數據傳輸速率。熱點傳輸針對高密度用戶區域,移動性的需求較低,但需要很高的數據傳輸量,預期將傳輸速度提升至下行 20Gbit/s、上行 10Gbit/s。

URLLC (Ultra-reliable and Low Latency Communications, 超可靠度和低延遲通訊) 需要嚴格的延遲 (< 1ms) 和可靠性 (< 10-5) 的傳輸,例如工業自動化製造或生產過程的無線控制、遠程醫療手術、智慧電網配電自動化、運輸安全、無人駕駛等。

mMTC (Massive Machine Type Communications, 大規模機器型通訊) 應用於連接每平方公里約 100 萬個大量裝置之間的通訊需求,數據量低且延遲要求不高,須具有非常低的製造成本,很長的電池壽命。

預期提供的新服務:
  • 畫質更好的視訊服務 (UHD)
  • 萬物聯網 (IoT/IoE)
  • 感知的網際網路 (Tactile internet, 1ms/10GBps)
  • 關鍵任務型服務 (如:車聯網)。
參考
https://opm.twnic.net.tw/30th/presentation/220101.pdf

tmpfs

virtual file systems 就應用程式而言,跟其它檔案系統一樣使用 open(), read(), write(), link(), mkdir() 等對檔案和目錄操作,但存在記憶體的關係,速度會較快。

tmpfs 使用 RAM 和 swap,kernel 設定是 CONFIG_TMPFS

建立 tmpfs 檔案系統只需要直接掛載它
mount -t tmpfs name mount_point
name 只是顯示在 /proc/mounts,或指令 mount 或 df 的名稱。
mount_point 是掛載點
tmpfs 檔案系統動態調整大小,預設上限是 RAM 的一半,size=nbytes 選項可限制上限。

除了作為一般檔案系統,tmpfs 有兩種特殊用途:
  • kernel 內部掛載一個不可見的 tmpfs 作為 System V shared memory (TLPI §48) 和 shared anonymous memory mappings (TLPI §49)。
  • 掛載在 /dev/shm 的 tmpfs 作為 glibc 實作的 POSIX shared memory 和 POSIX semaphores。
參考:
TLPI §14.10

2019年10月11日 星期五

Early User Space

Linux 開機最後需要掛載根目錄 (rootfs) 後執行 /sbin/init。Early User Space 是在掛載真正 rootfs 前掛載的暫時 rootfs,執行裡面的程式後才掛載真正的 rootfs。

好處:
  • rootfs 所在的儲存裝置較複雜時,例如 SCSI 裝置、software RAID volume、USB storage、LVM、NFS、或者有加密等,需要特別的準備工作才能使用,不好在 kernel 實作。
  • Early user space 可偵測及載入需要的 kernel 模組,可有更多 rootfs 選擇。
  • 使用外部可載入的 kernel 模組,可縮小 Linux kernel 本身體積,特別是在記憶體有限的電腦。
  • Linux 發行版可提供一個通用的 Linux kernel image,但不同的 Early User Space image 來支援各式各樣的硬體能開機。
  • 支援 hibernation。suspends 關機前備份記憶體內容,下次開機載回到記憶體。
  • 在 Embedded Linux,Early User Space 常直接作為真正的 rootfs。
有 initrd 和 initramfs 兩種方式。

initrd (initial RAM disk) 字面上的意思是「用 RAM disk 作為開機」,將一塊記憶體模擬為 block 裝置的 RAM disk 掛載為暫時的 rootfs。initrd 大致的處理流程如下:
  • [boot loader] 將 kernel 與 initrd 這兩個 image 載入到記憶體。
  • [boot loader -> kernel] 執行權交給 Linux kernel
    • 範例開機參數:image = /bzImage initrd = /boot/initrd.gz append = "root=/dev/ram0 rw"
  • [kernel] 進行一系列初始化動作,將 initrd 所在的記憶體解壓縮到 /dev/ram0 成為 RAM disk,掛載為暫時性的 rootfs。釋出 initrd 所在的記憶體。
  • [kernel -> user-space] kernel 準備執行 /dev/ram0 上的 /linuxrc 程式,切換到 user space。
  • [user space] /linuxrc 與相關的程式執行,pivot_root 掛載真正的 rootfs。
  • [user-space -> kernel] /linuxrc 執行完畢,執行權轉回 kernel。
  • [kernel] 執行新 rootfs 的 /sbin/init。
  • [user space] 執行各式系統與應用程式 
RAM disk 本身是 block 裝置,必須綁定一個檔案系統,通常使用 ext2 或 cramfs,需要 kernel 內建支援。

initrd 問題:
  • initrd 本身是 block device,必須綁定一個檔案系統。
  • initrd block device 建立時要指定空間大小,不好維護。
  • initrd 時的檔案操作實際上是不斷將 /dev/initrd (對應於某段記憶體) 對應到可存取檔案系統的記憶位址,做了不必要的資源消耗
  • Linux 在設計上盡可能 cache block device 讀寫中的檔案或目錄,會自 ramdisk 中複製資料到 page cache 與 dentry cache,徒增資源使用的浪費。
Linus Torvalds 將這些 cache 掛載為檔案系統的想法實做了 ramfs,其實就只是 cache 機制的延伸。隨後在其他開發者的改進下成為 tmpfs,支援寫入 swap 空間與限制記憶體使用量等。而 initramfs 就是建構於 tmpfs 的基礎上。以下是 initrd 和 initramfs 的概念性比較:

initrd initramfs
映像檔 壓縮過的檔案系統 (如 ext2 + gzip) 封裝過的檔案 (cpio + gzip)
實做途徑 block device (RAM disk) tmpfs
首先執行的程式 /linuxrc /init
掛載 rootfs 方式 先將 rootfs 掛載在某個目錄,再 pivot_root 切換為 rootfs。 使用 switch_root
參考
  1. https://en.wikipedia.org/wiki/Initial_ramdisk
  2. http://blog.linux.org.tw/~jserv/archives/001954.html
  3. cpio-initrd 
  4. http://riverhippo.blogspot.tw/2010/04/linux-26-initramfs.html

2019年10月9日 星期三

USB Speed

USB 規範有幾個面向,包括連接器供電等,這裡談傳輸速度。如下表。

Speed速率USB 版本認定方式說明
Low-Speed1.5 Mb/s1.0 以後週邊 1.5 kΩ 拉高 D-。大多用在 Human Interface Devices (HID),例如鍵盤、滑鼠、搖桿等。
Full-Speed12 Mb/s1.0 以後週邊 1.5 kΩ 拉高 D+。所有 USB Hub 皆支援。
Hi-Speed480 Mb/s2.0 以後透過 chirping 步驟。Hi-Speed hub 有 Transaction Translator 功能,從 Hi-Speed 的資料流分出 Full Speed 及 Low Speed 的資料流。
Super-Speed5 Gb/s3.0 以後?
Super-Speed+10 Gb/s3.0 以後?

USB 的資料訊號 D+ 及 D- 是阻抗 90Ω ±15% 的雙絞線,約 3、4 伏特左右。在主機端,兩者有 15 kΩ pull-down,在沒驅動的時候,訊號停在所謂的 single-ended zero (SE0) 狀態,表示 reset 或 disconnected。10~20 ms SE0 表示 reset。當 D+ 及 D- 一個為 high,一個為 low 為 J 或 K 狀態。

chirping 步驟:週邊先當作自己是 FS 而拉高 D+,然後收到 USB RESET 後改拉高 D− (K) 告訴主機端要用 HS。如果主機端支援 HS,會回 JK 告訴週邊端。週邊端至少要收到 3 sets of KJ chirps 才能切換到 HS。

2019年10月6日 星期日

SNMP MIB

SNMP (Simple Network Management Protocol, 簡易網管協定) 是一種管理網路設備的通訊協定,透過用 MIB (Management Information Base, 管理資訊庫) 描述的管理物件來管理網路設備。

iso(1).org(3).dod(6).internet(1)
  • mgmt(2).mib-2(1)
    • system(1)
      • sysDescr(1)
      • sysObjectID(2): 1.3.6.1.4.1. 開頭的 private OID
      • sysUpTime(3)
      • sysContact(4)
      • sysName(5)
      • sysLocation(6)
      • sysServices(7)
      • sysORLastChang(8)
      • sysORTable(9)
        • sysOREntry(1)
          • sysORIndex(1)
          • sysORID(2)
          • sysORDescr(3)
          • sysORUpTime(4)
    • interface(2)
      • ifNumber(1)
      • ifTable(2)
        • ifEntry(1)
          • ifIndex(1)
          • ...
    • at(3)
    • ip(4)
    • icmp(5)
    • tcp(6)
    • udp(7)
    • egp(8)
    • transmission(10)
    • snmp(11)
      • snmpInPkts(1)
      • snmpInBadVersions(3)
      • snmpInBadCommunityNames(4)
      • snmpInBadCommunityUses(5)
      • snmpInASNParseErrs(6)
      • snmpEnableAuthenTraps(30)
      • snmpSilentDrops(31)
      • snmpProxyDrops(32)
  • private(4)
    • cisco(9)
  • snmpv2(6)
    • snmpDomains(1)
    • snmpProxys(2)
    • snmpModules(3)
      • snmpMIB(1)
        • snmpMIBObjects(1)
          • snmpTrap(4)
            • snmpTrapOID(1)
            • snmpTrapEnterprise(3)
          • snmpTraps(5)
            • coldStart(1)
            • warmStart(2)
            • linkDown(3)
            • linkUp(4)
            • authenticationFailure(5)
            • egpNeighborLoss(6)
          • snmpSet(6)
            • snmpSetSerialNo(1)
      • snmpFrameworkMIB(10)
        • snmpFrameworkAdmin(1)
        • snmpFrameworkMIBObjects(2)
          • snmpEngine(1)
            • snmpEngineID(1)
        • snmpFrameworkMIBConformance(3)
延伸閱讀
以XML修飾SNMPMIB以強化網路管理之功能

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...