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.352 ]
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");
Dividir um grupo de arquivos em vários CDs Ou DVDs
Exemplo de armazenamento de registros em arquivo
Checagem e remoção de arquivos
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Ubuntu 24.04 e problemas de acesso à rede VPN [RESOLVIDO] (9)
big linux sem audio como resolver (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta