当lvremove失败时的解决思路

在删除逻辑卷的时候,遇到了如下问题:

1
2
# lvremove /dev/cinder-volumes/volume-cf5565aa-291c-49ba-a75c-6842d4655d34
Can't remove open logical volume "volume-cf5565aa-291c-49ba-a75c-6842d4655d34"

在serverfault.com找到如下解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
# fuser /dev/cinder-volumes/volume-cf5565aa-291c-49ba-a75c-6842d4655d34
/dev/dm-14: 1749
# lsof | grep /dev/dm-14
tgtd 1749 root 19u BLK 252,14 0t0 8546 /dev/dm-14
# service tgt stop
tgt stop/waiting
# lvremove /dev/cinder-volumes/volume-cf5565aa-291c-49ba-a75c-6842d4655d34
Do you really want to remove active logical volume volume-cf5565aa-291c-49ba-a75c-6842d4655d34? [y/n]: y
Logical volume "volume-cf5565aa-291c-49ba-a75c-6842d4655d34" successfully removed

参考引用


调用python-novaclient遇到的问题

在做私有应用平台的过程中,需要对nova操作,这里选择直接调用python-novaclient的python api。o(╯□╰)o的是,python api没有文档,只能一个一个的翻源文件,好在代码非常规范,注释写的非常详细,这里就感受到了具有良好的编码习惯是件多么让后来人敬佩。在调用这些api的时候遇到了一些问题,这里集中记录说明:

  1. Error: No nw_info cache associated with instance (HTTP 400)

    这个原因是获取不到instance的fixed_ip的信息,也就是instance还没初始化好,我实在给instance添加floating_ip的时候遇到的这个问题。
    参考引用


iOS6 APP 适配 iOS7 简易方法

最近需要适配一个iOS6 APP到iOS7下,发现View会顶到最上面。查了下发现,因为iOS7默认开启了导航栏的半透明效果,能够看见View从它下面滑过,这样的话会导致原有布局正常的APP发生界面尺寸错乱,整体上移,底部留白。
通过如下设置可以关掉这个效果,让布局同iOS6一致。

1
self.navigationController.navigationBar.translucent = NO;

如何安装pip

pip是一个专门用来安装Python包的管理的工具,比如用来安装django,用法就想apt-get一样,非常的方便。
工具的安装方法如下:

1
2
3
4
5
6
7
先安装Setuptools
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
python ez_setup.py --user
再安装pip
curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
[sudo] python get-pip.py

研究OpenStack卷加密碰到的问题

OpenStack环境搭建

这一步有两个选择:

  1. 一种就是正统的真实搭建,所有都按生产环境来部署,费时费力。
  2. 还有一种就是官方推荐的一键安装DevStack,直接安装最新的版本,体验最新的特性。

至于如何选择,就看需求。当时我选择了DevStack,因为本身只是去实现个功能,这个就完全满足了。安装有点费时,默认会安装在 /opt/stack/ 下面,里面还有个devstack的目录,一般在这里启动,停止DevStack。官方没有自带重启 DevStack 的各种服务,不过高手自在民间,于是有外国有人写了重启的脚本。Restarting DevStack
所有的都OK了,然后访问服务器地址,就能看到Horizon了,账号admin,密码在服务器启动的时候,最后的地方会有提示,当然也就是你安装DevStack的时候输入的。

卷加密

环境OK了,接下来研究卷加密。google了下LVM加密相关的内容,发现了Linux下面用cryptsetup就能够实现卷加密的功能,这个可以通过apt-get来获取,只有几百KB。它把LVM加密过后必须要输入正确的密码才能mount使用,否者就无法挂载,自然也就不能查看里面的内容。操作的对象为LVM,所以需要事先创建好LVM,如何创建LVM看这里

cryptsetup LUKS加密步骤如下(假设LVM名为:lvm1, VG名为:vgtest):

1
2
cryptsetup luksFormat /dev/vgtest/lvm1
#回车后,会要求输入大写的YES,然后就输入密码

解密,并使用:

1
2
3
4
5
6
7
cryptsetup luksOpen /dev/vgtest/lvm1 encryptLVM
#回车后,要求输入刚才加密时设置的密码,正确则会创建一个Device-Mapper文件,/dev/mapper/encryptLVM,错误则无法生成,也就无法挂载使用。
#格式化系统,并挂载使用
mkfs.ext3 /dev/mapper/encryptLVM
mkdir /mnt/crypt
mount /dev/mapper/encryptLVM /mnt/crypt

卸载设备:

1
2
umount /mnt/crypt
cryptsetup luksClose /dev/mapper/encryptLVM

如果要再使用的话,只需要再luksOpen,然后mount就可以了,不需要再luksFormat了。

整合到DevStack

加密和解密过程发生在LVM的attach和detach过程中,所以只需要在/nova/virt/libvirt/volume.py中的相关部分加上cryptsetup的加密,解密和关闭操作就可以实现LVM加密的功能,这部分就看个人怎么实现了。具体的实现代码可参考Add encryption support for volumes


iOS地图开发初探

