2024-03-19 17:29:17    6    0    0

1. 前言

一直有构建deb包,然后配置一个自己的私有源地址的想法,目的是想把自己平时用到的工具总结在一起,然后就不需要各种拷贝了,导致工具很零散,当然可以放在一个git里,但是还是觉得没有deb包直接配置源的方式安装正规。哪类东西就用哪种方式处理。

2. 目标:

  • 1:先尝试打包发布一个简单deb包,并配置好私有源。
  • 2:将自己的工具整理到github上,最后通过github源码的方式编译打包成deb包,然后配置私有源,在任意一台计算机可以下载。

3. 目标1的实践:

参考文章:【从源代码构建deb包】

3-1. Debian 打包介绍

本文是一个关于如何制作 Debian 包的介绍性教程,它不会对 Debian 打包系统中的复杂概念深入介绍,但它介绍了能够为简单软件制作 Debian 包的方法。
出于这个目的,我们只使用来自于 debhelper 9 的 dh 命令。

3-2. 需求

这个教程假设您已:
- 理解二进制包的安装过程;
- 了解命令行的使用,并且使用您偏爱的文本编辑器编辑文本文件;

技术要求:(环境工具依赖)
- build-essential
- devscripts
- debhelper version 9 或更高版本

3-3. 三个核心概念

三个最核心的概念为:

  • 上游原始代码包(upstream tarball):
    通常,人们为上游开发者(通常为第三方)编写的软件打包。
    上游开发者会使用源代码归档软件或原始代码包的方式发放他们的软件。
    原始代码包一般是上游制作的 .tar.gz 或 .tgz 文件,它也可能被压缩成 .tar.bz2,.tb2 或 .tar.xz 格式。原始代码包就是 Debian 构建包时使用的原材料。
  • 源码包:
    当您拥有了上游制作的原始代码包,下一步就可以制作 Debian 源码包了。
  • 二进制包:
    从源码包您可以构建 Debian 二进制包,它才是是实际上会被安装的包。

最简单的源码包由3个文件组成:

  • 上游原始代码包,需要被重命名来符合一个特定的模式。
  • 一个 debian 目录,带有所有上游源代码的更改记录,外加所有为 Debian
2022-05-19 11:38:09    434    0    0

HPC集群为什么需要包管理工具?

  
想一想平时构建HPC APP环境时可能遇到哪些问题?

  • 是否对手动安装: 下载源码、 解压、 配置、 编译,安装等这一系列操作觉得麻烦?
  • 是否在手动安装软件时经常遇到不清楚具体依赖,到时反复编译调试的情况?
  • 是否会遇到同一个软件的不同版本安装时存在覆盖,版本之间切换麻烦,甚至是安装了高版本后低版本无法使用的情况?
  • 是否又遇到过构建项目环境时多个软件依赖的编译器版本并不一致,有的需要低版本gcc有的需要高版本gcc,有的需要gcc有的需要clang编译器等?
  • 甚至是当我们对某个软件的同一版本需要切换不同配置参数编译安装版本时可能需要反复的去配置,编译,安装等, 是否又对这些无用功表示无奈
  • 是否时间长了忘记了当初的环境具体进行了哪些配置,涉及到哪些依赖?
  • 是否遇到需要对项目环境迁移时又要重复做一遍当初的所有配置和调试?

      
      以上这些在没有解决时效率大大降低不说,也非常容易造成环境污染,时间久了源码哪里下载的不清楚了,具体的配置安装也不记得了。在提供他人环境配置时也没有清晰简要的配置文件,如需要环境的迁移时更是直接劳动力Double. 这些case当遇到spack包管理工具时都迎刃而解了。

1. Spack 介绍

  Spack 是为大型超级计算中心设计的一个包管理工具,旨在支持各种平台和环境上的多个版本和配置的软件。 通过Spack工具 安装新版本不会破坏现有安装,且同一版本的软件根据不同的参数配置或不同依赖会生成差异性的安装配置,彼此间相互独立,不会覆盖。所以我们也说spack是非破坏性的的包管理工具,许多配置可以在同一系统上共存。同时spack还可以对已安装的包生成module files,从而实现了对超算的另一种包管理工具mudole tool进行平滑的扩展和支持。

  下面主要对spack的功能模块和基本使用方法进行介绍。主要参考spack官方文档,同时添加一些自己的实际操作和理解注释, 并在最后阶段以Openfoam Petsc项目的两个env为例,汇总所有spack功能模块在构建项目环境时的具体应用。
  

