一直有构建deb包,然后配置一个自己的私有源地址的想法,目的是想把自己平时用到的工具总结在一起,然后就不需要各种拷贝了,导致工具很零散,当然可以放在一个git里,但是还是觉得没有deb包直接配置源的方式安装正规。哪类东西就用哪种方式处理。
参考文章:【从源代码构建deb包】
本文是一个关于如何制作 Debian 包的介绍性教程,它不会对 Debian 打包系统中的复杂概念深入介绍,但它介绍了能够为简单软件制作 Debian 包的方法。
出于这个目的,我们只使用来自于 debhelper 9 的 dh 命令。
这个教程假设您已:
- 理解二进制包的安装过程;
- 了解命令行的使用,并且使用您偏爱的文本编辑器编辑文本文件;
技术要求:(环境工具依赖)
- build-essential
- devscripts
- debhelper version 9 或更高版本
三个最核心的概念为:
最简单的源码包由3个文件组成:
想一想平时构建HPC APP环境时可能遇到哪些问题?
是否遇到需要对项目环境迁移时又要重复做一遍当初的所有配置和调试?
以上这些在没有解决时效率大大降低不说,也非常容易造成环境污染,时间久了源码哪里下载的不清楚了,具体的配置安装也不记得了。在提供他人环境配置时也没有清晰简要的配置文件,如需要环境的迁移时更是直接劳动力Double. 这些case当遇到spack包管理工具时都迎刃而解了。
Spack 是为大型超级计算中心设计的一个包管理工具,旨在支持各种平台和环境上的多个版本和配置的软件。 通过Spack工具 安装新版本不会破坏现有安装,且同一版本的软件根据不同的参数配置或不同依赖会生成差异性的安装配置,彼此间相互独立,不会覆盖。所以我们也说spack是非破坏性的的包管理工具,许多配置可以在同一系统上共存。同时spack还可以对已安装的包生成module files,从而实现了对超算的另一种包管理工具mudole tool进行平滑的扩展和支持。
下面主要对spack的功能模块和基本使用方法进行介绍。主要参考spack官方文档,同时添加一些自己的实际操作和理解注释, 并在最后阶段以Openfoam Petsc项目的两个env为例,汇总所有spack功能模块在构建项目环境时的具体应用。
spack支持
ronny@ubuntu:~/workspace/srccode/hisi3798_stb2$ find ./out -name "signapk.jar"
./host/linux-x86/framework/signapk.jar
ronny@ubuntu:~/workspace/srccode/hisi3798_stb2$ cp out/host/linux-x86/framework/signapk.jar ~/workspace/SignDir/app_sign_tools/app_sign
然后运行:
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: '
ronny@ronny:~/tempdir$ set --help
bash: set: --: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
执行set --help可以看到set命令参数选项很多,但我经常用到的可能只有如下几个-u -x -e还有set -o pipefail几个选项,下面主要介绍一下常用的几个参数及其功能
功能描述:执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它。大多数情况下,这不是开发者想要的行为,遇到变量不存在,脚本应该报错,而不是一声不响地往下执行。set -u
就用来改变这种行为。脚本在头部加上它,遇到不存在的变量就会报错,并停止执行。
(-u还有另一种写法-o nounset,两者是等价的。)
eg:
(1)没有set -u的情况
#!/bin/bash
IMG_MOUNT_POINT=./system
TTT="test_ttt"
echo "$IMG_MOUNT_POINT"
echo "$sss"
echo "$TTT"
执行结果:
(2)使用set -u的情况
#!/bin/bash
set -u
IMG_MOUNT_POINT=./system
TTT="test_ttt"
echo "$IMG_MOUNT_POINT"
echo "$sss"
echo "$TTT"
执行结果:
总结:可以看到使用set -u可是在脚本遇到未定义变量时停下来,不再执行,而默认bash是忽略继续执行的,更加粗暴哈哈
功能描述:默认情况下,脚本执行后,屏幕只显示运行结果,没有其他内容。如果多个命令连续执行,它们的运行结果就会连续输出。有时会分不清,某一段内容是什么命令产生的。set -x
用来在运行结果之前,先输出执行的那一行命令。 和#!/bin/bash -x应该是一个意思。一般打印脚本调试信息的时候这么干。
可以看到,命令
pkill详解
一:含义:
是ps命令和kill命令的结合,按照进程名来杀死指定进程,pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。
二:语法:
pkill(选项)(参数)
Usage:
pkill [options] <pattern>
Options:
-<sig>, --signal <sig> signal to send (either number or name)
-e, --echo display what is killed
-c, --count count of matching processes
-f, --full use full process name to match
-g, --pgroup <id,...> match listed process group IDs
-G, --group <gid,...> match real group IDs
-n, --newest select most recently started
-o, --oldest select least recently started
-P, --parent <ppid,...> match only child processes of the given parent
-s, --session <sid,...> match session IDs
-t, --terminal <tty,...> match by controlling terminal
-u, --euid <id,...> match by effective IDs
-U, --uid <id,...> match by real IDs
-x, --exact match exactly with the command name
-F, -
起因我在闲鱼淘了一块不错的日立垂直硬盘,HGST的 HTS725050A7E630, 7200转,500G ,sata3接口 32M缓存
到手后我接到小主机上,显示用badblocks检测坏块坏道,然后用smartctl查看硬件规格,通电时长,温度啥的,然后用hdparm这个命令测试硬盘读写速度。这3个工具只有smartctl需要安装。那么现在开始吧。
ronny@server:~$ sudo badblocks -s -v /dev/sda1 > badsectors
[sudo] password for ronny:
Checking blocks 0 to 488385535
Checking for bad blocks (read-only test): done
Pass completed, 0 bad blocks found. (0/0/0 errors)
ronny@server:~$
检测没有坏道坏块
smartctl need install package: sudo apt-get install smartmontools
查看一下硬件信息包括通电时长,可以看到 9 Power_On_Hours最后一个值7840,说明已经用了7840h.
ronny@server:~$ sudo smartctl -a /dev/sda1
smartctl 6.5 2016-01-24 r4214 [x86_64-linux-4.15.0-55-generic] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmont
参考文章 :
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账户信息,只有系 |
一般情况下, 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/)。
在编译完成Android的Source Code之后, 删除生成的system.img,然后编译PlatformLibrary并将之集成进新的system.img中。
编译PlatformLibrary的方法参考$ANDROID_SRC/device/sample/frameworks/PlatformLibrary/README.txt
#lunch full-eng && make -j8
#rm $ANDROID_SRC/out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
#make com.example.android.platform_library
#make libplatform_library_jni
#make PlatformLibraryClient
#cp $ANDROID_SRC/device/sample/frameworks/PlatformLibrary/com.example.android.platform_library.xml $ANDROID_SRC/out/target/product/generic/system
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三个参数连用,这样当一个文件日志输出满了之后可以马上在另一个中进行输出
//将缓冲区的log打印到屏幕并退出
adb logcat -d
//清除缓冲区log(testCase运行前可以先清除一下)
adb logcat -c
//打印缓冲区大小并退出
adb logcat -g
//输出log
logcat -r 10000 -v time -f /cache/log/dlog/dlog.log -n 5
在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日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区
本篇文章主要介绍如何制作自己的签名key。
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直接签名同样需要密码。
使用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转