2015年2月16日 星期一

Raspberry SD Card 唯讀



### unionfs

### aufs

### tmpfs
http://raspberrypi.stackexchange.com/questions/5112/running-on-read-only-sd-card


Reference:


### busybox syslog


為了要避免SD卡因為電源插拔損壞,我想要將他改成read only
在網路上搜尋了一下,發現大家的做法很像,但是又不全部一樣
我在試unionfs的時候, 大部分的部落客都是參考同一個德文的網站
我設定完後重開機,進入了raspbien的開機畫面
照理說raspbien的預設使用者名稱為pi,密碼為raspberry
但是我就是沒有辦法進入桌面,看了一下在德文跟英文下面的留言
也有些人跟我一樣遇到這樣的情形,但是沒有人提出真正可能的解決方法
當然我也不是那個咖可以自己找到方法()
不過很多人寫說unionfs很不好用,建議用aufs

所以我又到處尋尋覓覓,試了其他幾個部落客的方法,他們都沒有用unionfs,而是用tmpfs,
但是很多都是在/dev/mmcblk0p1/dev/mmcblk0p2中都設ro(read only),我試了以後開機直接進入黑屏.......

後來又搜尋到referece中的寫的方法,但是他只設/dev/mmcblk0p1read only
只有這樣我才能順利開機,但是這方法是不是真的能讓sd卡不受摧毀????
只能待時間來證明了!!!
但是最重要的還是要更加深入的了解linux!!!!


$ sudo nano /etc/defaults/rcS
在最後加入
RAMTMP=yes
但是之後不知道長時間開機的話會不會造成記憶體空間不足?
如果安裝時造成記憶體空間不足,需要把這個參數改成no

開機時,會根據/etc/fstab裡面的內容,把需要的裝置掃瞄一遍
$ sudo nano /etc/fstab



