分类目录归档:Linux

对linux的研究

在Win7上使用ipv6来链接Samba服务器

SMB自从openwrt的barrier_breaker对ipv6的支持变得非常好之后,开始对自己房间的网络更新到ipv6。

不得不说,ipv6的本地地址是个好东西,这个fe80开头的地址,由于继承了MAC地址的唯一性,所以可以直接使用而不会产生冲突。这时候,使用ipv6就不需要考虑ipv4地址是否已经配置这种问题,真正的即插即用,无需配置。

这种情况下,只要开机之后网卡起来了,SSH就能连通,过去把机器的网络配置弄错导致连不上的问题就再也没有了。

于是渐渐的将链接迁移到ipv6上。而骨干路由用的是石像鬼的固件,很遗憾,石像鬼对ipv6基本上没有支持,于是只能用在我的房间里面了。

既然SSH换过去了,Samba也自然得升上去,切换成ipv6。

经过了一番google,找到一个方法:

使用一个特别的dns服务器,将域名解析成ipv6地址,由于smb能够在ipv6上工作,这就能通过一个折中的办法,来达到访问ipv6的SMB服务器。

然而,这种办法相当的不便,因为该服务器为整个互联网服务,这意味着你必须连接到外部网络才能使用他们的服务,为毛我用自家的服务还非得跑出去一趟不可?网络延迟不说还要经一次GFW。

 

也考虑过在OptenWrt上自行设置 DNS解释记录,但是dnsmasq似乎不能处理ipv6的本地 hosts记录,于是最后还是放弃了使用ipv6。

pxe启动archlinux的配置字段

参考:http://www.cianmcgovern.com/serving-live-arch-linux-environment-pxe/

另外参照之前关于建立pxe服务器的文章:https://ferrets.space/2014/04/07/%e5%9c%a8%e5%ae%b6%e9%87%8c%e5%81%9a%e4%ba%86%e4%b8%aapxe%e6%9c%8d%e5%8a%a1%e5%99%a8/

其中,pxelinux.cfg/default中关于archlinux启动字段是这样的

LABEL archlinuxlive
menu label Arch Linux Live 64bit
kernel archlinuxlive/arch/boot/x86_64/vmlinuz
append initrd=archlinuxlive/arch/boot/x86_64/archiso.img archisobasedir=arch archiso_nfs_srv=NFS_SERVER_IP:/home/pxeroot/archlinuxlive ip=:::::eth0:dhcp -

不同的linux的append字段都不一样呢

在家里做了个pxe服务器

参考:http://wiki.openwrt.org/doc/howto/tftp.pxe-server

https://wiki.archlinux.org/index.php/NFS_(简体中文)

http://archlinuxarm.org/forum/viewtopic.php?f=31&t=3854

https://wiki.archlinux.org/index.php/Tftpd_server

新到手了只pogoplug,只用来做samba的话感觉稍微有点浪费,偶尔看到了网络启动系统这种东西,于是也想做一个来玩。

材料:一个dhcp服务器,一个tftp服务器,一个nfs服务器。

网上很多教程都是让pxe服务器自己包揽全部工作,这让我不高兴,dhcp这东西就该由openwrt做,文件服务就该让pogo来做,但是网上相关的教程都没有分工的内容,于是看着很多教程,自己研究了一下,终于成功了。

pxe网络拓扑

 

首先,在openwrt上改动一下dnsmasq的配置

/etc/config/dhcp

在末尾加上一段

config boot linux
        option filename 'pxelinux.0'
        option serveraddress 'tftp服务器地址'
        option servername '服务器名称'

至于服务器名称有没有要求……这个没试过,就照着本地的DNS名称填好了。

好了之后,重启dnsmasq,openwrt端的服务就算完成了。

接下来是pogoplug这边:

首先,是tftp服务器。安装tftp-hpa软件包,然后修改

/usr/lib/systemd/system/tftpd.service

中的tftpd根目录

[Unit]
Description=hpa's original TFTP daemon

[Service]
ExecStart=/usr/sbin/in.tftpd -s /srv/tftp/
StandardInput=socket
StandardOutput=inherit
StandardError=journal

先用/srv/tftp/做例子,先去下载https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.02.tar.gz,然后解压。这里只需要里面的部分文件,包括这些:

syslinux-6.02/bios/core/pxelinux.0
syslinux-6.02/bios/com32/elflink/ldlinux/ldlinux.c32
syslinux-6.02/bios/com32/menu/vesamenu.c32
syslinux-6.02/bios/com32/lib/libcom32.c32
syslinux-6.02/bios/com32/libutil/libutil.c32

