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 ]

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

Pyconv - Conversor de codificação de caracteres

RenameFile

Leitor de arquivo via linha de comandoEs

Expressão regular com input STDIN

Adicionar/remover usuários


  

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