我们知道Windows下有类似UltraISO的这样的软件可以用来编辑ISO文件,可引导ISO也没有问题。近来在Linux下玩的比较多,正好要改个ISO,于是就开始找Linux下有没有类似的软件。
Ubuntu软件中心里有一款叫ISOMaster的软件,可以创建和修改ISO文件。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
我们知道Windows下有类似UltraISO的这样的软件可以用来编辑ISO文件,可引导ISO也没有问题。近来在Linux下玩的比较多,正好要改个ISO,于是就开始找Linux下有没有类似的软件。
Ubuntu软件中心里有一款叫ISOMaster的软件,可以创建和修改ISO文件。
在Ubuntu 16.04上测试OpenCV 3.2,遇到一个在子线程中更新图像,而界面不刷新的问题。
|
1 |
$ sudo apt-get install libopencv-dev |
编译执行如下代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <pthread.h> #include <opencv/cv.h> #include <opencv/highgui.h> #include <stdio.h> #include <stdlib.h> void* imshowWorker(void*){ for(int i = 0;i < 100;i++){ char str[10+1]; snprintf(str, 10,"%d",i); cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 ); cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 )); cv::imshow("Number View", img ); if(i > 90){ i = 0; } } } int main(void){ cv::namedWindow("Number View"); pthread_t id; pthread_create(&id,NULL,imshowWorker,NULL); getchar(); return (0); } |
|
1 |
$ g++ opencv_imshow.cpp -I `pkg-config --libs opencv` -lpthread -o opencv_imshow |
可以看到,上面的代码执行之后,界面并没有出现,即使出现也没有刷新。
这个问题是由于界面更新必须在主线程中执行,需要手工通知主线程。
修改后的代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <pthread.h> #include <opencv/cv.h> #include <opencv/highgui.h> #include <stdio.h> #include <stdlib.h> void* imshowWorker(void*){ for(int i = 0;i < 100;i++){ char str[10+1]; snprintf(str, 10,"%d",i); cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 ); cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 )); cv::imshow("Number View", img ); cv::waitKey(30); if(i > 90){ i = 0; } } } int main(void){ cv::namedWindow("Number View"); pthread_t id; pthread_create(&id,NULL,imshowWorker,NULL); getchar(); return (0); } |
也就是每次更新图片后手工调用代码
|
1 |
cv::waitKey(30); |
这个等候时间,只要大于0即可,比如:
|
1 |
cv::waitKey(1); |
我想使用一些在旧的GCC版本中不可用的GCC警告开关(例如-Wtype-limits)。
有没有一个简单的方法来检查GCC版本?
我不会说容易,但是可以使用GNU make的SHELL函数来执行gcc --version命令,然后使用ifeq条件表达式来检查版本号,并适当地设置CFLAGS变量。
以下是一个简单的MakeFile示例:
|
1 2 3 4 5 6 7 8 9 10 |
CC = gcc GCCVERSION = $(shell gcc --version | grep ^gcc | sed 's/^.* //g') CFLAGS = -g ifeq "$(GCCVERSION)" "4.4.3" CFLAGS += -Wtype-limits endif all: $(CC) $(CFLAGS) prog.c -o prog |
注意:不存在ifgt语法。但是可以使用expr命令进行比较。
例子如下:
|
1 2 3 4 5 6 7 8 9 10 |
CC = gcc GCCVERSIONGTEQ4 := $(shell expr `gcc -dumpversion | cut -f1 -d.` \>= 4) CFLAGS = -g ifeq "$(GCCVERSIONGTEQ4)" "1" CFLAGS += -Wtype-limits endif all: $(CC) $(CFLAGS) prog.c -o prog |
要将完整的3部分GCC版本(不仅第一位数字)转换成数字格式,适合比较(例如40701)使用
|
1 |
gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$/&00/' |
其中解决了任何版本部分中双数字版本号的可能性,以及gcc -dumpversion输出内容缺少3个部分的可能性(在一些较早的GCC版本中存在这种情况)。
所以要测试MakeFile中的版本,使用(注意$$里面的最后一个sed命令)
|
1 2 3 4 |
GCC_GTEQ_472 := $(shell expr `gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/'` \>= 40702) ifeq "$(GCC_GTEQ_472)" "1" ... endif |
我刚刚遇到这个问题,我需要测试GCC的前两位数字,想要一个比上面sed过滤字符串更复杂的操作。我使用bc进行比较,因为它支持浮点数(expr将非整数(non-integers)都视为字符串):
|
1 2 3 4 |
GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif |
如果在GCC 4.9之后发布了GCC 4.10,那么用sed处理是必要的:
|
1 2 3 4 |
GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | sed -e 's/\./*100+/g' | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif |
也可以使用下面的方式正常编译Linux Kernel 4.13-rc7/Linux Kernel 4.13 Mainline。
建议使用VirtualBox上建立虚拟机,保证磁盘空间不小于32GB,给root用户设置密码,远程通过shell登录到虚拟机。
查询虚拟机的IP地址的时候,使用
|
1 |
$ /sbin/ifconfig |
命令查询。虚拟机网卡设置的时候,设置为桥接模式,默认的NAT模式无法通过SSH登录。
然后执行如下命令:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ cd ~ $ wget https://git.kernel.org/torvalds/t/linux-4.13-rc6.tar.gz -O linux-4.13-rc6.tar.gz $ tar -zxvf linux-4.13-rc6.tar.gz $ cd linux-4.13-rc6/ # 升级系统工具,如果不更新,有时候会出现无法编译的情况 $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install make $ sudo apt-get install build-essential $ sudo apt-get install kernel-package $ sudo apt-get install ncurses-dev #一路回车到底 $ make oldconfig $ make-kpkg --initrd kernel-image kernel_headers |
完成后,在当前用户目录下生成linux-image-4.13.0-rc6_4.13.0-rc6-10.00.Custom_amd64.deb安装包,执行如下命令安装:
|
1 2 3 |
$ cd ~ $ sudo dpkg -i linux-image-4.13.0-rc6_4.13.0-rc6-10.00.Custom_amd64.deb |
网站一直使用letsencrypt提供的HTTPS证书,这个证书的问题在于每隔三个月就必须更新一次,本次更新证书的时候,提示如下错误:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Error: couldn't get currently installed version for /root/.local/share/letsencrypt/bin/letsencrypt: Traceback (most recent call last): File "/root/.local/share/letsencrypt/bin/letsencrypt", line 7, in <module> from certbot.main import main File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/certbot/main.py", line 9, in <module> from acme import jose File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/acme/jose/__init__.py", line 37, in <module> from acme.jose.interfaces import JSONDeSerializable File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/acme/jose/interfaces.py", line 9, in <module> from acme.jose import util File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/acme/jose/util.py", line 4, in <module> from cryptography.hazmat.primitives.asymmetric import rsa File "/root/.local/share/letsencrypt/local/lib/python2.7/site- packages/cryptography/hazmat/primitives/asymmetric/rsa.py", line 14, in <module> from cryptography.hazmat.backends.interfaces import RSABackend File "/root/.local/share/letsencrypt/local/lib/python2.7/site- packages/cryptography/hazmat/backends/__init__.py", line 7, in <module> import pkg_resources File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 36, in <module> import plistlib File "/usr/lib/python2.7/plistlib.py", line 62, in <module> import datetime ImportError: No module named datetime |
错误发生的原因在于letsencrypt自己构建了一个Python的虚拟环境来隔离,但是早期建立的虚拟环境中是缺少部分软件包的,而自身的BUG导致也没有重新更新虚拟环境,导致出现异常。
解决方法就是删除letsencrypt自己构建的Python的虚拟环境,然后继续执行脚本让他重建即可。
|
1 |
$ rm -rf ~/.local/share/letsencrypt |
Ubuntu系统上,由于某些原因导致磁盘空间不足,需要分析一下磁盘使用情况,看看是哪个目录或者应用占据了磁盘。
Ubuntu系统默认自带的磁盘分析工具是baobab,如果没有自动安装,可以执行如下命令来手动安装:
|
1 |
$ sudo apt-get install baobab |
这个工具的问题在于,如果直接点击启动,会由于权限问题,无法完整的分析磁盘。
因此,需要在命令行下面用root权限去执行:
|
1 |
$ sudo baobab |
在Ubuntu 16.04系统上执行如下命令
|
1 |
$ dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000 |
的时候,可能会非常耗时,这个时候,如果让dd命令输出执行进度信息,会非常有用。
重新打开一个Shell,然后执行如下命令即可每秒输出一次进度信息
|
1 |
$ watch -n 1 pkill -USR1 -x dd |
在编译C++代码的时候,我们有时需要比较一下不同编译器之间优化性能的差异,因此需要在Clang与GCC之间进行切换,用来比较最后的实际效果。
在Ubuntu 16.04系统上使用如下命令进行切换
|
1 2 |
$ sudo apt-get install clang $ sudo update-alternatives --config c++ |
目前,perf是Linux系统上最全面最方便的一个性能检测工具。由Linux内核携带并且同步更新。
Ubuntu 16.04系统上需要执行如下命令安装:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 常规内核使用 #sudo apt-get install linux-tools-generic # 低延时内核使用 #sudo apt-get install linux-tools-lowlatency # 因此我们根据内核自动选择安装 $ sudo apt-get install linux-tools-`uname -r | cut -d- -f1-2`-`uname -r | cut -d- -f3` $ sudo apt-get install linux-tools-common #解决报错"Kernel address maps (/proc/{kallsyms,modules}) were restricted. Check /proc/sys/kernel/kptr_restrict before running 'perf record'". $ sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict" |
使用方法如下(gcc编译时最好使用-g参数,生成符号,方便调试):
|
1 2 3 4 5 6 |
#生成性能日志文件,默认生成 perf.data $ sudo perf record -e cpu-clock -g ./hello #解析性能日志 $ perf report -g -i perf.data |