Arch Linux怎样构建一个简单的软件包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arch Linux怎样构建一个简单的软件包相关的知识,希望对你有一定的参考价值。

参考技术A

这两天给 Kreogist µ 打 Arch Linux 包,照着 wiki 跟着搞,同时在肥猫和 Wicast C 及暴君还有 jimmy66 等强力大腿及小伙伴的支持下,几番折腾终于打好了,也算是入了个门。

搞完过来发现也算简单,总体来说其实就是一个 PKGBUILD 文件的编写。就着给 µ 打的这个包写个简单指南。在写的时候实在太不知道怎么写的地方还可以直接参考一下其他软件包的 PKGBUILD 是怎么写的我才不会说呢。

编写 PKGBUILD

在最开头,复制一份原型: /usr/share/pacman/PKGBUILD.proto(同目录下也有其他特别类型的原型),之后就从这个文件开始编写啦。

先读完文件开头那段注释,然后删掉它~

Maintainer

最开头一行注释是维护者的信息,按照它提供的格式填写上有效的信息即可。

pkgname

软件包的名字。只能用 小写字母、数字和@ . _ + - 这些字符,且不允许用.或者-作开头。

另外不要和 AUR 甚至是官方仓库里面的软件包重名了(´・ω・`)

pkgver

软件包的版本,就是你打包的那个软件的版本。可以使用数字和小数点,以及其它字符。进一步的规则可参考:VCS package guidelines - ArchWiki

pkgrel

软件包发行号,一般设为 1,如果你因为某些原因给同版本号的软件进行反复打包,那么每次打包的时候 pkgrel 就应该在原基础上递增一个数字,而在打包新的版本的时候,应该重新设为 1。

epoch

强行干涉包的新旧关系,拥有更大的 epoch 值的包会被认做更新的包(此时无视版本号),可以用在如版本号风格改变等需要的时候。默认值为 0,取值为正整数。一般不会用到。

pkgdesc

软件包的描述信息,最好一句话,且不包含软件的名字。

arch

表示支持的 Arch Linux 的架构,比如 i686、x86_64,如果包与平台无关的话就填 any。

url

与软件包相关的链接,一般是项目首页什么的。

license

软件发布协议,如果是常见的 GPL 的话可以对照下面填写:

    (L)GPL - (L)GPLv2 及更新版本。

    (L)GPL2 - 仅 (L)GPL2

    (L)GPL3 - (L)GPL3 及更新版本

    depends

    这是非常重要的一项,需要正确填写上软件的依赖。

    对于直接发布可执行程序的话,可以通过 ldd 来看程序连接了哪些库文件,结合搜索判断出具体依赖是什么软件包。你可以用谷歌在  上搜索具体库的文件名,一般都能够找到对应的软件包。

    如果你已经用 makepkg 打出了 .tar.xz 的包,也可以用 Namcap 来检查依赖是否存在问题,它会提供一些有用的信息帮助修正依赖。对于他的输出含义可以直接参考 ArchWiki。

    多测试多测试,确保依赖真的没问题。

    source

    构建软件包需要的文件。可以是一个本地文件,也可以是一个远程文件。 makepkg 会在构建包的时候自动下载填写的远程文件,并且会自动解包压缩文件。

    md5sums

    对应的 source 里面文件的 md5 校验码。

    package()

    在构架包的时候执行的函数。你需要把安装软件对应的操作写在这里。函数会在一个 fakeroot 环境下执行,对应的 root 目录就是 $pkgdir,比如你有一个可执行文件名为 $pkgname 要安装到 /usr/bin 下面,对应的命令就可以类似这么写:

    install -m=775 $pkgname "$pkgdir/usr/bin"

    -m 选项表示目标文件的权限,和 chmod 参数同理。

    常用目录

    目录

    用途

    /etc    系统关键配置文件,如果件有多个,应该创建合适的子目录来存放    

    /usr/bin    二进制文件    

    /usr/lib    库    

    /usr/include    头文件    

    /usr/lib/pkg    模块,插件等    

    /usr/share/doc/pkg    应用程序文档    

    /usr/share/info    GNU Info 系统文件    

    /usr/share/man    手册    

    /usr/share/pkg    程序数据    

    /var/lib/pkg    应用持久数据    

    /etc/pkg    pkg的配置文件    

    /opt/pkg    大的独立程序,例如 Java    

    /usr/share/applications/    Desktop Entry (.desktop) 文件    

    /usr/share/icons/    图标,存在该目录下对应子目录位置    

    不该碰的目录:

    /dev

    /home

    /srv

    /media

    /mnt

    /proc

    /root

    /selinux

    /sys

    /tmp

    /var/tmp

    构建/调试包

    在 PKGBUILD 所在目录下执行 makepkg 可以构建出对应的软件包,推荐用 namcap 检测一下构建出来的包有没有更显著的问题。

    然后你可以用 pacman -U 命令安装它,看看会不会发生什么奇怪的事情,以及软件是否正常等。

    当然还有可能因为 PKGBUILD 没写好,直接就报错不干了,这个时候需要顺着错误信息去修正 PKGBUILD。

    发布到 AUR

    在 PKGBUILD 所在目录执行 makepkg --source,会生成 .src.tar.gz 源码包,这就是需要上传到 AUR 的东西,注意不要把任何二进制文件加入源码包。

    在 AUR (Arch User Repository) 注册(登入)帐号。进入 Submit 页面,选择好软件包对应的分类,然后添加源码包上传即可。

    即使你是要更新一个包,也只需要直接在 Submit 页面上传,包的信息 AUR 会自己处理。

    如果觉得每次上传太麻烦,你可以尝试一下 aurupload 来简化发布。

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程


作者:刘世鹏20135304

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

 

Linux内核代码简介

内核源码三个个重要目录

  • arch占有代码量最大,支持不同cpu的源代码,arch/x86目录下的代码是我们关注的重点
  • init,内核启动相关的代码基本都在init目录下,init/main.c中start_kernel是整个内核启动的起点

技术分享

  • Kernel目录下是Linux内核的核心代码所在

README

  • 介绍了什么是Linux
  • Linux能在哪些硬件上运行
  • 文档说明
  • 怎样安装内核源代码
  • make mrproper 把中间代码清理干净
  • make allnoconfig把所有的可选项都关闭了,可以运行的很快

技术分享


 

实验过程

构造一个简单的Linux 系统 MenuOs

cd LinuxKernel/ 
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

 

  • qemu 启动虚拟机
  • kernel指明内核文件名
  • initrd指明根文件系统

技术分享

内核启动 → 加载根文件系统(可执行文件init被启动了)

使用GDB跟踪调试内核的方法

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

关于-s和-S选项的说明:

-S freeze CPU at startup (use ’c’ to start execution)在cpu初始化之前冻结起来
-s shorthand for 在-gdb tcp::1234端口上创建一个gdb server

技术分享

此时虚拟机处于冻结状态

 

另开一个shell窗口
设置gdb断点

(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

 

技术分享

系统重新启动到start_kernel这个位置

 

技术分享

系统执行到init

 


分析start_kernel的执行过程

  • start_kernel函数是Linux内核的入口。
  • start_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。
  • 不管分析内核那一部分都会涉及到start_kernel,因为几乎所有模块在初始化时都会调用它
  • init_task 为全局变量,即手工创建的pcb。 0号进程即最终的idle进程
  •  trap_init()初始化一些中断向量

技术分享

 


 

Kthreadd用内核线程管理系统资源,当系统没有进程需要执行时就调度到idle进程

技术分享

 


四、总结

整个内核的启动过程整体上可看作rest_init()这一个0号进程,在start_kernel函数的尾部被调用。这个0号进程就创建了1号进程kernel_init,接下来还创建了其他的一些服务类的内核线程如kthreadd。这样整个系统就启动起来了。

以上是关于Arch Linux怎样构建一个简单的软件包的主要内容,如果未能解决你的问题,请参考以下文章

怎样安装Arch Linux以及Deepin桌面环境

Arch linux操作系统安装教程

在Arch Linux构建安装RhytmCat

Arch Linux 安装后的设置

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

spnavcfg - Arch Linux 中的 SpaceNavigator