¿Por qué initramfs monta el sistema de archivos raíz de solo lectura?

12

¿Cuál es la razón para que el sistema de archivos raíz se monte roen initramfs (y en initrd)?

Por ejemplo, la guía Gentoo initramfs monta el sistema de archivos raíz con:

mount -o ro /dev/sda1 /mnt/root

¿Por qué no lo siguiente?

mount -o rw /dev/sda1 /mnt/root

Puedo ver que probablemente haya una buena razón (y probablemente implique switchroot), sin embargo, no parece estar documentada en ningún lado.

Portablejim
fuente

Respuestas:

19

El ramdisk inicial (initrd) es típicamente una versión simplificada del sistema de archivos raíz que contiene solo lo que se necesita para montar el sistema de archivos raíz real y evitar el arranque.

El initrd existe porque en los sistemas modernos, el gestor de arranque no puede ser lo suficientemente inteligente como para encontrar el sistema de archivos raíz de manera confiable. Hay demasiadas posibilidades para un programa tan pequeño como el gestor de arranque para cubrir. Considere la raíz NFS, las tarjetas RAID no estándar, etc. El gestor de arranque tiene que hacer su trabajo utilizando solo el BIOS más cualquier código que pueda introducirse en el sector de arranque.

El initrd se almacena en algún lugar que el gestor de arranque puede encontrar, y es lo suficientemente pequeño como para que el espacio extra que ocupa no moleste a nadie. (En pequeños sistemas integrados, generalmente no hay una raíz "real", solo el initrd).

El initrd es precioso: su contenido debe conservarse en todas las condiciones, porque si el initrd se rompe, el sistema no puede arrancar. Una elección de diseño que hicieron sus diseñadores para garantizar esto es hacer que el cargador de arranque cargue el initrd de solo lectura. También hay otros principios que funcionan para esto, como en el caso de los sistemas pequeños donde no hay una raíz "real", todavía se monta por separado /tmp, /var/cachey para almacenar cosas. El cambio de initrd se realiza solo en raras ocasiones y luego debe hacerse con mucho cuidado.

Volviendo al caso normal donde no es un verdadero sistema de ficheros raíz, que inicialmente se montará sólo lectura porque era initrd. Luego se mantiene como de solo lectura el mayor tiempo posible por las mismas razones. Cualquier escritura en la raíz real que deba realizarse se pospone hasta que el sistema se inicie, por preferencia, o al menos hasta el final del proceso de arranque, cuando esa preferencia no se puede satisfacer.

Lo más importante que sucede durante esta fase de solo lectura es que el sistema de archivos raíz se verifica para ver si se desmontó limpiamente. Eso es algo que el gestor de arranque ciertamente podría hacer en lugar de dejarlo al initrd, pero ¿qué sucede si el sistema de archivos raíz no se desmontó limpiamente? Luego tiene que llamar fsckpara verificar y posiblemente arreglarlo. Entonces, ¿dónde sería initrdconseguir fsck, si era responsable de este paso en lugar de esperar hasta que el traspaso a la raíz "real"? Se podría decir que tiene que copiar fscka la initrdhora de construir, pero ahora es más grande. Y además de eso, ¿ cuál fsck copiarás? Los sistemas Linux utilizan regularmente una docena de sistemas de archivos diferentes. ¿Copias solo el necesario para la raíz real en el momento en queinitrd¿es creado? ¿Se aumenta el tamaño initrdcopiando todos los fsck.fooprogramas disponibles en él, en caso de que el sistema de archivos raíz se migre más tarde a otro tipo de sistema de archivos y alguien se olvide de reconstruir el initrd?

Los arquitectos del sistema de arranque de Linux eligieron sabiamente no cargar al initrd con estos problemas. Delegaron la verificación del sistema de archivos raíz real al sistema de archivos raíz real, ya que está en una mejor posición para hacerlo que el initrd.

Una vez que el proceso de arranque ha avanzado lo suficiente como para que sea seguro hacerlo, el initrd se intercambia desde debajo de la raíz real con pivot_root(8), y el sistema de archivos se vuelve a montar en modo lectura-escritura.

Warren Young
fuente
44
Initramfs no está montado solo lectura; el núcleo lo descomprime en un tmpfs de lectura / escritura que está montado como /. También pivot_root () se usa en el initrd ahora depreciado, pero no en un initramfs, que la mayoría de los sistemas usan en estos días (aunque el archivo todavía se llama initrd). Con initrd, pivot_root tuvo lugar antes de ejecutar / sbin / init, que pasó a fsck y volvió a montar r / w. Con un initramfs, simplemente elimina todos los archivos en initramfs, luego los chroots en la raíz real y execs / sbin / init.
psusi
0

Porque durante el arranque, el sistema de archivos raíz siempre se monta inicialmente de solo lectura. Una vez que se completan varias autocomprobaciones, vuelve a montar el sistema de archivos raíz como lectura / escritura y comienza a montar los otros sistemas de archivos.

Shadur
fuente
0

Una razón por la que puedo pensar es para prevenir algún tipo de corrupción. Por ejemplo, puede montar el sistema de archivos ext4 como ext2 (o viceversa) y esto es seguro en modo ro, pero puede causar cambios de formato incompatibles si se monta rw desde initram.

Ah, y hay otra razón: initramfs probablemente no tiene fsck, pero es posible que deba verificar el sistema de archivos antes de montarlo rw.

rvs
fuente