Criando um rootfs para sistemas embarcados a partir de cópia de um sistema já operando
Publicado por Marcelo Barros de Almeida 25/08/2006
[ Hits: 6.669 ]
O script populate.py permite que, à partir de um sistema raiz, seja criado um diretório pronto para ser usado como initrd de um kernel Linux. Ele basicamente assume que o diretório destino sera rootfs, onde existe uma lista de programas a serem copiados do arquivo programs.dat (deve ser usado o caminho completo) e que uma estrutura estática de arquivo pode vir de um diretório data. Talvez seja necessário usar o sudo para rodar.
#!/usr/bin/python
"""
Populate a root file system.
This script copy a list of programs and its related libraries
to a specified destination directory.
Marcelo Barros (barros@smar.com.br)
2006-05-21
"""
import sys
import os
import shutil
def help():
msg="""
Usage:
./populate.py
Always use full path name to specify the programs.
"""
print msg
def execcmd(cmd):
f = os.popen(cmd)
lines = f.read()
if f.close() == None:
return lines
else:
return None
def realcp(file,dstdir,overwrite=False):
print "Copying %s -> %s ..." % (file, dstdir)
if not os.path.exists(dstdir):
cmd = "mkdir -p %s" % dstdir
execcmd(cmd)
if os.path.exists(os.path.join(dstdir,os.path.basename(file))) and overwrite == False:
print "Skipping %s (already exists)" % (file)
else:
cmd = "cp -a %s %s" % (file,dstdir)
execcmd(cmd)
def getlink(prog):
if os.path.islink(prog):
name = os.path.join(os.path.dirname(prog),os.readlink(prog))
else:
name = None
return name
def cplibsandlinks(lib,dstdir):
liblst = []
liblst.append(lib)
lnk = getlink(lib)
if lnk:
liblst.append(lnk)
for file in liblst:
d = os.path.dirname(file)
if d[0] == '/':
d = d[1:]
libdir = os.path.join(dstdir,d)
realcp(file,libdir)
def cpprog(prog,dstdir):
p = os.path.dirname(prog)
if p[0] == '/':
p = p[1:]
progdir = os.path.join(dstdir,p)
realcp(prog,progdir)
def cpall(prog,dstdir):
"copy program and its libraries"
cpprog(prog,dstdir)
cmd = "/usr/bin/ldd %s" % prog
cmdout = execcmd(cmd)
if cmdout == None:
print "Could not determine dependencies for", prog
return
cmdout = cmdout.split()
#just consider /lib entries
libs = [lib for lib in cmdout if lib.find("/lib/") == 0 or lib.find("/usr/lib/") == 0]
for lib in libs:
cplibsandlinks(lib,dstdir)
def mkroot(proglst,dstdir):
"proglst = list of files to be copied, dstdir = copy location"
lnk = [ getlink(p) for p in proglst if getlink(p) ]
proglst = proglst + lnk
np = len(proglst)
n = 1
for prog in proglst:
print "==> Processing %s (%d/%d)" % (prog,n,np)
cpall(prog,dstdir)
n = n + 1
def cpdata(rootfs,datadir):
"""
Copia informacao estatica, como /etc e outros. Organize tudo
dentro do diretorio data, esta arvore criada sera adicionada ao
diretorio rootfs
"""
# create directory tree at destination
for root, dirs, files in os.walk(datadir,topdown=False):
for dir in dirs:
dstdir = os.path.join(rootfs,root[len(datadir)+1:],dir)
if not os.path.exists(dstdir):
os.makedirs(dstdir)
# copying files
for root, dirs, files in os.walk(datadir,topdown=False):
for file in files:
dstdir = os.path.join(rootfs,root[len(datadir)+1:])
org = os.path.join(root,file)
print "Copying %s -> %s" % (org,dstdir)
realcp(org,dstdir,True)
def printheader(msg,nc=0):
if nc == 0:
nc = len(msg)
print '='*nc
print msg
print '='*nc
def mknode(devroot):
"Cria dispositivos, adicione outros aqui se precisar"
devs = [ [ 'console', 'c', 5, 1],\
[ 'null', 'c', 1, 3],\
[ 'ram', 'b', 1, 1],\
[ 'systty', 'c', 4, 0],\
[ 'tty', 'c', 5, 0],\
[ 'tty1', 'c', 4, 1],\
[ 'tty2', 'c', 4, 2],\
[ 'tty3', 'c', 4, 3],\
[ 'tty4', 'c', 4, 4],\
[ 'tty5', 'c', 4, 5],\
[ 'tty6', 'c', 4, 6],\
[ 'loop0', 'b', 7, 0],\
[ 'loop1', 'b', 7, 1],\
[ 'loop2', 'b', 7, 2],\
[ 'loop3', 'b', 7, 3],\
[ 'loop4', 'b', 7, 4],\
[ 'loop5', 'b', 7, 5],\
[ 'loop6', 'b', 7, 6],\
[ 'loop7', 'b', 7, 7],\
[ 'loop8', 'b', 7, 8],\
[ 'loop9', 'b', 7, 9],\
[ 'sda', 'b', 8, 0],\
[ 'sda1', 'b', 8, 1],\
[ 'sda2', 'b', 8, 2],\
[ 'sda3', 'b', 8, 3],\
[ 'sda4', 'b', 8, 4],\
[ 'sdb', 'b', 8, 16],\
[ 'sdb1', 'b', 8, 17],\
[ 'sdb2', 'b', 8, 18],\
[ 'sdb3', 'b', 8, 19],\
[ 'sdb4', 'b', 8, 20],\
[ 'sdc', 'b', 8, 32],\
[ 'sdc1', 'b', 8, 33],\
[ 'sdc2', 'b', 8, 34],\
[ 'sdc3', 'b', 8, 35],\
[ 'sdc4', 'b', 8, 36],\
[ 'sdd', 'b', 8, 48],\
[ 'sdd1', 'b', 8, 49],\
[ 'sdd2', 'b', 8, 50],\
[ 'sdd3', 'b', 8, 51],\
[ 'sdd4', 'b', 8, 52]]
for dev in devs:
execcmd("mknod %s/%s %s %d %d" % (devroot,dev[0], dev[1], dev[2], dev[3]))
if __name__ == "__main__":
f = open('programs.dat','r')
lst = f.read()
lst = lst.split('\n')
f.close()
# removing empty entries in programas.dat
proglst = [ l for l in lst if len(l) > 1 ]
rootfs='rootfs' # onde sera gerado o rootfs
datadir='data' # estrutura fixa de arquivos a ser copiada
printheader('Copying binaries',40)
mkroot(proglst,rootfs)
printheader('Copying data files',40)
cpdata(rootfs,datadir)
printheader('Creating device files',40)
mknode(rootfs + "/dev");
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Consertando o áudio com som ruim no Pipewire
Como implementar Raid (0, 1, 5, 6, 10 e 50)
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (2)
Como programar um sistema de controle para distribuições linux em c? (3)









