質問編集履歴

3

環境・要求事項を追記

2017/04/05 06:17

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -26,6 +26,22 @@
26
26
 
27
27
 
28
28
 
29
+ ■ 環境・要求事項
30
+
31
+ ** OS:Raspbian Kernel:4.4.38-v7+
32
+
33
+ ** 保存が必要なデータはUSBメモリに記憶する。
34
+
35
+ ** lazarusで作成したGUI画面を液晶に表示させる。
36
+
37
+ ** Webサーバ(lighttpd)を搭載し遠隔地からステータス表示・制御可能。
38
+
39
+ ** ラズパイのGPIO、GPIO-sirialを使用(外部デバイス制御の為)
40
+
41
+ ** 現在は開発の為、SSH,Sambaを使用しているが実際の使用時には不要。
42
+
43
+ ** 電源ブチギリ時のSDカード保護の為、SDカード全体をリードオンリーにしたい。
44
+
29
45
 
30
46
 
31
47
  ■ 発生している問題

2

環境と再現手順追記。余計な情報消去。

2017/04/05 06:17

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -26,12 +26,280 @@
26
26
 
27
27
 
28
28
 
29
+
30
+
31
+ ■ 発生している問題
32
+
33
+ ** protectで起動した時、bootパーテーションが全て消去されている。
34
+
35
+ ** このとき、rootfsは全て正常でした。
36
+
37
+
38
+
39
+ ■ 再現手順
40
+
41
+ 1) SWAPサービス無効
42
+
43
+ ```
44
+
45
+ $ sudo apt-get install chkconfig
46
+
47
+ $ sudo chkconfig dphys-swapfile off
48
+
49
+ ```
50
+
51
+ 2) テンポラリファイル生成抑制
52
+
53
+ /etc/fstabを以下のように編集
54
+
55
+ ```
56
+
57
+ proc /proc proc defaults 0 0
58
+
59
+ /dev/mmcblk0p1 /boot vfat defaults 0 2
60
+
61
+ /dev/mmcblk0p2 / ext4 defaults,noatime 0 1
62
+
63
+ # a swapfile is not a swap partition, no line here
64
+
65
+ # use dphys-swapfile swap[on|off] for that
66
+
67
+ # ↓追加
68
+
69
+ tmpfs /tmp tmpfs defaults,size=32m 0 0
70
+
71
+ tmpfs /var/tmp tmpfs defaults,size=16m 0 0
72
+
73
+ tmpfs /var/log tmpfs defaults,size=32m 0 0
74
+
75
+ tmpfs /var/www/mrtg tmpfs defaults,size=2m 0 0
76
+
77
+ ```
78
+
79
+ 3) 一旦再起動してdf -hでtmpfsができていることを確認
80
+
81
+
82
+
83
+ 4) unionfs-fuseパッケージインストール
84
+
85
+ ```
86
+
87
+ $ sudo apt-get install unionfs-fuse
88
+
89
+ ```
90
+
91
+
92
+
93
+ 5) スクリプトのコピー
94
+
95
+ ```
96
+
97
+ $ sudo cp /usr/share/doc/unionfs-fuse/examples/S01a-unionfs-fuse-live-cd.sh /etc/init.d/a-unionfs-fuse-live-cd
98
+
99
+ $ sudo cp /usr/share/doc/unionfs-fuse/examples/rc.local.omit-pid.sh /usr/local/sbin/a-unionfs-fuse-omit-pid.sh
100
+
101
+ ```
102
+
103
+
104
+
105
+ 6) /etc/init.d/a-unionfs-fuse-live-cd を以下のようにする
106
+
107
+ ```
108
+
109
+ #!/bin/sh
110
+
111
+
112
+
113
+ ### BEGIN INIT INFO
114
+
115
+ # Provides: a-unionfs-fuse-live-cd
116
+
117
+ # Required-Start: mountall-bootclean
118
+
119
+ # Required-Stop:
120
+
121
+ # Default-Start: S
122
+
123
+ # Default-Stop:
124
+
125
+ # X-Start-Before: procps udev-mtab urandom
126
+
127
+ # Short-Description: UnionFS mode
128
+
129
+ # Descrition: Shutdown process will not be required
130
+
131
+ ### END INIT INFO
132
+
133
+
134
+
135
+ # Copyright: Bernd Schubert <bernd.schubert@fastmail.fm>
136
+
137
+ # BSD license, see LICENSE file for details
138
+
139
+ FUSE_OPT="-o allow_other,use_ino,suid,dev,nonempty"
140
+
141
+ CHROOT_PATH="/tmp/unionfs"
142
+
143
+ UNION_OPT="-ocow,chroot=$CHROOT_PATH,max_files=32768"
144
+
145
+ UBIN=/usr/bin/unionfs-fuse
146
+
147
+ cd /boot
148
+
149
+ file=noprotect
150
+
151
+ if [ -e ${file} ]; then
152
+
153
+ echo "${file} exists"
154
+
155
+ exit 0
156
+
157
+ fi
158
+
159
+ mount -o remount,ro /dev/mmcblk0p1 /boot
160
+
161
+ mount -t proc proc /proc
162
+
163
+ mount -t tmpfs tmpfs /tmp
164
+
165
+ mkdir -p $CHROOT_PATH/root
166
+
167
+ mkdir -p $CHROOT_PATH/rw
168
+
169
+ mkdir -p /tmp/union
170
+
171
+ mount --bind / $CHROOT_PATH/root
172
+
173
+ $UBIN $FUSE_OPT $UNION_OPT /rw=RW:/root=RO /tmp/union
174
+
175
+ mount -t proc proc /tmp/union/proc
176
+
177
+ cd /tmp/union
178
+
179
+ mkdir oldroot
180
+
181
+ pivot_root . oldroot
182
+
183
+ mount -o remount,ro /dev/root /oldroot
184
+
185
+ for d in dev run run/lock sys run/shm dev/pts boot
186
+
187
+ do
188
+
189
+ mount --bind /oldroot/$d /$d
190
+
191
+ done
192
+
193
+ init q
194
+
195
+ /usr/local/sbin/a-unionfs-fuse-omit-pid.sh
196
+
197
+ exit 0
198
+
199
+ ```
200
+
201
+ 7) initスクリプト有効化
202
+
203
+ ```
204
+
205
+ $ sudo update-rc.d a-unionfs-fuse-live-cd defaults
206
+
207
+ ```
208
+
209
+ 8) モード切替スクリプト作成(noprotect)
210
+
211
+ $ sudo vi /usr/local/bin/noprotec
212
+
213
+ ```
214
+
215
+ #!/bin/sh
216
+
217
+ mount -o rw,remount /boot
218
+
219
+ cd /boot
220
+
221
+ if [ -e "protect" ]; then
222
+
223
+ rm /boot/protect
224
+
225
+ fi
226
+
29
- これがダメなら aufs + fsprotectでのリードオンリーも考えて
227
+ if [ -e "noprotect" ]; then
30
-
228
+
31
- いますが、既にラズベリーパイに開発環境やwebサーバ等を入れて
229
+ echo "noprotect mode"
230
+
32
-
231
+ else
232
+
233
+ touch /boot/noprotect
234
+
235
+ echo "noprotect mode"
236
+
237
+ fi
238
+
239
+ mount -o ro,remount /boot
240
+
241
+ ```
242
+
243
+ 9) モード切替スクリプト作成(protect)
244
+
245
+ $ sudo vi /usr/local/bin/noprotec
246
+
247
+ ```
248
+
249
+ #!/bin/sh
250
+
251
+ mount -o rw,remount /boot
252
+
253
+ cd /boot
254
+
255
+ if [ -e "noprotect" ]; then
256
+
33
- セットアップ済みの為、カーネル構築からとなってしまう
257
+ rm /boot/noprotect
258
+
34
-
259
+ fi
260
+
35
- aufs + fsprotectの方法は、出来ればしたくない状況です。
261
+ if [ -e "protect" ]; then
262
+
36
-
263
+ echo "protect mode"
264
+
265
+ else
266
+
267
+ touch /boot/protect
268
+
269
+ echo "protect mode"
270
+
271
+ fi
272
+
273
+ mount -o ro,remount /boot
274
+
275
+ ```
276
+
277
+ 10) 権限付与
278
+
279
+ ```
280
+
281
+ $ sudo chmod a+x /usr/local/bin/noprotect
282
+
283
+ $ sudo chmod a+x /usr/local/bin/protect
284
+
285
+ ```
286
+
287
+
288
+
289
+ 11) Read Only モードに切り替え、再起動
290
+
291
+ ```
292
+
293
+ $ sudo protect
294
+
295
+ $ sudo reboot
296
+
297
+ ```
298
+
37
- (カーネルコンパイルするLinuxマシンが手元ないもあます)
299
+ ※この再起動時、通常再起動よ明らかに長い期間あった。
300
+
301
+ ※おそらくここで/bootパーテーションがクリアされていると推測される
302
+
303
+ ※この再起動後、/bootパーテーションは全て消去されており
304
+
305
+ ※この状態で再起動したのでそれ以降起動でき無かった。

1

Tag追加

2017/04/04 09:20

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
File without changes