讲这几个文件拷贝到/srv/tftp/,然后在/srv/tftp/里面新建一个文件夹,来存放kernel和initrd。例如/srv/tftp/ubuntu,或者直接将ubuntu的镜像文件挂载到/srv/tftp/disks/ubuntu,可以让tftp客户端直接访问到。

然后,新建一个文件夹/srv/tftpd/pxelinux.cfg,在里面新建一个default的配置文件,内容如下:

DEFAULT vesamenu.c32
PROMPT 0
MENU TITLE OpenWRT PXE-Boot Menu

label Ubuntu
        MENU LABEL Ubuntu Live 13.10 64-Bit
        KERNEL disks/ubuntu/casper/vmlinuz.efi
        APPEND boot=casper ide=nodma netboot=nfs nfsroot=192.168.1.1:/mnt/extstorage/tftp/disks/ubuntu1310-64/ initrd=disks/ubuntu/casper/initrd.lz
        TEXT HELP
                Starts the Ubuntu Live-CD - Version 13.10 64-Bit
        ENDTEXT

说明文字可以自行更改,kernel和initrd会通过tftp获取,在获取到kernel和initrd之后,会通过nfs加载系统。

然后启动服务器

systemctl start tftpd.socket tftpd.service

如果需要自启动tftp服务器,则使用

systemctl enable tftpd.socket

至此,tftp服务器配置完成。

然后,是配置nfs服务器:

archlinux的nfs帮助似乎出了点问题,教程不是很完整,在网友的帮助下,发现原来服务没启动完成。

要安装nfs服务,需要安装nfs-utils。

然后,修改/etc/exports,这将会控制那些目录可以被访问,例如新增这段(根据上面pxelinnux的配置):

/mnt/extstorage/tftp/disks/ubuntu1310-64/ 192.168.1.0/24(ro,fsid=0,no_subtree_check)

将会允许192.168.1.*的客户端访问/mnt/extstorage/tftp/disks/ubuntu1310-64/。完成之后,用

systemctl enable nfsd.service rpc-idmapd.service rpc-mountd.service rpcbind.service
systemctl start nfsd.service rpc-idmapd.service rpc-mountd.service rpcbind.service

启动并自启动nfs服务器(吐槽:没密码真的大丈夫?)

配置过程中发生了许多问题,这里给后人稍微提供一下解决的思路:

1:openwrt的dnsmasq配置,有没有指向正确的tftp服务器,tftp服务器能不能访问;

2:nfs服务器的挂载有没有问题。

基本上都是权限或者配置文件出错……折腾了快2天……

使用rsync

参考:http://acman.bluenest.net/wordpress/archives/113

最近新入手只硬盘,准备将数据从一个硬盘迁移到另外一个硬盘,然后发现了rsync这个神奇的东西。

rsync的用法大体来说是

rsync 来源 目标

不同的是,来源和目标可以是绝对路径,或者是“协议://用户名@服务器地址”等等

可以选择用作本地或者远端的同步。当然,你也可以选择使用映射的方式,将远端的文件夹映射到本地,然后像本地操作一样使用rsysc,又或者,使用rsync自带的协议。

使用映射这个的方法就不说了,说说自带的rsync协议的用法:

你可以直接使用参数的形式或者使用一个配置文件(当然是配置文件这个比较方便),下面是配置文件的写法

address = 10.1.1.100 # 你要把rsyncd開在哪個ip上,建議不要開在public ip
pid file = /var/run/rsyncd.pid # pid file 所在,ubuntu可能可以省,不過個人習慣加上去
use chroot = yes # 這個建議加上去,因為可以限制只能對下面設定的目錄進行同步
log file = /var/log/rsyncd.log #記錄檔

#下面是設定哪些路徑可以跟遠端同步
[backup] # 命名,此名稱為遠端連線時要用
path = /home/acman/bin/ # 路徑
read only = false #是否為唯讀,此為否,代表遠端不只能抓,也能改;如果是 read only = true ,就代表遠端只能抓不能改
uid = 1000 # 連線時使用的帳號uid
gid = 100 # 連線時使用的帳號群組 gid
hosts allow = 10.1.1.100 #允許那個遠端ip連線過來
#[path2] 如果有其它路徑,就再用[…]開始設另一個

使用rsync –daemon –config=FILE来启动rsync服务器。

然后客户端连接服务器:

最簡單的使用方法,在客戶端下指令:
rsync -av 10.1.1.100::backup backup/
# 第一個backup要和設定檔的[…]中的設定一致;後面的backup/就看你要備份到哪裡了

