0%


作者: 耗子007


基础用法

1. 安装指定版本的包

1
pip3 install docker-py==1.8.1

2. 使用代理proxy

1
pip3 --proxy=http://username:password@proxy.com:8080 install docker-py==1.8.1


作者: 耗子007


问题描述

访问nginx搭建的网站时,报403 forbidden错误的原因。

解决办法

第一,是因为缺少index.html或者index.php等
第二,是因为没有权限。

参考:
http://blog.51yip.com/apachenginx/1512.html


作者: 耗子007


设置/proc/sys/vm/legacy_va_layout为0,调整进程地址空间的heap增长方向为从上往下。
这样可以使得heap的上限超过2G。

1
2
0 ----------------------------------------------------------------------------------------- 3G -------- 4G
保留 | 代码段 | 数据段 | BSS段 | 堆-增长方向向上 | 内存映射 | 栈-增长方向向下 | 命令行参数 | 环境变量 内核段
1
2
3
4
/proc/sys/vm/legacy_va_layout (since Linux 2.6.9)
If nonzero, this disables the new 32-bit memory-mapping
layout; the kernel will use the legacy (2.4) layout for all
processes.

修改heap增长方向代码(以linux4.1的arm为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void arch_pick_mmap_layout(struct mm_struct *mm)
{
unsigned long random_factor = 0UL;

if (current->flags & PF_RANDOMIZE)
random_factor = arch_mmap_rnd();

if (mmap_is_legacy()) { //获取legacy_va_layout的值,非零使用正常模式
mm->mmap_base = TASK_UNMAPPED_BASE + random_factor;
mm->get_unmapped_area = arch_get_unmapped_area;
} else { //为零,使用自上向下的模式
mm->mmap_base = mmap_base(random_factor);
mm->get_unmapped_area = arch_get_unmapped_area_topdown;
}
}


作者: 耗子007


softlockup和hardlockup含义

softlockup

内核在内核模式loop超过get_softlockup_thresh()获取的阈值时间,导致其他任务没有机会运行的bug,称为”softlockup”。
简单来说,就是抢占被关闭时间超过阈值,导致其他进程无法调度。

hardlockup

CPU在内核模式loop时间超过hw_nmi_get_sample_period函数获取的阈值时间,导致其他中断不能运行的bug,称为”hardlockup”。
简单来说,就是中断被关闭时间超过阈值,导致其他中断无法运行。

softlockup注册和触发流程

基于proc文件系统的watchdog流程

1
2
3
4
5
6
7
proc_watchdog_update 更新watchdog状态,如果开启了watchdog,触发开狗流程
--> watchdog_enable_all_cpus 打开所有cpu的狗
--> smpboot_register_percpu_thread(&watchdog_threads) 创建启动所有CPU上面的hotplug相关线程
--> __smpboot_create_thread 创建线程,线程执行的函数是smpboot_thread_fn
--> smpboot_thread_fn 开始会注册调用watchdog_threads的setup(就是watchdog_enable),正常流程会不断的执行watchdog_threads的thread_fn
--> watchdog_enabled 会启动一个hrtimer的定时器,触发的回调函数是watchdog_timer_fn
--> watchdog_timer_fn 根据is_softlockup判断是否发生softlockup

watchdog函数就是喂狗,保证不出现softlockup,这里不需要关注太详细。

1
2
3
4
5
6
7
8
9
static void watchdog(unsigned int cpu)
{
__this_cpu_write(soft_lockup_hrtimer_cnt,
__this_cpu_read(hrtimer_interrupts));
__touch_watchdog();

if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED))
watchdog_nmi_disable(cpu);
}

内核初始化时的流程

tick的方式,注册watchdog。

