Eu tenho trabalhado nisso. Uma configuração de livecd-to-usb não estava funcionando muito bem para mim. Eu criei uma versão modificada do script "local" para o servidor ubuntu 11.04. Depois de aplicar o patch (ou manualmente editar localmente com as mudanças, é claro) você precisa apenas de update-iniramfs -u, e boot linux com um argumento de kernel "ramboot", e seu sistema irá inicializar um sistema linux normal completamente em ram. Fazer alterações persistentes é tão fácil quanto rsyncar o sistema de arquivos ramdisk no dispositivo de inicialização. No meu caso, uma caneta usb, mas poderia ser facilmente qualquer dispositivo de bloco inicializável adequado. Você pode, é claro, apenas reiniciar sem o argumento "ramboot" e fazer mudanças, já que você estará de volta no dispositivo de bloco, e então reiniciará no ramboot novamente, mas não há necessidade, exceto deixar bem claro quando você está em qual estado.
0) "sudo su"
(você não tem que fazer este passo, mas então você precisa ter certeza de que você suou tudo o que possa exigir) Eu tendo apenas "sudo su" quando estou fazendo este tipo de modificações de sistemas.
1) faça o download ou copie / cole o conteúdo deste patch em um arquivo:
"/ usr / share / initramfs-tools / scripts / ramboot.patch" - não poderia incluir pastebin, newbie.
incluído no final
2) cd / usr / share / initramfs-tools / scripts; cp local local.bak #apenas no caso
3) remendo local ramboot.patch
Isso aplica as alterações definidas no ramboot.patch ao seu script local. / usr / share / initramfs-tools / scripts / local é o configurador de script de inicialização normal que configura a função rootmount para init. O patch foi criado por "diff local local.modified & gt; ramboot.patch"
4) cp / bin / busybox / usr / lib / initramfs-tools / bin / busybox
Isso torna o arquivo initramfs.img um pouco maior do que seria normalmente, mas a diferença é de cerca de 1,5 megabytes, não major. Eu queria a saída legível por humanos do df -h, que o df do busybox despojado não suporta. Se você se preocupa em manter a versão de 300k do busybox, certifique-se de cp / usr / lib / initramfs-tools / bin / busybox / small_busybox e, em seguida, retorne ao seu nome / local anterior após a etapa 5.
5) update-initramfs -u
6) opcional você provavelmente irá querer criar um /etc/grub.d/06_custom, com o argumento do kernel "ramboot" incluído, e um título que implica isso.
(ou 40_custom se você quiser que a entrada do menu ramboot esteja no final da lista, em vez de no topo)
por exemplo. 06_custom - não foi possível incluir o link pastebin, novato aqui.
você precisará preencher sua versão do kernel e initrd.img-verion corretos e também o sistema de arquivos uuid do seu dispositivo raiz neste arquivo 06_custom ou então não funcionará.
você pode encontrar as informações do kernel / initrd.img olhando apenas em / boot / com "ls / boot" e o seguinte comando deve mostrar o seu sistema de arquivos raiz uuid:
blkid | grep 'df / | grep dev | cortar -d' '-f1' | cortar -d '"' -f2
Uma vez que seu 06_custom tem os caminhos e nomes de arquivos uuid, kernel e initrm.img corretos, você pode atualizar o grub e testá-lo!
7) update-grub para adicionar as entradas personalizadas ao seu arquivo /boot/grub/grub.cfg.
Nota: Eu tenho um pequeno sistema com a partição raiz, incluindo apenas cerca de 1,2 g de dados para copiar em memória RAM. Se o seu sistema não tiver memória sobressalente suficiente, este script inicializará com segurança normalmente (ou pelo menos tentará!) Encontrei remastersys e instalações persistentes de usb-casper para não serem exatamente adequadas às minhas necessidades.
Isso é usado em um servidor scst-iscsi atualmente, e é apenas uma fraqueza real se você não salvar as alterações no sistema e perder energia, ou algum outro erro (init 0, oh não, eu esqueci de verifique meu trabalho de volta ao subversion! disaster!) então o sistema ramdisk não faz nada persistente. Eu ainda não tenho uma tonelada de tempo nessa configuração, mas desde que eu procurei por esse tipo de informação, encontrei muitas maneiras que não eram exatamente adequadas, ou simplesmente confusas para mim, eu pensei Coloque isso lá fora. talvez isso salve alguém com um pequeno dente puxando * 8 ^)
remastersys e os scripts root-ro me ajudaram nesse ponto. ambos são projetos úteis, mas diferentes. O remastersys empacota seu sistema em execução, tanto para implantar / clonar, quanto para rodar como uma versão live.iso do sistema, ou backup, eu acho. root-ro é um sistema de arquivos dual-ramdisk sistema de arquivos montado no estilo de união, com o ramdisk gravável, e o blockdev somente leitura. então para sincronizar você pode simplesmente remontar o blockdev rw, rsync uma ramificação para a outra e remontá-lo novamente. Isso era quase perfeito, mas eu queria que a caneta usb fosse desmontada / pudesse ser removida e o sistema manteria seu estado, o que esta solução faz.
raiz-ro inferior da página - link
remastersys - link
Você pode facilmente rsync ou copiar -r a partir do ramboot (montado em /) e do disco / dispositivo de onde ele veio originalmente quando rodando em memória ram, para tornar essa mudança "persistente".
Eu salvo o uuid do dispositivo que o ramboot inicializou, para que você possa sempre encontrá-lo depois. Está em /.bootdisk_byuuid no ramdisk, e você pode facilmente configurar um script para montar este dispositivo em algum lugar, fazer o rsync, e desmontá-lo novamente, e chamar esse script de "ramtodisk" ou qualquer outra coisa.
NB! você pode querer fazer o backup de seu arquivo /boot/initrd.img para que, caso algo dê errado, seu sistema ainda seja inicializável. Eu salvei o meu para / boot / initrd enquanto trabalhava nisso. quando eu tinha problemas com o grub / init, eu apenas editei meu initrd para apontar para o arquivo backup / boot / initrd e voltei para a depuração. de qualquer forma, eu estou supondo que isso é mais orientações não livro de receitas. diverta-se! leva meu sistema de 1.2gig 9: 30ish para inicializar em usb 1.1, 1: 30-45 em usb 2.0 e ~ = 35 segundos em usb 3.0 para carregar em ram. mais e mais suculenta a cada ano! * 8 ^)
aqui está o ramboot.patch
2a3,13
> parse_cmdline() {
> RAM=""
> for x in $(cat /proc/cmdline); do
> case $x in
> ramboot)
> RAM="Yes" ;;
> quiet)
> quiet=y ;;
> esac
> done
> }
66c77
<
---
> parse_cmdline
90,91c101,164
< # Mount root
< mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}
---
> # Mount root - custom ramboot.patch
> # By: Justin Perkins -- 4/25/12 Email: [email protected]
> if [ -z "${RAM}" ]; then
> mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}
> else
> mkdir /ramboot
> mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /ramboot
> log_begin_msg "Detecting system resources"
> size=$(df|grep ramboot|tr -s ' '|cut -d ' ' -f3)
> datasize=${size}
> size=$(expr ${size} + ${size} / 20 ) #5% more to be sure
> freespace=$(awk '/^MemFree:/{f=} /^Cached:/{c=} END{print f+c}' /proc/meminfo)
> log_end_msg
> if [ "${freespace}" -lt "${size}" ] ; then
> echo "Not enough system RAM, ${freespace}k > ${size}k."
> echo "Attempting normal rootmount."
> mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}
> else
> if [ "$quiet" != "y" ] ; then
> tstart_min=$(date|cut -d ' ' -f4|cut -d : -f2)
> tstart_sec=$(date|cut -d ' ' -f4|cut -d : -f3)
> mount -t tmpfs -o size=100% none ${rootmnt}
> cd ${rootmnt}
> size=$(df -h|grep ramboot|tr -s ' '|cut -d ' ' -f3) #reuse size
> echo "System size: ${size} (${datasize}k) this may take a couple of minutes."
> log_begin_msg "Copying system files into RAM"
> echo -e -n "\b"
> cp -rfa /ramboot/* ${rootmnt} &
> pid=$!
> while [ ! ${pid} == "done" ] ; do
> alive=$(ps -o pid,args|grep -E ${pid}|grep -v grep)
> alive=$(echo ${alive}|cut -d ' ' -f1)
> if [ -z ${alive} ] ; then pid="done" ; fi
> printf "."
> sleep 1
> done
> log_end_msg
> echo ${ROOT} > ${rootmnt}/.bootdisk_byuuid
> tend_min=$(date|cut -d ' ' -f4|cut -d : -f2)
> tend_sec=$(date|cut -d ' ' -f4|cut -d : -f3)
> if [ ${tend_sec} -lt ${tstart_sec} ] ; then
> tend_sec=$(expr ${tend_sec} + 60)
> tend_min=$(expr ${tend_min} - 1)
> fi
> if [ ${tend_min} -lt ${tstart_min} ] ; then
> tend_min=$(expr ${tend_min} + 60)
> fi
> tduration_min=$(expr ${tend_min} - ${tstart_min})
> tduration_sec=$(expr ${tend_sec} - ${tstart_sec})
> echo "Copy complete, duration: $tduration_min minutes $tduration_sec seconds."
> freespace=$(awk '/^MemFree:/{f=} END{print f}' /proc/meminfo)
> freespace=$(expr ${freespace} + 425000) #this accounts for the temporal settling issue
> echo "You have approximately ${freespace}k free RAM after loading the ramboot."
> if [ ${freespace} -lt "502400" ] ; then echo "Warning! you have critically low system RAM free after ramboot." ; fi
>
> else
> cp -rfa /ramboot/* ${rootmnt}
> echo ${ROOT} > ${rootmnt}/.bootdisk_byuuid
> freespace=$(awk '/^MemFree:/{f=} END{print f}' /proc/meminfo)
> if [ ${freespace} -lt "102400" ] ; then echo "Warning! you have critically low system RAM free after ramboot." ; fi
> fi
> fi
> umount /ramboot
> fi #end custom ramboot.patch
06_custom
#!/bin/sh
exec tail -n +3 %pre%
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
#uuid_<placeholder>, and vmlinuz-<placeholder>, and initrd.img-<placeholder> and
#set root='(hd0,2)' need to be replaced with your system's values, although, if you
#get the hd0,2 wrong, but the uuid correct, grub will grep around and find it anyhow.
menuentry "Ubuntu, with Linux Custom-Ramboot" {
recordfail
set root='(hd0,2)'
search --no-floppy --fs-uuid --set=root uuid_placeholder
linux /boot/vmlinuz-<placeholder> root=UUID=<uuid-placeholder> ro ramboot
initrd /boot/initrd.img-<placeholder>
}