如果你設定 read only = false的話,你還可以反向備份,就是把客戶端的東西備份上去:
rsync -av mydata/ 10.1.1.100::backup/mydate
這樣就會把客戶端的mydata目錄,直接備到server上的/home/acman/bin/mydata/底下了;這邊要注意的是,如果你是這樣下指令:
rsync -av mydata/ 10.1.1.100::backup/
那它會把mydata底下的檔案,備份到 /home/acman/bin/底下,不會另開一個目錄

rsync這個指令的好處是它會自行比對兩端的資料是不是一樣,只會傳輸有變動的資料
當然還有其它功能,如砍遠端檔案,或是忽略特定檔案或目錄等等

2.另外如果你不想要多開一個rsyncd服務的話, rsync指令也允許通過ssh來進行傳輸;不需要做上面那些設定:
只要遠端有開sshd,就可以備份遠端檔案或是將本地檔案備份過去
指令下法一樣,不過多了 “-e ssh”,如下:
rsync -e ssh -av 10.1.1.100::backup backup/

……
……
……

结果还是磁盘映射的方式比较方便啊。

为ArchLinux增加/etc/rc.local启动脚本

因为打算手动写Pi的IP地址,于是很自然的打算vi /etc/rc.local,结果左下角出现了“新文件”的提示,然后我就纠结了,别这样,连自启动的脚本都没有了……我还怎么玩?

经过一番Google,在Ubuntu的论坛上发现了一个指导(为毛Arch的问题跑到Ubuntu的论坛去了):

http://forum.ubuntu.org.cn/viewtopic.php?f=155&t=395231

3楼说明了解决的办法:

修改/etc/systemd/system/rc-local.service

[Unit]
Description=/etc/rc.local Compatibility

[Service]
Type=oneshot
ExecStart=/etc/rc.local
TimeoutSec=0
StandardInput=tty
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

如果是简单的自定义命令,可写入/etc/rc.local,用上面的方法来处理。然后使用

systemctl enable rc-local.service

来启用这个脚本的服务。

不得不说ArchLinux这种管理方式也是相当的出色,但是因为刚接触,导致命令相当的不熟悉,让我控制的非常不舒服……

脚本错误:Syntax error: end of file unexpected

继续上参考:http://bbs.chinaunix.net/thread-1081627-1-1.html

嘛……因为是初学者的原因,犯了个非常低级的错误呢……

根据提示,知道了问题所在了,是结构没有完成,因为是用了嵌套的case结构,所以,漏掉了一个esac,也漏掉了一个;;

case 变量名 in
值1)
case 变量名 in
值11)
指令
;;
值12)
指令
;;
esac
;;
值2)
case 变量名 in
值21)
指令
;;
值22)
指令
;;
esac
;;
esac

-bash: ./script.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录

参考:http://blog.csdn.net/wdt3385/article/details/8015730

最近在做毕设,要用到shell script,于是开始编写,嘛,由于图形界面着实方便外加我是个懒人这个因素,所以编写平台是Windows & Samba & Notepad++,所以才弄出这么个混事来……

 今天在翻看以前写的简单的shell脚本时,发现一个问题: 

    当./运行时总是提示:  (bash: ./hello.sh: bin/bash: 坏的解释器: 没有那个文件或目录),但是当用sh运行时正确.

    原来的脚本:

    (试试看你能否一眼看出错误)

    #!bin/bash

    echo "Hello Linux!"

    后来几番检查发现自己写的丢了一些东西.

    应该把红体字改成  #!/bin/bash    (!后面少了/)

    唉,很简单的问题,自己以前没有发现还有这样的错误! shell脚本的确好用,可唯一难的就是格式要求太高!

-----------------------------------------------------------------------------------------------------------------------------------------------------------

另外出现此问题的原因还有:

/bin/sh^M:损坏的解释器: 没有那个文件或目

 今天在Windows环境下用UE写了个shell脚本,然后拿到linux下运行发现如下错误:

/bin/sh^M:损坏的解释器: 没有那个文件或目录

 出现这个问题的原因如下:在Windows下,每一行的结尾是\n\r,但是在Linux下文件的结尾是\n。因此在Windows环境下编辑过的文件在Linux下打开看的时候每一行的结尾就会多出来一个字符\r。

 因此,想要在Windows环境下编辑的脚本应该保存为UNIX而不是DOS格式,很多文本编辑器都支持另存为Unix格式的功能。

 如果脚本文件保存时使用了DOS格式,我们就可以通过以下几种方法来将它转换为UNIX格式:
 用vim打开该脚本,在命令行模式下输入:setff=unix来转换.
 使用命令:sed-i ‘s/\r$//’ urfile.
 使用UE打开该脚本,然后另存为UNIX换行符的脚本.