一.安装配置spack工具

spack支持

2021-04-09 19:32:46    220    0    0

1配置调试SignApk.jar环境

  • 1、保证jar包编译的jdk版本和本地jdk一致
    首先是将本地的SignApk.jar替换掉之前的签名SignApk.jar 因为我们现在的jdk是jdk1.8,然后老的SignApk.jar是jdk1.6.45编译出来的,这样在调试的时候就会出错。
  1. ronny@ubuntu:~/workspace/srccode/hisi3798_stb2$ find ./out -name "signapk.jar"
  2. ./host/linux-x86/framework/signapk.jar
  3. ronny@ubuntu:~/workspace/srccode/hisi3798_stb2$ cp out/host/linux-x86/framework/signapk.jar ~/workspace/SignDir/app_sign_tools/app_sign
  • 2、在终端运行Jar包

然后运行:

  1. ronny@ubuntu:~/workspace/SignDir/app_sign_tools/app_sign$ java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar ./signapk.jar Certificate/platform_eng.x509.pem Certificate/platform_eng.pk8 com.china_liantong.mytv.apk com.china_liantong.mytv_eng.apk

-Xdebug -Xrunjdwp:transport=dt_socket,address=5005这里address指定一个地址端口,与后面idea设置的要一致,执行上述命令,可以看到监听了5005端口:

  • 3、在idea上添加一个你服务对应的Remote连接

  • 4、设置好断点,如上图的main函数入口
    设置完后点击debug按钮

就可以看到console窗口显示:
Connected to the target VM, address: '

2020-04-15 17:28:02    144    0    0

一、set命令

  1. ronny@ronny:~/tempdir$ set --help
  2. bash: set: --: invalid option
  3. set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

执行set --help可以看到set命令参数选项很多,但我经常用到的可能只有如下几个-u -x -e还有set -o pipefail几个选项,下面主要介绍一下常用的几个参数及其功能

二、set命令常用参数的使用

1、 set -u(捕获未定义变量被使用的异常)

功能描述:执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它。大多数情况下,这不是开发者想要的行为,遇到变量不存在,脚本应该报错,而不是一声不响地往下执行。set -u就用来改变这种行为。脚本在头部加上它,遇到不存在的变量就会报错,并停止执行。
(-u还有另一种写法-o nounset,两者是等价的。)
eg:
(1)没有set -u的情况

  1. #!/bin/bash
  2. IMG_MOUNT_POINT=./system
  3. TTT="test_ttt"
  4. echo "$IMG_MOUNT_POINT"
  5. echo "$sss"
  6. echo "$TTT"

执行结果:

(2)使用set -u的情况

  1. #!/bin/bash
  2. set -u
  3. IMG_MOUNT_POINT=./system
  4. TTT="test_ttt"
  5. echo "$IMG_MOUNT_POINT"
  6. echo "$sss"
  7. echo "$TTT"

执行结果:

总结:可以看到使用set -u可是在脚本遇到未定义变量时停下来,不再执行,而默认bash是忽略继续执行的,更加粗暴哈哈

2、set -x(打印调试信息)

功能描述:默认情况下,脚本执行后,屏幕只显示运行结果,没有其他内容。如果多个命令连续执行,它们的运行结果就会连续输出。有时会分不清,某一段内容是什么命令产生的。set -x用来在运行结果之前,先输出执行的那一行命令。 和#!/bin/bash -x应该是一个意思。一般打印脚本调试信息的时候这么干。
可以看到,命令

2020-04-15 17:27:49    155    0    0

pkill详解
一:含义:
是ps命令和kill命令的结合,按照进程名来杀死指定进程,pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。

