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.392 ]
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");
Pyconv - Conversor de codificação de caracteres
Leitor de arquivo via linha de comandoEs
Expressão regular com input STDIN
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (16)
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)