周一接到个Demo任务,一个LBS应用,结合地图实现一个寻找周边停车场并且提供预订以及路线规划的功能。
拿到任务,马上想起iOS自带的Map Kit,到现在还没玩过这个框架,终于可以尝试下了。忙活了几天,基本做出来了,简单总结下几个主流的地图SDK。

Map Kit

苹果自家地图服务,集成最好,iOS6以前数据来自Google,现在换数据提供商了,中国区使用高德的数据。但是不提供路径规划功能。

Google Map SDK

Google出的地图SDK,说实话,数据准确度上面,更相信Google,但是试用了下,依然不提供路径规划功能。

高德地图SDK

高德的数据,没啥感觉,不喜欢不讨厌,但是它提供路径规划功能,最后也采用这个。

百度地图SDK

鼓起勇气尝试百度的SDK,具体细节还没深究,第一映像分就给不高,直接下载然后在touch5上面运行,发现下面没填充完,一行空白,表示根本没做这一代的屏幕适配,尼玛百度你是个大厂啊,这么玩,其它几家都没这么粗心,你这太让人失望了。Demo提供的其它功能也没兴趣试下去,直接切换到高德去了。


NSTimer 不准时的处理

NSTimer作为iOS开发中的定时器,用处广泛,最近在使用它作为倒计时时,出了点小状况,如果使用如下方法初始化:

1
NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

如果我在拖动UIScrollView并且不放的时候,Timer并不会被触发,1s的间隔,我猜测可能是Timer附着在主线程上,也就是UI线程,如果主线程需要做UI重绘等大量计算或者被阻塞住,那么Timer的计时准确率就会变低,什么时候来都不确定,只有主线程空闲了,才会准确到达(任然有50-100毫秒误差),后来查阅了文档,果然是说Timer附着在NSRunLoop里,所以要保证Timer的触发,就应该换到其他NSRunLoop去,用下面方法就可以解决:

1
2
yourTimer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(updateTime) userInfo:nil repeats:YES];;
[[NSRunLoop currentRunLoop] addTimer:yourTimer forMode:NSRunLoopCommonModes];

具体参数信息就需要自己查文档了。


curl 用法

curl可以作为下载命令使用,特此记录。

下载文件

下面为直接下载文件,保存为原文件名:
curl -O http://mif.polimercolor.ru/mifsoft/MDict.zip

下面为修改文件名:
curl -O MDict_ver.zip http://mif.polimercolor.ru/mifsoft/MDict.zip

断点续传

下面为断点续传的方法, 使用-C选项,利用-C -选项并指出已经部分下载的文件名,curl将自动下载剩余的部分:
curl -C - -o Smultron-2.2.6.dmg http://jaist.dl.sourceforge.net/Smultron-2.2.6.dmg

使用代理服务器

curl -x 10.1.27.101022 ftp://ftp.funet.fi/README

以上为不需要账号密码的代理服务器下载方法,下面为提供账号密码:
curl -U user:password -x 10.1.27.10:1022 ftp://ftp.funet.fi/README

更多功能

使用 man curl,自行查看帮助。

引用

使用cURL下载文件


Raspberry Pi+Yeelink.net 在线监视系统状态


Raspberry Pi

上图为在Yeelink.net生成的曲线图,数据来源于家中的Raspberry Pi一分钟一次的数据上传,分别上传了CPU,内存,剩余空间的数据。

上传脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /bin/sh
# File path: ~/Yeelink/rpi_sensors.sh
apikey=<your api key>
url_cpu=http://api.yeelink.net/v1.0/device/<device no.>/sensor/<sensor no.>/datapoints
url_mem=http://api.yeelink.net/v1.0/device/<device no.>/sensor/<sensor no.>/datapoints
url_disk=http://api.yeelink.net/v1.0/device/<device no.>/sensor/<sensor no.>/datapoints
mem_used=$(free -m | grep "Mem" | egrep "[[:digit:]]+" -o | head -n 2 | tail -n 1)
cpu_load=$(iostat -c | tail -n 2 | egrep "[[:digit:].]+" -o | head -n 1)
disk_avaliable=$(df -l | grep "/dev/sda5" | egrep "[[:digit:]]+" -o | tail -n 3 | head -n 1)
disk_ava=`echo "$disk_avaliable/1024"|bc`
echo $disk_ava
curl -d "{\"value\":$mem_used}" -H "U-ApiKey: $apikey" $url_mem
curl -d "{\"value\":$cpu_load}" -H "U-ApiKey: $apikey" $url_cpu
curl -d "{\"value\":$disk_ava}" -H "U-Apikey: $apikey" $url_disk
exit 0

上面的脚本获取了CPU,内存,剩余空间的值,然后通过Yeelink提供的api地址上传上去,但是还需要通过:

1
crontab -e

来定时运行,内容看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
*/1 * * * * ~/Yeelink/rpi_sensors.sh

上述代码为每隔1分钟运行一次rpi_sensors.sh,这样就能不间断上传数据了,如果crontab没有修改过默认编辑器的话,建议先修改为vim。
tips:对于上传间隔Yeelink有个限制,不能小于10s。

引用

[linux]在Yeelink云端架设笔记本运行监视器