鳥哥的網站對此有詳細的說明 (http://linux.vbird.org/linux_basic/0230filesystem.php)
掛載限制
根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。
    其它 mount point 必須為已建立的目錄﹐可任意指定﹐但一定要遵守必須的系統目錄架構原則
    所有 mount point 在同一時間之內﹐只能掛載一次。
    所有 partition 在同一時間之內﹐只能掛載一次。
    如若進行卸載﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外。
下面六個參數
1. 掛載的系統位置
  1. 要被掛載的目錄
  2. 系統檔案類型
  3. 系統檔案參數
    ro : read only
    nodev : 允許此 partition 上,可建立裝置檔案
    nosuid : 允許此 partition 含有 suid/sgid 的檔案格式
    noatime: 別記錄讀取時間, 會造成部份程式失常。
    Errors : remount-ro - 重新掛載檔案系統成只讀模式,可以令系統有限度地繼續運作但減低損害檔案系統資料的機會。
    defaults : 同時具有rw, suid, dev, exec, auto, nouser, async 等參數。 基本上,預設情況使用 defaults 設定即可!
    Mode = 1777 : 粘滯位(Sticky bit),或粘著位,是Unix文件系統許可權的一個旗標。最常見的用法在目錄上設置粘滯位,如此以來,只有目錄內文件的所有者或者root才可以刪除或移動該文件。如果不為目錄設置粘滯位,任何具有該目錄寫和執行許可權的用戶都可以刪除和移動其中的文件。
  4. 能否被 dump 備份指令作用: 0 代表不要做 dump 備份, 1 代表要每天進行 dump 的動作。 2 也代表其他不定日期的 dump 備份動作, 通常這個數值不是 0 就是 1 啦!
  5. 是否以 fsck 檢驗磁區: 開機的過程中,系統預設會以 fsck 檢驗我們的 filesystem 是否完整 (clean)。 不過,某些 filesystem 是不需要檢驗的,例如記憶體置換空間 (swap) ,或者是特殊檔案系統例如 /proc /sys 等等。所以,在這個欄位中,我們可以設定是否要以 fsck 檢驗該 filesystem 喔。 0 是不要檢驗, 1 表示最早檢驗(一般只有根目錄會設定為 1)2 也是要檢驗,不過 1 會比較早被檢驗啦! 一般來說,根目錄設定為 1 ,其他的要檢驗的 filesystem 都設定為 2 就好了。

最後一個參數預設是2,之前做失敗的版本/dev/mmcblk0p1也都是保持2,但是這個成功的 版本是1,不確定是不是也有關連?

Tmpfs (http://zh.wikipedia.org/wiki/Tmpfs):
tmpfs在類Unix作業系統上是一個常見的名稱會用來做為暫時的檔案儲存方式,在更多的情況下,它會用虛擬的記憶體而不是一個永久保存的媒體來做為在檔案系統上的使用。
所有在 tmpfs 上儲存的資料在理論上都是暫時借放的,那也表示說,檔案不會建立在硬碟上面。一旦重新開機,所有在 tmpfs 裡面的資料都會消失不見。理論上,記憶體使用量會隨著 tmpfs 的使用而時有增長或消減。目前有許多 Unix 的發行版都有啟用 tmpfs ,預設是把它以共享記憶體的方式用在系統的/tmp 目錄底下。
tmpfs 在 Linux kernel 2.4 之後的版本都有支援。tmpfs(之前比較為人所知的名稱是 "shmfs")和 Linux 的 ramdisk 裝置定位有所不同。 Ramdisk 是固定劃分一塊記憶體出來使用,且允許比較不常用的頁面可以移動到置換空間去。
tmpfs 的用法,舉例來說是像: "mount -t tmpfs -o size=1G,nr_inodes=10k,mode=0700 tmpfs /space" 這樣就會使用 GiB 的置換空間,裡頭有 10240 inodes 且規定是在 /space 目錄底下存取。這個檔案系統的大小是可以隨時調整的,像是再追加一個指令如:mount -o remount,size=2G /space"要註記一點,如果/tmp 有安全上的顧慮的話,最好追加 sticky bit 上來. 就是權限應該被設作 "mode=1777" ,而不是 "mode=0777 "mode=777"


$ sudo nano /etc/init.d/hwclock.sh

60行的地方把-f改成-L



$ sudo nano /etc/init.d/hwclock.sh
裡面加入這行
BLKID_FILE="/var/local/blkid.tab"

修正mtabmounted file systems table這種檔案記錄著當前已掛載的檔案系統以及它們的初始化選項 )
sudo rm /etc/mtab
sudo ln -s /proc/self/mounts /etc/mtab

/etc/apt/apt.conf:這個並不是 APT Server 的記錄檔,而是當我們在指令列模式下達 APT 的指令時 (如底下執行檔部分會介紹的 apt-get ),該指令的環境參數。一般來說,使用預設值就可以了!不需要更動他。

如果使用者用apt-get則會自動remountrw,但是如果NO_APT_REMOUNT -no,則保持為Read Only
$ sudo nano /etc/apt/apt.conf


可以下command讓系統改回rw
mount -o remount,rw /

或是回到ro
mount -o remount,ro /

mount可以看到下列


----------------------------- 另一種方法分隔線 -------------------------------

後來我又看到有些人寫另一種方法用busybox syslog
很興奮的試了一下,結果竟然進入command line模式...
而且還要輸入帳號密碼,變成兩個都要寫pi
linux 一竅不通的我完全不知道怎麼回事
我猜是前面幾個移除不需要的配件時,應該把自動登入的設定拿掉了(我自己猜的)

所以我試了一下先不要移除任何東西
然後下載busybox syslog

The reason for doing this is because we do not want logfiles, but we want to be able to do some debugging (read logfiles). busybox-syslogd does not write logfiles but logs to a ring-buffer in memory which can be displayed using the logread command:
apt-get install busybox-syslogd
dpkg --purge rsyslog

/etc/init.d/checkroot.sh /etc/init.d/checkfs.sh 裡面case 1 下的do_start 註解起來
再把 /etc/init.d/checkroot-bootclean.sh 下的這兩個註解起來
rm -f /tmp/.clean /lib/init/rw/.clean /run/.clean /run/lock/.clean
clean_all


移除啟動時的script
insserv -r bootlogs
insserv -r sudo
insserv -r alsa-utils
insserv -r console-setup
insserv -r fake-hwclock

/etc/fstab 內改成,這跟上面的方法不同
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults,ro 0 2
/dev/mmcblk0p2 / ext4 defaults,ro 0 1
tmpfs /tmp tmpfs defaults 0 0

最後一個是要把 /boot/cmdline.txt 的最後加上ro,但是如果加上了ro,就會變黑屏無法開機
後來我在windows,boot裡面的這個ro拿掉才可以順利開機


我的感覺是雖然好像把系統改成read only,只要把/etc/fstab 內的其中一個或是兩個partition改成ro,但是其他的配套措施,每個人有自己不同的解決方法,所以在搜尋的過程中其實真的是混亂!


如果第一種方法不是真的read only,可能可以換成第二種方法試試吧??




沒有留言:

張貼留言