Windows 7系统上安装CentOS 7后通过修改grub2添加Windows 7启动引导项

按照以往的经验,先安装Windows 7之后,再装CentOS 7,那么CentOS 7应该会自动添加Windows 7启动项。但是安装完成后,发现启动项里没有Windows 7

我们需要手动添加Windows 7的启动项。

我们需要修改grub2的模版文件,然后执行grub2-mkconfig自动重建grub2引导列表。

$ sudo cp /etc/grub.d/40_custom /etc/grub.d/41_win7_custom

$ sudo vi /etc/grub.d/41_win7_custom

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Windows 7'{
set root=(hd0,1)
chainloader +1
}

$ grub2-mkconfig -o /boot/grub2/grub.cfg
$ reboot

至于set root=(hd0,1),还是set root=(hd0,msdos1),或者set root=(hd0,msdosX),请在启动列表中按下e键,进入grub rescue模式,执行ls命令列出分区,如果第一个启动不了,请逐个分区都试试。

参考链接


Centos7 + Windows7 双系统,通过修改grub2,重新添加 Win7 启动引导项

NVIDIA TX2 (Ubuntu 16.04)上安装CUDA 8.0

使用如下方式安装:

$ cd ~ 

$ wget http://developer.download.nvidia.com/devzone/devcenter/mobile/jetpack_l4t/013/linux-x64/cuda-repo-l4t-8-0-local_8.0.84-1_arm64.deb

$ sudo dpkg -i cuda-repo-l4t-8-0-local_8.0.84-1_arm64.deb

$ sudo apt-get update

$ sudo apt-get install cuda-toolkit-8-0

至于如何获取最新的NVIDIA TX2上使用的CUDA 8.0版本的下载地址,请访问Jetson Download Center,下载目前最新的JetPack 3.1。执行之后在存储目录下的repository.json中找到最新的下载链接即可。当然也可以让JetPack 3.1自动下载完成最新的CUDA 8.0版本到指定目录。

Ubuntu 16.04上使用crosstool-ng编译Nvidia TX2上使用的boost库

目前在Nvidia TX2上尝试安装ROS Kinetic的时候发现依赖libboost-all-dev,但是自带的源http://ports.ubuntu.com下面没有合适的源,尽管在universe源下面包含libboost-all-dev ,但是实际安装的时候发现安装不上。

因此尝试手工编译最新的boost安装包,建立自己的源。

首先,编译安装最新的crosstool-ng,如下:

$ sudo apt-get install git

$ sudo apt-get install gperf

$ sudo apt-get install bison

$ sudo apt-get install flex

$ sudo apt-get install texinfo

$ sudo apt-get install help2man

$ sudo apt-get install gawk

$ sudo apt-get install libncurses5-dev

$ cd ~

$ git clone https://github.com/crosstool-ng/crosstool-ng.git

$ cd crosstool-ng

$ git checkout crosstool-ng-1.23.0

$ ./bootstrap

$ ./configure --prefix=/usr/local

$ make

$ sudo make install

$ cd ~

$ mkdir tx2

$ cd tx2

#用树莓派的模板作为参考模板即可
$ cp ~/crosstool-ng/samples/aarch64-rpi3-linux-gnueabi/crosstool.config .config

$ ct-ng oldconfig

#默认一路回车即可,如果使用图形界面配置执行 ct-ng menuconfig
 
$ unset LD_LIBRARY_PATH

$ ct-ng build

生成的工具链在~/x-tools/aarch64-rpi3-linux-gnueabi目录下,编译的时候,指定编译工具即可。

安装编译依赖

$ sudo apt-get install devscripts

$ sudo apt-get install cdbs

$ sudo apt-get install python-dev

$ sudo apt-get install libbz2-dev

接着,下载并编译最新的代码

#!/bin/bash
export DEBVERSION=1.58.0-1
if [ ! -d "boost_1_58_0" ]; then
    wget "http://nchc.dl.sourceforge.net/project/boost/boost/1.58.0/boost_1_58_0.tar.bz2" -O boost_1_58_0.tar.bz2
    tar xjvf boost_1_58_0.tar.bz2
fi
cd boost_1_58_0

:<<BLOCK
'export DEBVERSION=1.60.0-1
if [ ! -d "boost_1_60_0" ]; then
 wget "http://downloads.sourceforge.net/project/boost/boost/1.60.0/boost_1_60_0.tar.bz2" -O boost-all_1.60.0.orig.tar.bz2
 tar xjvf boost-all_1.60.0.orig.tar.bz2
fi
cd boost_1_60_0
'
BLOCK

#Build DEB
rm -rf debian
mkdir -p debian
#Use the LICENSE file from nodejs as copying file
touch debian/copying
#Create the changelog (no messages needed)
dch --create -v $DEBVERSION --package libboost-all ""
#Create copyright file
touch debian
#Create control file
cat > debian/control <<EOF
Source: libboost-all
Maintainer: LongSky <wangqiang1588@sina.com>
Section: misc
Priority: optional
Standards-Version: 3.9.2
Build-Depends: debhelper (>= 8), cdbs, libbz2-dev, zlib1g-dev

Package: libboost-all
Architecture: arm64
Depends: \${shlibs:Depends}, \${misc:Depends}, libboost-all (= $DEBVERSION)
Description: Boost library, version $DEBVERSION (shared libraries)

Package: libboost-all-dev
Architecture: any
Depends: libboost-all (= $DEBVERSION)
Description: Boost library, version $DEBVERSION (development files)

Package: libboost-build
Architecture: any
Depends: \${misc:Depends}
Description: Boost Build v2 executable
EOF
#Create rules file
cat > debian/rules <<EOF 
#!/usr/bin/make -f
%:
	dh \$@
