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.637 ]
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");
Expressão regular com input STDIN
Serialização em Python usando pickle
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Perfil criado no samba ad dc não loga no Windows 10 e 11 (11)
Fedora - Google Workspace + SSSD (0)
Estou tentando ser legalista, mas tá complicado! (5)