二:语法:
pkill(选项)(参数)

  1. Usage:
  2. pkill [options] <pattern>
  3. Options:
  4. -<sig>, --signal <sig> signal to send (either number or name)
  5. -e, --echo display what is killed
  6. -c, --count count of matching processes
  7. -f, --full use full process name to match
  8. -g, --pgroup <id,...> match listed process group IDs
  9. -G, --group <gid,...> match real group IDs
  10. -n, --newest select most recently started
  11. -o, --oldest select least recently started
  12. -P, --parent <ppid,...> match only child processes of the given parent
  13. -s, --session <sid,...> match session IDs
  14. -t, --terminal <tty,...> match by controlling terminal
  15. -u, --euid <id,...> match by effective IDs
  16. -U, --uid <id,...> match by real IDs
  17. -x, --exact match exactly with the command name
  18. -F, -
2020-04-15 17:26:56    115    0    0

起因我在闲鱼淘了一块不错的日立垂直硬盘,HGST的 HTS725050A7E630, 7200转,500G ,sata3接口 32M缓存

到手后我接到小主机上,显示用badblocks检测坏块坏道,然后用smartctl查看硬件规格,通电时长,温度啥的,然后用hdparm这个命令测试硬盘读写速度。这3个工具只有smartctl需要安装。那么现在开始吧。

  • 用badblocks检测坏块坏道, 这个过程很耗时,-v参数是运行时显示详细的处理信息, -s显示检查进度.
  • -s非常有必要,不然都不知道检查多少了,500G检查了大概70分钟。
  1. ronny@server:~$ sudo badblocks -s -v /dev/sda1 > badsectors
  2. [sudo] password for ronny:
  3. Checking blocks 0 to 488385535
  4. Checking for bad blocks (read-only test): done
  5. Pass completed, 0 bad blocks found. (0/0/0 errors)
  6. ronny@server:~$

检测没有坏道坏块

  • smartctl查看硬盘信息,包括硬件规格信息(型号,序列号,转数,容量) 还有我们关心的通电时长,以及硬盘健康检查
  • smartctl need install package: sudo apt-get install smartmontools

  • 查看一下硬件信息包括通电时长,可以看到 9 Power_On_Hours最后一个值7840,说明已经用了7840h.

  1. ronny@server:~$ sudo smartctl -a /dev/sda1
  2. smartctl 6.5 2016-01-24 r4214 [x86_64-linux-4.15.0-55-generic] (local build)
  3. Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmont
2020-04-15 17:25:49    132    0    0

自定义权限,及权限protect level.

  参考文章 :
  1、Android中的权限管理(基于Permission ProtectionLevel)
  2、自定义Android系统级权限组
  3、Android权限整理
  
  
