• Linux系统的命令源码的获取方法


    我们知道,Linux是开源的,它自带的功能强大的命令也是开源的,也就是说。我们能够获得这些命令的源码并研究它。那到底怎样获得系统的命令的源码呢?

    命令的源码是一个软件包为单元的,放在一个软件包的源码中。若要下载一个命令的源码,就要把这个命令所属的软件包的源码都下载下来。命令的源码就在下载的源码的相关文件夹内。一般是src文件夹,对应的主文件名称为cmd.c,当中cmd为详细的命令,如ls命令的主程序文件为ls.c。

    因为在不同的Linux发行版上。源码的获取方法并不同样。所以以下以Ubuntu和CentOS这两种经常使用的Linux发行版为样例进行说明。


    1、Ubuntu中系统命令源码的获取方法

    以32位Ubuntu14.04下,获取ls命令的源码为例,能够使用例如以下的方法下载源码:
    1)使用which命令查看ls命令的位置,例如以下:
    which ls # 输出:/bin/ls

    2)使用dpkg命令查询ls命令所属的包。例如以下:
    dpkg -S /bin/ls # 输出:coreutils: /bin/ls

    3)使用apt-get命令来下载ls命令所在的包的源码。例如以下:
    apt-get source coreutils

    注:
    1)在使用dpkg时。若出现错误。能够使用sudo命令使其以root权限运行。

    2)使用apt-get source下载的源码保存到当前文件夹下。

    。此外,当我们知道了命令所属的包后,也能够到对应的官方站点下载。


    2、CentOS中系统命令源码的获取方法

    以32位CentOS6.6下,获取ls命令的源码为例,能够使用例如以下的方法下载源码:
    1)配置源码的源
    在CentOS中,源的配置文件为:/etc/yum.repos.d/CentOS-Base.repo,改动该文件须要root权限。

    打开该文件,查看该文件的内容,在本人的机子上,该文件的内容例如以下:
    # CentOS-Base.repo
    #
    # The mirror system uses the connecting IP address of the client and the
    # update status of each mirror to pick mirrors that are updated to and
    # geographically close to the client.  You should use this for CentOS updates
    # unless you are manually picking other mirrors.
    #
    # If the mirrorlist= does not work for you, as a fall back you can try the 
    # remarked out baseurl= line instead.
    #
    #
    
    [base]
    name=CentOS-$releasever - Base
    mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
    #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #released updates 
    [updates]
    name=CentOS-$releasever - Updates
    mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
    #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras
    mirrorlist=http://mirrorlist.centos.org/?

    release=$releasever&arch=$basearch&repo=extras #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$releasever - Plus mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #contrib - packages by Centos Users [contrib] name=CentOS-$releasever - Contrib mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib #baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6


    该文件里有两个变量:releasever和basearch。分别表示release版本号和分支,如本人的机子上,这两个值分别为6和i386。注意。releasever并不会细分为次级版本号。即不会是6.6之类的。

    从该文件的内容能够知道,该文件共同拥有5个节。也就是说本人的机子的软件来源有5处,分别为base、updates、extras、centosplus和contrib。所以仅仅须要为例如以下的5处软件源指定其源码的源就可以。在文件的末尾加上例如以下的内容:
    [base-src]
    name=CentOS-$releasever - Base src
    baseurl=http://vault.centos.org/6.6/os/Source/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    [updates-src]
    name=CentOS-$releasever - Updates src-centos
    baseurl=http://vault.centos.org/6.6/updates/Source/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    [extras-src]
    name=CentOS-$releasever -  Extras src-centos
    baseurl=http://vault.centos.org/6.6/extras/Source/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    [centosplus-src]
    name=CentOS-$releasever - Plus src-centos
    baseurl=http://vault.centos.org/6.6/centosplus/Source/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    [contrib-src]
    name=CentOS-$releasever - Contrib src-centos
    baseurl=http://vault.centos.org/6.6/contrib/Soruce/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

    因为不同的版本号设置会有所不同,所以其设置会有所不同,方法可总结为例如以下:
    (1)gpgkey与该文件里已有的节的gpgkey同样
    (2)为了确认文件的存在和情况,能够打开站点http://vault.centos.org/查看详细的情况,再依据详细的情况来填写
    (3)设置baseurl时须要依据自己的系统的版本号来设置,如本人的机子为CentOS-6.6,则在设置时,相关的參数就设置为6.6。即http://vault.centos.org/后接的子路径为6.6。

    该文件的作用是为yum其及相关工作的下载提供一个源。如在使用yumdownloader(以下会讲到)下载源码时。会发生例如以下动作
    (1)下载$baseurl/repodata/repomd.xml文件。若该repomd.xml文件比系统中的新。更新系统中的对应的repomd.xml
    (2)下载$baseurl/SPackages/中的对应的源码rpm包。

    2)使用which命令查看ls命令的位置,例如以下:
    which ls
    # 输出:/bin/ls

    3)使用rpm命令查询ls命令所属的包,例如以下:
    rpm -qf /bin/ls 
    # 输出:coreutils-8.4-37.el6.i686

    4)yumdownloader是一个从RPM源下载RPM的程序,能够使用yumdownloader命令安装源码。例如以下:
    yumdownloader --source coreutils-8.4-37.el6.i686
    注:
    (1)若yumdownloader命令没有安装,则能够使用此命令安装:yum install yum-utils。
    (2)下载的文件在当前文件夹下。能够使用參数--destdir指定下载到哪一个文件夹。

    5)使用yumdownloader下载到的是一个安装包文件rpm,能够使用例如以下的命令查询rpm中的tar文件:
    rpm -qpl coreutils-8.4-37.el6.src.rpm | grep tar
    # 输出:coreutils-8.4.tar.xz

    6)使用rpm2cpio命令将rpm包文件转换成cpio归档文件,再使用cpio命令,从cpio归档文件复制提取出一个归档文件。出例如以下:
    rpm2cpio coreutils-8.4-37.el6.src.rpm | cpio -idv coreutils-8.4.tar.xz
    # 输出:
    # coreutils-8.4.tar.xz
    # 9561 blocks

    cpio的man解释为:cpio copies files into an archive
    -i:与--extract等同。提取之意
    -d:与--make-directories等同,当有须要时创建一个载入文件夹
    -v:列出文件的处理过程

    7)使用tar命令对coreutils-8.4.tar.xz压缩包进行解压缩,例如以下:
    tar -xvf ./coreutils-8.4.tar.xz

    至此,命令的源码获取完毕。

  • 相关阅读:
    C#注释含义(XML注释)标签及其含义(二)
    Apache开启伪静态[转]
    C#注释含义(XML注释)标签及其含义(一)
    [转]终结PHP中文乱码的问题
    Symfony框架百科/项目实战/指南/教程
    第一次用Office2007写博客
    prototype.js是什么?
    优秀网站源码 集合
    Pager 精简的分页控件
    Validator.js 很好用的客户端表单验证
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6902024.html
Copyright © 2020-2023  润新知