中的第二部分,我一看,果然编码是windows的,切换过去Unix就没问题了。

真不该在windows平台上做linux的开发……

将博客的https连接加强了

嗯,前几天已经强制了对博客使用https访问……感觉很好很强大,博客的等级突然就高起来了。

今天偶尔发现一个网站(https://www.ssllabs.com/ssltest/index.html),可以检查网站的安全性,于是兴冲冲的去测试了一下,结果发现了几个小问题(主要的,更零碎的就没管了)。

  • 启用了一种长度较短的加密算法;
  • 没有提供完整的证书链;
  • 可能受到BEAST攻击;

前面两个的话好说,稍微查了一下网络就ok,而且startssl也提供了完整的安装教程(lighttpd Apache nginx),略后悔没有仔细看。

问题是最后一个,BEAST攻击究竟是什么啊……

上网做了很多很多的Google,还打错字了,打成了beats,于是魔声总是出来捣乱。

最后,在一个网站(http://permalink.gmane.org/gmane.linux.debian.devel.security/16698)找到了一份方案,看起来像是一份邮件的备份。

里面提到了lighttpd的解决办法,就是在配置文件里面指定一下加密的算法,并且让服务器优先使用某些算法,就可以组织这种攻击了。

ssl.cipher-list =  "ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM"
ssl.honor-cipher-order = "enable"

应用了之后,再去做测试,果然BEAST攻击的提示没有了。

 

SSLLab测试结果

SSLLab测试结果

linux挂载samba储存

入手了RaspberryPi之后,发现容量果断的不足,这时候就是挂载文件系统的时候了。由于不同的系统之间的差异,软件包维护的不同,造成了挂载的命令稍微有点不一样。

RaspberryPi的话,samba并没有注册smbfs,而是使用了cifs(或许这个才是正常通用版?),所以,mount的用法稍微有点不一样

mount.cifs <remotetarget> <dir> -o <options>
Options:
 user=<arg>
 pass=<arg>
 dom=<arg>

挂载之后就能在mount表里面看到了

root@raspberrypi:~# df -h
文件系统             容量  已用  可用 已用% 挂载点
rootfs               7.2G  6.4G  409M   95% /
/dev/root            7.2G  6.4G  409M   95% /
devtmpfs             188M     0  188M    0% /dev
tmpfs                 38M  696K   37M    2% /run
tmpfs                5.0M     0  5.0M    0% /run/lock
tmpfs                 75M   68K   75M    1% /run/shm
/dev/mmcblk0p1        56M   17M   40M   30% /boot
/dev/sda1            7.4G  4.9G  2.2G   70% /media/16b2d773-3813-4672-99b8-6fc9be6cbed9
//192.168.11.1/Work   30G   27G  1.3G   96% /mnt/Openwrt/Work

如果想自动挂载的话,就需要写到fstab里面,格式如下

//SERVER/SHARENAME /mnt/MOUNTPOINT cifs noauto,noatime,username=USER,password=PASSWORD,workgroup=WORKGROUP 0 0

就能实现开机自动加载了。

使用checkinstall将源码打成安装包

参考:http://www.ibm.com/developerworks/cn/linux/l-cn-checkinstall/

以前就考虑过将源代码打成软件包,可是总觉得太麻烦了点。最近发现了点有趣的东西,再编译的时候就想打个包什么的吧,于是就上网查了一下。

结果就找到一个似乎挺方便的工具,叫做checkinstall。使用方法很简单,在编译软件包的时候,稍微做点修改就ok。

比如说,一般来说,到手一个软件的源码之后,就是解压、设定、编译、安装

wget PACKAGE_FILE
tar -vxf PACKAGE_FILE
cd PACKAGE_DIR
./configure [参数]
make
make install

checkinstall的话就是替换掉make install的那一步,直接checkinstall的话,可以顺便安装了,不过需要修改一下checkinstall的默认设定(/usr/local/lib/checkinstall/checkinstallrc)。
运行checkinstall之后,checkinstall会检查有没有./doc-pak,如果没有,就会问你是否创建

询问是否创建文档

外链自https://www.ibm.com/developerworks/cn/linux/l-cn-checkinstall/

之后是输入软件包的描述与信息

输入软件包的描述与信息

外链自https://www.ibm.com/developerworks/cn/linux/l-cn-checkinstall/

完成之后回车,checkinstall就会自己搞定的了。

参考链接底部有更多的资源,想深入的话可以点过去看看