//定义用户使用的权限
{
eg:

声明权限 具体属性
访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限
获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米
获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内
访问定位额外命令 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS,允许程序访问额外的定位提供者指令
获取模拟定位信息 android.permission.ACCESS_MOCK_LOCATION,获取模拟定位信息,一般用于帮助开发者调试应用
获取网络状态 android.permission.ACCESS_NETWORK_STATE,获取网络信息状态,如当前的网络连接是否有效
访问Surface Flinger android.permission.ACCESS_SURFACE_FLINGER,Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图
获取WiFi状态 android.permission.ACCESS_WIFI_STATE,获取当前WiFi接入的状态以及WLAN热点的信息
账户管理 android.permission.ACCOUNT_MANAGER,获取账户验证信息,主要为GMail账户信息,只有系
2020-04-15 17:25:37    138    0    0

一般情况下, Android中的第三方应用程序SDK都由开发者直接打包发布,在使用SDK的时候,将所需要的文件(jar、native共享库)加入到项目中 ,这是最通用的方式。不过对于每个应用程序而言,都需要引入包含独立的SDK的库文件,这使得应用程序的大小难以控制,尽管如此,这是对于不能修改Android ROM的前提下发布SDK的唯一可行方式。

如果可以自定义Andoid ROM或者独立控制ROM的发布(通常对于Android手机厂商而言),则可以将这些SDK库放到Android ROM的system下面,使得应用程序可以共享SDK库。在Android的源代码(AOSP)中,包含了PlatformLibrary这样一个例子
($ANDROID_SRC/device/sample/frameworks/)。

1. 编译PlatformLibrary并将其集成进Android ROM

在编译完成Android的Source Code之后, 删除生成的system.img,然后编译PlatformLibrary并将之集成进新的system.img中。

编译PlatformLibrary的方法参考$ANDROID_SRC/device/sample/frameworks/PlatformLibrary/README.txt

  1. #lunch full-eng && make -j8
  2. #rm $ANDROID_SRC/out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
  3. #make com.example.android.platform_library
  4. #make libplatform_library_jni
  5. #make PlatformLibraryClient
  6. #cp $ANDROID_SRC/device/sample/frameworks/PlatformLibrary/com.example.android.platform_library.xml $ANDROID_SRC/out/target/product/generic/system
2020-04-15 17:24:15    321    0    0

logcat命令参数

参数 描述
-b 加载一个可使用的日志缓冲区供查看,比如event和radio。默认值是main
-c 清除缓冲区中的全部日志并退出(清除完后可以使用-g查看缓冲区)
-d 将缓冲区的log转存到屏幕中然后退出
-f <filename> 将log输出到指定的文件中<文件名>.默认为标准输出(stdout)
-g 打印日志缓冲区的大小并退出
-n <count> 设置日志的最大数目,默认值是4,需要和-r选项一起使用
-r <kbytes> <kbytes>时输出日志,默认值是16,需要和-f选项一起使用
-s 设置过滤器
-v 设置输出格式的日志消息。默认是短暂的格式。支持的格式列表

一般长时间输出log的话建议-f,-n,-r三个参数连用,这样当一个文件日志输出满了之后可以马上在另一个中进行输出

  1. //将缓冲区的log打印到屏幕并退出
  2. adb logcat -d
  3. //清除缓冲区log(testCase运行前可以先清除一下)
  4. adb logcat -c
  5. //打印缓冲区大小并退出
  6. adb logcat -g
  7. //输出log
  8. logcat -r 10000 -v time -f /cache/log/dlog/dlog.log -n 5

1、logcat -b选项过滤

在Android中不同的log写到不同的设备中,共有/dev/log/system, /dev/log/main, /dev/log/radio, /dev/log/events四中类型。其中默认Log.v等写入/dev/log/main中。Slog写入/dev/log/system中。

我们在使用logcat 抓去日至的时候, 可以指定buffer,来请求不同的环形缓冲区 (‘main’, ‘system’, ‘radio’, ‘events’,默认为”-b main system”),因为android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区

2020-01-03 17:26:21    249    0    0

本篇文章主要介绍如何制作自己的签名key。

一、使用keytool工具生成数字证书

1、制作证书keystore

keytool -genkey -keystore kbbs.keystore -alias kbbs -keyalg RSA -validity 20000

说明:
1)keytool是工具名称,-genkey意味着执行的是生成数字证书操作,-v表示将生成证书的详细信息打印出来,显示在dos窗口中;
2) -alias ronny表示证书的别名为“ ronny”,当然可以不和上面的文件名一样;
3)-keyalg RSA 表示生成密钥文件所采用的算法为RSA;
4)-validity 20000 表示该数字证书的有效期为20000天,意味着20000天之后该证书将失效
5)-keystore ronny.keystore 表示生成的数字证书的文件名为“ronny.keystore ”;
在执行上面的命令生成数字证书文件时,会提示你输入一些信息,包括证书的密码,示例如下:

密钥库口令:kbbs962457, kbbs的密钥口令:同密码库口令,因为如果不一致在最后生成pk8和pem过程中会报错。

这样keystore就制作完成了,有了它就可以用它做成密钥对,所以这个keystore很重要。有了密钥对也可以转成相应的keystore。如果私钥也被别人搞到了那就没有什么安全可言了。所以keystore不能给别人,且要设置密钥库口令。这样别人获取了keystore也做不了key,用keystore直接签名同样需要密码。

2、直接用keystore签名

使用jarsigner工具和刚刚制作的数字证书为Android应用程序签名,注意要输入别名(这个直接在jdk中,配好jdk就能用了)

jarsigner -verbose -keystore ~/key/kbbs.keystore -signedjar app-release_signed.apk app-release-unsigned.apk kbbs -digestalg SHA1 -sigfile CERT

keystore转

1/2