override_dh_auto_configure:
	./bootstrap.sh
override_dh_auto_build:
	./b2 link=static,shared -j 1 --prefix=`pwd`/debian/libboost-all/usr/
override_dh_auto_test:
override_dh_auto_install:
	mkdir -p debian/libboost-all/usr debian/libboost-all-dev/usr debian/libboost-build/usr/bin
	./b2 link=static,shared --prefix=`pwd`/debian/libboost-all/usr/ install
	mv debian/libboost-all/usr/include debian/libboost-all-dev/usr
	cp b2 debian/libboost-build/usr/bin
	./b2 install --prefix=`pwd`/debian/libboost-build/usr/ install
EOF
#Create some misc files
echo "8" > debian/compat
mkdir -p debian/source
echo "3.0 (quilt)" > debian/source/format
#Build the package
nice -n19 ionice -c3 debuild -b -d -uc -us

注意,对于boost-1.58来说,当时的代码是没有检测ARM64的功能的,当年也没有ARM64的芯片。因此需要修改{boost_root}/libs/config/checks/architecture/arm.cpp里面的代码,增加ARM64的判断

#if !defined(__arm__) && !defined(__thumb__) && \
    !defined(__TARGET_ARCH_ARM) && !defined(__TARGET_ARCH_THUMB) && \
    !defined(_ARM) && !defined(_M_ARM)
#error "Not ARM"
#endif

调整为

#if !defined(__arm__) && !defined(__thumb__) && \
    !defined(__TARGET_ARCH_ARM) && !defined(__TARGET_ARCH_THUMB) && \
    !defined(_ARM) && !defined(_M_ARM) && !defined(__aarch64__)
#error "Not ARM"
#endif

参考链接


Linux下编辑ISO文件的方法

我们知道Windows下有类似UltraISO的这样的软件可以用来编辑ISO文件,可引导ISO也没有问题。近来在Linux下玩的比较多,正好要改个ISO,于是就开始找Linux下有没有类似的软件。

Ubuntu软件中心里有一款叫ISOMaster的软件,可以创建和修改ISO文件。

继续阅读Linux下编辑ISO文件的方法

OpenCV使用cv::imshow在子线程中更新图片不刷新

Ubuntu 16.04上测试OpenCV 3.2,遇到一个在子线程中更新图像,而界面不刷新的问题。

$ sudo apt-get install libopencv-dev

编译执行如下代码:

#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);
}
$ g++ opencv_imshow.cpp   -I `pkg-config --libs opencv` -lpthread -o opencv_imshow

可以看到,上面的代码执行之后,界面并没有出现,即使出现也没有刷新。

这个问题是由于界面更新必须在主线程中执行,需要手工通知主线程。

修改后的代码如下:

#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);
}

也就是每次更新图片后手工调用代码

cv::waitKey(30);

这个等候时间,只要大于0即可,比如:

cv::waitKey(1);

参考链接


c++ opencv image not display inside the boost thread

在Makefile中检查gcc版本

问题描述

我想使用一些在旧的GCC版本中不可用的GCC警告开关(例如-Wtype-limits)。

有没有一个简单的方法来检查GCC版本?

最佳解决方案

我不会说容易,但是可以使用GNU makeSHELL函数来执行gcc --version命令,然后使用ifeq条件表达式来检查版本号,并适当地设置CFLAGS变量。

以下是一个简单的MakeFile示例:

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命令进行比较。

例子如下:

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)使用

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命令)

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)都视为字符串):

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处理是必要的:

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

参考链接


在Makefile中检查gcc版本?

OpenMdeiaValut 3.0.86上编译Linux Kernel 4.13-rc6/Linux Kernel 4.13-rc7/Linux Kernel 4.13 Mainline

也可以使用下面的方式正常编译Linux Kernel 4.13-rc7/Linux Kernel 4.13 Mainline

建议使用VirtualBox上建立虚拟机,保证磁盘空间不小于32GB,给root用户设置密码,远程通过shell登录到虚拟机。

查询虚拟机的IP地址的时候,使用

$ /sbin/ifconfig

命令查询。虚拟机网卡设置的时候,设置为桥接模式,默认的NAT模式无法通过SSH登录。

然后执行如下命令:

$ 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安装包,执行如下命令安装:

$ cd ~

$ sudo dpkg -i linux-image-4.13.0-rc6_4.13.0-rc6-10.00.Custom_amd64.deb

参考链接


ubuntu 16.04执行letsencrypt的时候报告错误“ImportError: No module named datetime”

网站一直使用letsencrypt提供的HTTPS证书,这个证书的问题在于每隔三个月就必须更新一次,本次更新证书的时候,提示如下错误:

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的虚拟环境,然后继续执行脚本让他重建即可。

$ rm -rf ~/.local/share/letsencrypt

参考链接


Ubuntu分析磁盘使用情况

Ubuntu系统上,由于某些原因导致磁盘空间不足,需要分析一下磁盘使用情况,看看是哪个目录或者应用占据了磁盘。

Ubuntu系统默认自带的磁盘分析工具是baobab,如果没有自动安装,可以执行如下命令来手动安装:

$ sudo apt-get install baobab

这个工具的问题在于,如果直接点击启动,会由于权限问题,无法完整的分析磁盘。

因此,需要在命令行下面用root权限去执行:

$ sudo baobab

参考链接


Ubuntu 16.04上查看dd命令的进度信息

Ubuntu 16.04系统上执行如下命令

$ dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000

的时候,可能会非常耗时,这个时候,如果让dd命令输出执行进度信息,会非常有用。

重新打开一个Shell,然后执行如下命令即可每秒输出一次进度信息

$ watch -n 1 pkill -USR1 -x dd

参考链接