Forums » Software Development »
Creating a Read-Only Filesystem
Added by Jim Twyman over 11 years ago
Hi,
We use the MityDSP-L138 in a factory automation product and need to prevent fs corruption from random shutdowns. My first attempt was to change the rootfs to read-only in a startup script, but it would be safer if the rootfs was read-only through power-up. I came across the Wiki page below and attempted to see how far I could go with this.
After implementing those changes, the root file system would still be rw after power-up. It finally came up as ro after the following changes.
1) Changed /etc/init.d/checkroot's rootmode to ro. However, I'm not sure if this is necessary.
2) Changed mtab to have rootfs as ro.
rootfs / auto ro 0 0 proc /proc proc rw 0 0 devpts /dev/pts devpts rw,mode=0620,gid=5 0 0 usbfs /proc/bus/usb usbfs rw 0 0 tmpfs /var/volatile tmpfs rw 0 0 tmpfs /dev/shm tmpfs rw,mode=0777 0 0 tmpfs /media/ram tmpfs rw 0 0 /dev/mtdblock1 /mnt/user_nand jffs2 rw,noatime,nodiratime 0 0
My fstab file is as follows -
# stock fstab - you probably want to override this with a machine specific one rootfs / auto defaults,ro 1 1 proc /proc proc defaults 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 usbfs /proc/bus/usb usbfs defaults 0 0 tmpfs /var/volatile tmpfs defaults 0 0 tmpfs /dev/shm tmpfs mode=0777 0 0 tmpfs /media/ram tmpfs defaults 0 0 # uncomment this if your device has a SD/MMC/Transflash slot #/dev/mmcblk0p1 /media/card auto defaults,sync,noauto 0 0 # mount TFS user nand partition /dev/mtdblock1 /mnt/user_nand jffs2 rw,noatime,nodiratime 0 0 #
With these changes it does power-up in readonly mode, but /mnt/user_nand is not actually mounted and thus, access to my application software that should be executed next. Rather, it falls through to the login prompt. I can manually mount /mnt/user_nand and access that partition. The goal is to have /mnt/user_nand be kept ro too and temporarily be changed to rw to update a configuration file.
Below is the power-up and you can see that there are other issues too. Is this the best approach to harden the filesystem?
U-Boot 2009.11 (Mar 31 2011 - 19:39:18) I2C: ready DRAM: 128 MB NAND: 256 MiB MMC: davinci: 0 In: serial Out: serial Err: serial ARM Clock : 300000000 Hz DDR Clock : 150000000 Hz EMIFA CLock : 100000000 Hz DSP Clock : 300000000 Hz ASYNC3 Clock : 150000000 Hz Enet config : 2 MMC 0 Enable : 0 Resetting ethernet phy Net: Ethernet PHY: GENERIC @ 0x03 [0x8] Hit any key to stop autoboot: 0 8192 KiB M25P64 at 0:0 is now current device ## Booting kernel from Legacy Image at c0700000 ... Image Name: Linux-2.6.34-rc1-14815-g0e16b7d Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1981448 Bytes = 1.9 MB Load Address: c0008000 Entry Point: c0008000 Verifying Checksum ... OK Loading Kernel Image ... OK OK Starting kernel ... Uncompressing Linux... done, booting the kernel. Linux version 2.6.34-rc1-14815-g0e16b7d (mitydspl138@mitydspl138-desktop) (gcc version 4.3.3 (GCC) ) #4 PREEMPT Thu Nov 17 15:31:10 EST 2011 CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177 CPU: VIVT data cache, VIVT instruction cache Machine: MityDSP-L138 Peripheral Config Block Found Enet_Config = 2 PHYMask = 0x8 No LCD Configured UART[0] = 0, 0, 0, 115200 UART[1] = 1, 1, 0, 115200 UART[2] = 0, 0, 0, 115200 SPI[0] = 0, 0, 00, 0, 0 SPI[1] = 1, 1, 01, 0, 30000000 Memory policy: ECC disabled, Data cache writethrough DaVinci da850/omap-l138 variant 0x0 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 24384 Kernel command line: mem=96M console=ttyS1,115200n8 mtdparts=nand:128M(rootfs),-(userfs) ro root=/dev/mtdblock0 ro rootfstype=jffs2 ip=off PID hash table entries: 512 (order: -1, 2048 bytes) Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) Memory: 96MB = 96MB total Memory: 93320k/93320k available, 4984k reserved, 0K highmem Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) DMA : 0xff000000 - 0xffe00000 ( 14 MB) vmalloc : 0xc6800000 - 0xfea00000 ( 898 MB) lowmem : 0xc0000000 - 0xc6000000 ( 96 MB) modules : 0xbf000000 - 0xc0000000 ( 16 MB) .init : 0xc0008000 - 0xc002a000 ( 136 kB) .text : 0xc002a000 - 0xc039a000 (3520 kB) .data : 0xc03b4000 - 0xc03d69e0 ( 139 kB) Experimental preemptable hierarchical RCU implementation. NR_IRQS:245 Console: colour dummy device 80x30 Calibrating delay loop... 149.50 BogoMIPS (lpj=747520) Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok DaVinci: 144 gpio irqs regulator: core version 0.5 NET: Registered protocol family 16 mityomapl138_init... mityomapl138_setup_nand: using 16 bit data EMAC: MII PHY configured, RMII PHY will not be functional mityomapl138_init: setting phy_mask to 8 mityomapl138_init: no LCD device enabled bio: create slab <bio-0> at 0 SCSI subsystem initialized usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb regulator: VDCDC1: 1150 <--> 1350 mV at 1200 mV regulator: VDCDC2: 1710 <--> 1910 mV at 3300 mV regulator: VDCDC3: 1120 <--> 1320 mV at 1800 mV regulator: LDO1: 1800 mV regulator: LDO2: 3300 mV Switching to clocksource timer0_1 NET: Registered protocol family 2 IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 4096 (order: 3, 32768 bytes) TCP bind hash table entries: 4096 (order: 2, 16384 bytes) TCP: Hash tables configured (established 4096 bind 4096) TCP reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc. msgmni has been set to 182 io scheduler noop registered (default) Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled serial8250.0: ttyS0 at MMIO 0x1c42000 (irq = 25) is a 16550A serial8250.0: ttyS1 at MMIO 0x1d0c000 (irq = 53) is a 16550A console [ttyS1] enabled serial8250.0: ttyS2 at MMIO 0x1d0d000 (irq = 61) is a 16550A brd: module loaded at24 1-0050: 256 byte 24c02 EEPROM (read-only) MityOMAPL138: Found MAC = 00:50:c2:bf:89:7f MityOMAPL138: Part Number = L138-CG-225-Rc MityOMAPL138: setting max frequency to 300 MHz ahci ahci: forcing PORTS_IMPL to 0x1 ahci ahci: AHCI 0001.0100 32 slots 1 ports 3 Gbps 0x1 impl SATA mode ahci ahci: flags: ncq sntf pm led clo only pmp pio slum part ccc scsi0 : ahci ata1: SATA max UDMA/133 irq 67 NAND device: Manufacturer ID: 0x2c, Chip ID: 0xca (Micron NAND 256MiB 3,3V 16-bit) Creating 2 MTD partitions on "davinci_nand.1": 0x000000000000-0x000008000000 : "rootfs" 0x000008000000-0x000010000000 : "homefs" davinci_nand davinci_nand.1: controller rev. 2.5 spi_davinci spi_davinci.1: Controller at 0xfef0e000 console [netcon0] enabled netconsole: network logging started ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver ohci ohci.0: DA8xx OHCI ohci ohci.0: new USB bus registered, assigned bus number 1 Waiting for USB PHY clock good... ohci ohci.0: irq 59, io mem 0x01e25000 hub 1-0:1.0: USB hub found hub 1-0:1.0: 1 port detected omap_rtc omap_rtc: rtc core: registered omap_rtc as rtc0 omap_rtc: RTC power up reset detected omap_rtc: already running i2c /dev entries driver watchdog watchdog: heartbeat 60 sec cpuidle: using governor ladder cpuidle: using governor menu davinci_mmc davinci_mmc.0: Using DMA, 4-bit mode usbcore: registered new interface driver usbhid usbhid: USB HID core driver TCP cubic registered NET: Registered protocol family 17 Clocks: disable unused i2c1 Clocks: disable unused emac Clocks: disable unused mcasp Clocks: disable unused lcdc Clocks: disable unused spi0 Clocks: disable unused mcbsp0 Clocks: disable unused mcbsp1 Clocks: disable unused vpif regulator_init_complete: incomplete constraints, leaving LDO2 on regulator_init_complete: incomplete constraints, leaving LDO1 on regulator_init_complete: incomplete constraints, leaving VDCDC3 on regulator_init_complete: incomplete constraints, leaving VDCDC2 on regulator_init_complete: incomplete constraints, leaving VDCDC1 on emac-mii: probed omap_rtc omap_rtc: setting system clock to 2012-07-20 17:56:18 UTC (1342806978) ata1: SATA link down (SStatus 0 SControl 300) Empty flash at 0x012306a0 ends at 0x01230800 Empty flash at 0x03d2d190 ends at 0x03d2d800 Empty flash at 0x03d350d0 ends at 0x03d35800 jffs2_scan_inode_node(): CRC failed on node at 0x0401efc4: Read 0xffffffff, calculated 0x6f615b7a Empty flash at 0x0401f0e8 ends at 0x0401f800 VFS: Mounted root (jffs2 filesystem) readonly on device 31:0. Freeing init memory: 136K INIT: version 2.86 booting Please wait: booting... Starting udev Remounting root file system... Caching udev devnodes rm: cannot remove '/etc/volatile.cache': Read-only file system chown: /var/volatile/cache: Read-only file system chmod: /var/volatile/cache: Read-only file system chown: /var/volatile/lock: Read-only file system chmod: /var/volatile/lock: Read-only file system chown: /var/volatile/log: Read-only file system chmod: /var/volatile/log: Read-only file system chown: /var/volatile/run: Read-only file system chmod: /var/volatile/run: Read-only file system chown: /var/volatile/tmp: Read-only file system chmod: /var/volatile/tmp: Read-only file system touch: /var/log/wtmp: Read-only file system chown: /var/lock/subsys: Read-only file system chmod: /var/lock/subsys: Read-only file system touch: /var/log/lastlog: Read-only file system chown: /var/log/wtmp: No such file or directory chown: /var/log/lastlog: No such file or directory chmod: /var/log/wtmp: No such file or directory chmod: /var/log/lastlog: No such file or directory touch: /var/run/utmp: Read-only file system chown: /var/run/utmp: Read-only file system chmod: /var/run/utmp: Read-only file system touch: /var/run/resolv.conf: Read-only file system touch: /var/run/resolv.conf: Read-only file system chown: /var/run/resolv.conf: No such file or directory chmod: /var/run/resolv.conf: No such file or directory chown: /var/run/resolv.conf: No such file or directory chmod: /var/run/resolv.conf: No such file or directory Configuring network interfaces... ifup: can't open '/var/run/ifstate': Read-only file system done. Starting portmap daemon: portmap. net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1 INIT: Entering runlevel: 5 mkdir: cannot create directory '/var/run/dbus': Read-only file system mkdir: cannot create directory '/var/volatile/dropbear': Read-only file system creating NFS state directory: /etc/rc5.d/S20nfsserver: line 149: can't create sm/state: Read-only file system done starting 8 nfsd kernel threads: done starting mountd: done starting statd: done Starting syslogd/klogd: done * Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon Timeout reached while wating for return value Could not receive return value from daemon process. ...fail! Starting my configuration /etc/rc5.d/S95_my_startup: line 20: ./init_network: not found /etc/rc5.d/S95_my_startup: line 22: ./start: not found Now Starting my application /etc/rc5.d/S95_my_startup: line 26: ./sensor: not found Sensor startup has completed! .-------. | | .-. | | |-----.-----.-----.| | .----..-----.-----. | | | __ | ---'| '--.| .-'| | | | | | | | |--- || --'| | | ' | | | | '---'---'--'--'--. |-----''----''--' '-----'-'-'-' -' | '---' The Angstrom Distribution mityomapl138 ttyS1 Angstrom 2010.7-test-20101202 mityomapl138 ttyS1 mityomapl138 login:
Replies (7)
RE: Creating a Read-Only Filesystem - Added by Jonathan Cormier over 11 years ago
"I can manually mount /mnt/user_nand and access that partition"
Whats the full command you use to manually mount your partition? Does mount /mnt/user_nand
work?
RE: Creating a Read-Only Filesystem - Added by Jim Twyman over 11 years ago
I had used -
mount -t jffs2 /dev/mtdblock1 /mnt/user_nand
and just -
mount /mnt/user_nand
also works.
RE: Creating a Read-Only Filesystem - Added by Jonathan Cormier over 11 years ago
Your fstab entry doesn't have auto in the options list so it isn't auto mounted on startup. You should probably use the defaults and then override the options you want changed.
defaults Uses the default options that are rw, suid, dev, exec, auto, nouser, and async.
RE: Creating a Read-Only Filesystem - Added by Jonathan Cormier over 11 years ago
rm: cannot remove '/etc/volatile.cache': Read-only file system
chown: /var/volatile/cache: Read-only file system
chmod: /var/volatile/cache: Read-only file system
chown: /var/volatile/lock: Read-only file system
chmod: /var/volatile/lock: Read-only file system
chown: /var/volatile/log: Read-only file system
chmod: /var/volatile/log: Read-only file system
chown: /var/volatile/run: Read-only file system
chmod: /var/volatile/run: Read-only file system
chown: /var/volatile/tmp: Read-only file system
chmod: /var/volatile/tmp: Read-only file system
touch: /var/log/wtmp: Read-only file system
chown: /var/lock/subsys: Read-only file system
chmod: /var/lock/subsys: Read-only file system
touch: /var/log/lastlog: Read-only file system
chown: /var/log/wtmp: No such file or directory
chown: /var/log/lastlog: No such file or directory
chmod: /var/log/wtmp: No such file or directory
chmod: /var/log/lastlog: No such file or directory
touch: /var/run/utmp: Read-only file system
chown: /var/run/utmp: Read-only file system
chmod: /var/run/utmp: Read-only file system
touch: /var/run/resolv.conf: Read-only file system
touch: /var/run/resolv.conf: Read-only file system
chown: /var/run/resolv.conf: No such file or directory
chmod: /var/run/resolv.conf: No such file or directory
chown: /var/run/resolv.conf: No such file or directory
chmod: /var/run/resolv.conf: No such file or directory
Configuring network interfaces... ifup: can't open '/var/run/ifstate': Read-only file system
Udev happens before the tmpfs entries get mounted from the fstab file.
RE: Creating a Read-Only Filesystem - Added by Jim Twyman over 11 years ago
I changed fstab for the /mnt/user_nand to as follows -
/dev/mtdblock1 /mnt/user_nand jffs2 defaults,rw,noatime,nodiratime 0 0
However, the power-up was the same and the partition was not mounted.
RE: Creating a Read-Only Filesystem - Added by Jonathan Cormier over 11 years ago
Jim,
Any luck? As far as I can tell that mount entry should work.
RE: Creating a Read-Only Filesystem - Added by Jim Twyman over 11 years ago
I worked on it some more and ended up with a script with seven patch files that change it to a read-only filesystem. My plan is to setup a time delay relay that toggles the power to a board for a weekend test.