1
2
3
4
5
6
7
8
kernel_init 内核初始化
--> kernel_init_freeable
--> lockup_detector_init 如果开狗了会执行watchdog_enable_all_cpus;如果开启了CONFIG_TICKLESS,会注册tick_notify。
--> watchdog_enable_all_cpus 后续流程和proc的一致,参考上面的分析
--> register_tick_notifier 注册回调函数softlockup_tickonoff_callback
--> softlockup_tickonoff_callback 注册回调函数softlockup_tick_onoff
--> softlockup_tick_onoff 如果tick是打开的,会启动一个hrtimer,定期执行watchdog_timer_fn函数
--> watchdog_timer_fn 和上面的流程一致了


作者: 耗子007


基本操作

在host上,操作容器的网络设备

  • 需要查到容器的进程id==cpid,可以通过

    1
    cpid=$(docker inspect --format '{{.State.Pid}}' $1)
  • 需要把容器的netns挂到ip命令能操作的netns中—–

    1
    ln -s "/proc/$cpid/ns/net" "/var/run/netns/$cpid"
  • 查看容器中所有的网络设备以及配置信息

    1
    ip netns exec $cpid ip a
  • 查看容器中网络设备的类型信息:

    1
    ip netns exec $cpid ethtool "driver name(如eth0)"


作者: 耗子007


现象

用sqlite data browser 执行update命令,报错误:

1
unable to open database file

解决方法

sqlite库在对数据库进行操作时(本人估计是写操作),会在数据库的当前文件夹下创建一个临时文件,当操作结束时,该临时文件将被删除。 而远程用户一般不具备有对临时文件足够的权限,
所以会造成 无法打开、写或者删除临时文件。解决的方法就是递归地(加-R)将数据库所在文件夹设置为任何用户都有可读可写可删的权限。假如sqlite数据库路径为/database/, 则:

1
chmod -R 755 /database/

参考文章:http://blog.csdn.net/benthy2/article/details/17901821


作者: 耗子007


前提

我的wordpress是用sqlite作为数据库的
wordpress是运行在docker容器里面的
网站的所有数据都有备份
安装docker
按照“基于centos搭建wordpress的docker镜像”制作对应的docker镜像(假设名字为wordpress_sqlite)
拷贝备份数据到新机器的/workspace/wordpress/blogs/,执行

1
docker run –privileged -itd -p 8080:80 -v /workspace/wordpress/blogs/:/var/www/html wordpress_sqlite bash -l -c “/sbin/init”

此时,网站应该可以正常运行了。

注意:如果你修改了网站的域名,那么需要对sqlite数据库的数据进行修改。

##问题

当迁移的机器域名变化时,需要怎么修改网站配置。

准备环境:安装sqlite3,sqlitebrowser

最重要的就是需要修改两个配置:

WordPress地址(URL)—-对应wp_options的 home
站点地址(URL)—-对应wp_options的 siteurl

1
2
3
UPDATE wp_options SET option_value = replace( option_value, ‘http://www.old.com’, ‘http://www.new.com’ ) WHERE option_name = ‘home’ OR option_name = ‘siteurl’;
UPDATE wp_posts SET post_content = replace( post_content, ‘http://www.old.com’, ‘http://www.new.com’ ) ;
UPDATE wp_posts SET guid = replace( guid, ‘http://www.old.com’, ‘http://www.new.com’ ) ;

注意:

  • 第一,参考文章“sqlite数据库不能修改”
  • 第二,参考文章“wordpress登陆跳转卡住”
  • 第三,sqlitebrowser在update之后,需要执行“write changes”按钮,才能把修改写入到数据库文件中。

参考文章:


作者: 耗子007


现象

www.example.com域名为例

1
www.example.com/wp-login.php?redirect_to=www.example.com/wp-admin%2F&reauth=1

用户名和密码都是正确的,在redirect的时候,卡住不动。

解决方法

这是由于wp-admin文件夹的权限问题导致的,可以修改该文件夹的访问权限,“chmod -R 755 wp-admin”

参考文章:http://wordpress.stackexchange.com/questions/113161/wp-admin-url-doesnt-allow-to-login-and-redirects-to-same-page


作者: 耗子007


现象

1
2
3
rt := strings.Join([]string{“help”}, “-“)
fmt.Println(rt)
return

结果

此时help后面不会加上“-”,只会打印一个“help”