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.393 ]

Download populate.py




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.

  



Esconder código-fonte

#!/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");  
    

Scripts recomendados

Agenda de Contatos

subwrite - um simples editor de texto em Python

Detectando e excluindo imagens em branco obtidas de scanner

Them para fluxbox

Dividir um grupo de arquivos em vários CDs Ou DVDs


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts