Linux inode和常用操作

Linux系统里的inode中文名索引文件,用于保存文件的大小、时间、权限等元信息。每个文件都对应一个inode,每个inode也对应一个文件。因为在Linux里目录、设备等也是文件,所以也对应一个inode。

inode与文件块是分开保存的,它们都会占用磁盘空间,通常情况下是后者先占满,但当磁盘上有大量小文件时,可能前者会先达到上限,从而导致磁盘虽然还有空间但无法写入新文件。这种场景应提前考虑增加inode的上限数量,例如将2KB降为1KB。

file
图片来源:Wikipedia

让我们做一些实验来验证一下inode的行为:

查看磁盘已用和可用inode数量

执行df -i可查看分区里inode数量,一个分区下最大inode数量是格式化时确定的,默认最大数量是分区大小除以2KB得到
file

查看文件inode信息

执行ls -i可查看当前目录每个文件的inode值:
file

验证软链接有自己的inode

软链接是一个文件,其inode值与链接目标文件是不相同的。
file

验证硬链接共享同一个inode

硬链接不是一个文件,其inode号与链接目标文件相同。其实很正常,linux内部对文件的管理都是通过inode完成的,文件名只是一个易读的符号。
file

验证.和..是硬链接

分别对应当前目录的inode和上一级目录的inode。
file

验证通过inode号反查文件名

find -inum命令:
file

文件名存储在哪里?

inode里并不保存文件名(否则硬链接无法实现),那么文件名存储在哪里?答案是存储在“目录文件”里,当我们ls时,Linux就查询目录文件(但我们不能直接cat目录),此文件包含此目录下所有文件名到inode的映射关系。
file

注:以上均默认ext2文件系统。

使用Netdata实时监控服务器资源

Netdata是一款轻量的服务器资源监控软件,与Promethues这样的套件相比,其在Linux下的安装部署十分简便,即装即用,本身占用的资源不算高(但默认只能记录1天左右的数据,要记录更长时间数据需要配置数据库)。Netdata还支持监控每个docker容器的资源占用,对使用docker作为底座的系统十分有用,可以更方便的找出有问题的容器。

在CentOS里安装netdata:

yum install netdata

安装后服务即自动启动。需要修改/etc/netdata/netdata.conf里的ip地址(默认值是localhost,阿里云环境需要修改为网卡的内网地址):

bind to xx.xx.xx.xx

重启netdata服务:

service netdata restart

必要时在防火墙上开启19999端口。

通过浏览器访问netdata地址http://xx.xx.xx.xx:19999(阿里云环境使用公网ip访问)

file

阿里云Centos 6.5迁移到7.6记录

主要原因是tensorflow在centos 6.5环境下配置遇到很多问题,主要是gcc和相关环境的版本问题,因此新购一台阿里云ec2使用centos 7.6版本。原服务器上的webapp(v7和wordpress)需要迁移,大量文件(>300w个)需要迁移。

参考之前一篇centos 6.5的服务器配置记录:Amazon EC2配置步骤和一些问题

一、购买ec2并添加数据盘

过程略。

二、阿里云格式化数据盘

https://help.aliyun.com/document_detail/25426.html?spm=a2c4g.11186623.2.27.558a1692XkXC7y#concept-jl1-qzd-wdb

三、安装必要的工具

yum install git
yum install nano
yum install lsof
yum install unzip

四、迁移mysql数据

安装mysql 5.7

https://dev.mysql.com/doc/refman/5.6/en/linux-installation-yum-repo.html

恢复数据库

mysql -uroot mydatabase < myexportedfile.sql

创建用户并授权

grant all privileges ON mydatabase.* TO 'username'@'localhost' identified by 'mypassword' with grant option;
flush privileges;

五、迁移其他服务

安装服务器软件

yum install java-1.8.0-openjdk
yum install httpd
yum install php php-mysql
yum install tomcat

配置jk和ssl

2.4版apache参考这个链接:How do I install mod_jk on Apache 2.4 webserver

修改/etc/crontab定时任务

crontab -e

配置服务自启动

chkconfig mysqld on
chkconfig httpd on
chkconfig tomcat on

六、大量文件迁移

因为原来的数据盘容量100GB,已经转移了50GB到OSS对象存储,因此新购的数据盘容量为60GB。阿里云不支持“数据盘缩容”,且原数据盘由于是包年包月方式无法从原ec2卸载,因此需要先为原数据盘创建一个100GB的镜像,然后购买一个按量付费的数据盘并选择从镜像创建,将这个新数据盘挂在到新ec2下,再用Linux自带的cp命令(加-a参数以便保留文件属性)将大量文件复制到60GB的数据盘。完成后删除按量付费数据盘和100GB镜像。

实测cp命令一开始速度较低(约300KB/s,通过多次执行du命令手工计算),可能是阿里云新购数据盘需要预热过程的原因,1小时后逐渐上升到接近1MB/s,4小时后达到8MB/s。

这次没有来得及尝试lsyncd+rsync的方案,从网上资料看,对处理海量小文件效率比较高。

安装miniconda(根据系统自带python版本选择miniconda2或miniconda3)

yum install bzip2
wget https://repo.anaconda.com/miniconda/Miniconda2-latest-Linux-x86_64.sh
bash Miniconda2-latest-Linux-x86_64.sh
source ~/.bashrc
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

七、安装tensorflow

conda create --name tensorflow python=3.5.2
source activate tensorflow
pip install tensorflow

从二进制包安装的tensorflow不支持CPU扩展指令集,例如阿里云ec2支持AVX2, FMA,因此如果要用CPU最好编译源代码安装(用GPU的可以忽略),方法见官方安装文档

这里需要注意一下,按官方安装文档安装的bazel是最新版(0.22),可能不支持某些历史版本的tensorflow(1.12),需要下载历史版本bazel)。实际上在安装文档下方有tensorflow和bazel版本对照表,可以查到tensorflow 1.12对应bazel 0.15.9,bazel安装包下载地址在https://github.com/bazelbuild/bazel/releases 。

八、迁移后发现的问题

1、tomcat日志文件catalina.out里没有内容

tomcat6时catalina.out里有webapp用log4j输出的信息,到tomcat7里没有了,catalina.out只有28个字节。原因猜测可能是tomcat6和tomcat7的缺省行为不一样。查看了此webapp下的log4j.properties(在WEB-INF/classes目录下),配置的是只输出到console,在tomcat7的server.xml的context里添加swallowOutput="true"后,localhost_2019-02-20.log里可以看到webapp输出的信息了,但格式不好内容不够紧凑。

但查资料发现swallowOutput这个属性的问题比较多,所以改为在webapp的log4j.properties里指定输出到文件,但文件路径纠结了一会儿:用相对路径发现无法生成日志文件,可能是权限原因(没有深究),所以仿照tomcat7自带的logging.properties文件,使用${catalina.base}/logs前缀:

log4j.rootLogger=INFO, console

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=${catalina.base}/logs/v7.log
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %m%n

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.Encoding=GBK
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %m%n

2、mysql里部分查询变慢

待解决

IBM x3950 M2服务器安装OpenSuse问题和解决记录

file

服务器配置:Xeon 2.93Ghz x4, 64G, OpenSuse Enterprise 11.0 64bit

1、服务器安装基本过程

开箱,把所有选件(内存、内存、光纤适配器、RAID卡ServeRAID 10k)插进相应的位置,搬上机架并扣好(因为机器很重,该步骤需要至少两个人)。最后把几个硬盘都插进去完事。

2、配置RAID

服务器自带的ServerGuide光盘可以启动系统并配置RAID,但好像只适用于安装windows操作系统。我选择的方式是在服务器开机后,看到<ctrl+h>提示后按Ctrl+H进入RAID卡的BIOS进行配置。配置过程比较简单,选择创建一个Virtual Drive即可,我选择的是把四块硬盘做成RAID5。

3、安装Linux

首先从opensuse网站下载映像,因为内存比较大,所以我选择的是64位企业版,然后刻录成DVD。用这张光盘启动服务器(在服务器启动时按F12可以选择启动顺序,缺省好像也会先以光盘启动),OpenSuse的安装是图形化的很容易,也不需要做太多改动。我只修改了缺省的分区,因为自动生成的分区给/只分配了20G空间,我改为了200G,/home分配了250G左右。修改分区大小时,要先删除一个分区,这个分区原来的空间才能分配给其他分区,这一点稍显麻烦。

安装过程比较长,大约花了40分钟,中途断开了显示器去配置其他服务器,再连回去以后发现机器停在了Suse启动的画面很久。无奈取出光盘强行关机重启,这次顺利进入系统,系统又进行了一些配置工作,安装就算完成了。

再次重启以后发现一个问题,可能是显示器没有被正确识别,桌面的分辨率超出了支持范围,导致无法看到桌面。解决的方法是按Ctrl+Alt+1进入命令行界面,修改/etc/X11/xorg.conf文件里的[Monitor]一节下的PreferredSize值,原来是1280x1024,改为1024x768以后,重启顺利进入gnome桌面。

4、安装所需软件

OpenSuse所带的YAsT能通过网络安装常用软件,不过这台服务器所处环境无法访问外网,所以要使用本地更新。具体方法参考这个链接

IBM x346服务器两个问题和解决

服务器型号IBM x346,使用随机提供的Server安装光盘配置并安装Windows 2003 Server英文标准版。

问题1:安装了5G物理内存,在Win2003 server里只能认出3.36G。

解决方法:在c:\boot.ini里加/PAE参数可以认到4G内存,但Win2003 server standard版最多支持4G内存,要想完全解决需要advanced server。

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Standard" /fastdetect /NoExecute=OptOut /PAE

问题2:在RAID界面可以看到硬盘为146G,但在Win2003 server里只看到一个48.8G的c盘。

解决方法:在Control Panel->Administrative Tools->Computer Management里选Disk Management,应该可以看到剩余未被划分的空间,创建为新的逻辑分区并格式化即可。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2006/11/28/575550.html

用Debian遇到的部分问题和解决

1、待机命令

echo mem>/sys/power/state

这之前要确认acpid服务已经启动;

2、打开Firefox的profilemanager

firefox -profilemanager

3、支持speedstep,在/etc/modules里加入speedstep-ich、cpufreq_powersave和cpufreq_userspace这三项,其中第一项是针对PIIIM的笔记本,如果是迅驰用speedstep-centrino;

4、查看pcmcia读卡器的设备名

cat /proc/partions

5、释放空间:

apt-get clean

6、Linux下听ape用SuperMMX的mac-port:http://sourceforge.net/projects/mac-port/

7、从stable转换到testing后,在一个窗口输入过汉字后,alt-tab会失效无法切换到其他窗口,考虑是fcitx的问题,所以决定 换输入法系统。apt-get install scim,scim-tables-zh,scim-gtk2-immodule,然后编辑/etc/X11/Xsession.d/90chinput -start内容如下:

export XMODIFIERS=@im=SCIM
export XIM=xim
export XIM_PROGRAM="scim -d"
export GTK_IM_MODULE=xim
export QT_IM_MODULE=xim
scim -d

scim-tables-zh里并不包括拼音输入法,所以apt-get install scim-pinyin(这个包以前叫scim-chinese),而且我是添加了一个unstable源才找到的。

Update2006-4-21:解决有些程序里不能输入中文的问题,要安装scim-gtk2-immodule这个包,然后把上面的90chinput-start文件改为如下:

export XMODIFIERS="@im=SCIM"
export GTK_IM_MODULE="SCIM"
scim -d

8、手动关闭显示器

xset dpms force off

9、更改gnome的splash:#update-alternatives --config desktop-splash,(来自Debian学习笔记

10、用totem播放其他格式:从这个地址下载win32codecs-essential-20040703.tar.bz2和rp9codecs-20050115.tar.bz2,解开的内容放到/usr/lib/win32(如果不存在建一个)即可。

11、DNS解析很慢可能是ipv6造成的,去掉ipv6的方法:在/etc/modprobe.d/aliases中,把“alias net-pf-10 ipv6”注释掉,然后update-modules,再重启。(这个方法更方便:在firefox地址栏里输入about:config,用 filter找到network.dns.disableIPv6,修改为true。来自Ubuntu快速入门手册

12、如遇到空间不足,可以考虑先清掉apt的cache:apt-get clean;还可以用debfoster工具删除不需要的deb包。

13、文件名转码工具convmv,用于转换windows分区拷文件过来可能出现文件名乱码,例如

convmv -f utf8 -t cp936 --notest *

14、把从cd抓下来的ape文件分为多个:安装cuetools和shntool,然后cuebreakpoints -i cue CDImage.cue|shnsplit -n track CDImage.ape,这样得到的是多个.wav文件,可以给shnsplit加-o ape参数转为ape,但要使用特别的mac版本,在shntool主页有下载。

15、修改grub的背景:修改/boot/grub/menu.lst,加入splashimage (hd0,2)/boot/grub/images/xxx.xpm.gz,图片文件要自己制作或者下载现成的。

16、修改console分辨率,在menu.lst的kernel行最后加入vga=791,表示1024x768的分辨率。好像还可以vga=ask?

17、彩蛋:在gnome里按alt+f2打开运行程序对话框,输入free the fish,会出现一条小鱼(旺达)在屏幕上游动。

18、对时用ntpdate,教育网内时间服务成员列表

19、用wget批量下载,方法1:seq 20 | awk '{print "http://mydomain/file"$1".zip"}' | wget -i -;方法2:for i in seq 1 20;do wget http://domain/$i.txt;done;更简单的:curl http://mydomain/file[1-20].zip -O

20、代理服务器的环境变量:

export http_proxy="myproxy:port"
export ALL_PROXY="myproxy:port"

21、使用usb光驱

mount -t iso9660 -o iocharset=cp936 /dev/scd0 /mnt/usb

22、网卡命名:nameif(链接

23、同步internet时间

ntpdate time.nist.gov

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/11/09/272253.html

Debian里编译内核

以Debian 2.6.8版本为例:

1、Debian.org上关于编译内核的说明;另一篇看起来不错的文章:Creating custom kernels with Debian's kernel-package system

2、下载内核源代码apt-get install kernel-source-2.6.8,在/usr/src下得到kernel-source-2.6.8.tar.bz2文件,用tar xfj命令展开;

3、下载需要的patch,比如休眠功能的patch是kernel-patch-suspend2,注意目前在experimental里才有,所以要在/etc/apt/sources.list里加上必要的源;

4、执行以下操作,如果当前语言是中文,执行前最好执行zhcon进入中文环境:

# cd /usr/src/kernel-source-2.6.8
# cp /boot/config* .
# make-kpkg clean
# make-kpkg --append_to_version -2 --added_patches suspend2 --config menuconfig
# make-kpkg --append_to_version -2 --initrd kernel_image
# cd ..
# dpkg -i kernel-image-2.6.8-2.i386.deb

注意在menuconfig的时候先载入原来的配置文件,即上面第二行复制过来的/usr/source/config-xxx文件,然后在这个配置上进行修改;另外,我如果不加--initrd参数,则新内核无法启动。

5、重启电脑用新内核启动。

Update(2005/12/23):不加--initrd参数可以启动了,关键是在menuconfig的时候要把ext2,ext3等文件类型加入内核,同时要把对ide设备的支持直接加入内核,我以前只注意了前者。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/10/13/254213.html

Debian安装备忘

对linux的兴趣时断时续,以前用的都是redhat,这次换用Debian吧,希望能坚持一直用下去,直到完全替代windows。这是安装Debian的过程,遇到的问题和解决方法,备忘。

1、用分区工具如PQMagic划出一块空闲分区,我给的大小是4G;

2、下载debian当前版本的第一张光盘映像,刻成光盘;

3、用这张光盘启动,在boot时输入linux26用2.6内核启动,选择语言为中文,其余按提示操作,注意分区时选择最大空闲空间,自动分区即 可。安装时曾遇到过无法dhcp连接的问题,后来把网线插在无线路由器上就解决了,原来一直是插在歌华有线送的cable-modem上,很奇怪在 win2000下这样是可以得到IP地址的;

4、无线网卡的配置。我用的是Netgear WG511网卡,方法是在 http://prism54.org/%7Emcgrof/firmware/ 下 载最新的firmware版本,更名为isl3890isl3877各一份放在/usr/lib/hotplug/firmware下面(用grep FIRMWARE_DIR /etc/hotplug/firmware.agent命令找到),对于2.6版本的内核需要mount sysfs,方法如下:

mkdir /sys
Add "none /sys sysfs defaults 0 0" to /etc/fstab
mount /sys

再在/etc/network/interfaces里添加这样两句(假设无线网卡的代号是eth1),

auto eth1
iface eth1 inet dhcp

这样用ifup就可以启动无线网卡并通过dhcp获取ip地址了:

ifup eth1

这个是关于prism(WG511所使用的芯片)驱动的wiki网站http://prism54.org/phpwiki

4、apt-get install gdm gnome-core x-window-system-core ttf-arphic-uming,其中ttf-arphic-uming字体是为了让gnome显示中文(虽然不是非常好看);安装小企鹅输入法, apt-get install fcitx,完成后要做一些设置:把下面的内容保存为/etc/X11/Xsessin.d/25chinput-start,然后重新启动X或重新启动 系统:

export XMODIFIERS="@im=fcitx"
export XIM=fcitx
export XIM_PROGRAM=fcitx
fcitx&

如果需要配置fcitx的参数,可以修改/root/.fticx/config文件;

5、因为屏幕1400x1050算非标准分辨率,所以在/etc/X11/XF86Config-4里添加这个值,然后在gnome里就可以把桌面设置为这个分辨率了;

6、(从现在开始是在Debian里写了;)要在面板上显示电池电量,先要安装acpid,然后在面板上添加电池电量监视器即可;

7、这时的声音不正常,用mpg123播放mp3发出刺耳的噪音,apt-get install alsa后,执行alsaconf检测声卡,然后重新启动就好了;

8、安装应用软件:msn用gaim,画图用gimp,收信用evolution,浏览器mozilla firefox,听歌xmms,媒体播放器totem,等等;

9、用优盘mount /mnt/sda1,同时用第二个优盘mount /mnt/sdb1,用pcmcia的读卡器mount /mnt/sde1。写到/etc/fstab里可以简化命令,iocharset=cp936选项可以显示中文文件名。

10、网卡如果要使用静态ip地址(在实验室就是这种情况),/etc/network/interfaces里这样写:

iface eth1 inet static
        address 162.105.131.205
        netmask 255.255.255.128
        broadcast 162.105.131.255
        gateway 162.105.131.129
        dns-nameservers 162.105.129.27

要转换为dhcp时运行$dhclient eth1即可。

11、让cpu支持降频,装cpufreqd,在/etc/modules里添加speedstep-ich;可用的模块列表在这里 /lib/modules/[你的内核版本]/kernel/arch/i386/kernel/cpu/cpufreq;重启服务sudo /etc/init.d/cpufreqd restart。

12、若usb设备不能停止,用这个命令杀掉使用它的所有进程:sync && fuser -m /dev/sda1 -k

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2005/09/26/244596.html

在Win2000里快速切换TCP/IP设置

自己的笔记本要在多个地方上网,但家里是自动获取IP的,实验室有自己的子网,宿舍又有另一个子网,每次换地方都得手动换TCP/IP设置,很麻烦。今天在网上看到一篇文章,原来要解决这个问题是非常简单的,不需要安装任何软件,下面是我的做法。

首先,在网络属性里把TCP/IP配置为实验室用。然后,运行cmd打开命令行窗口,输入如下命令:

netsh -c interface dump > lab.txt

这样就在C:\Documents and Settings\Administrator下得到一个lab.txt文件,当然你也可以在上面的命令里使用绝对路径改变它的存放位置。

接下来,把TCP/IP分别设为其他各处的正确配置,并使用同样命令生成不同的文件,对我来说就是home.txtdorm.txt了。

需要改变TCP/IP设置的时候,例如我要切换到家里上网了,只要执行下面的命令:

netsh -f home.txt

切换就完成了,很方便吧。总结一下就是两条:netsh dump导出设置,netsh -f导入设置。

还要提醒一点,如果是切换到自动获得IP的方式,最好用ipconfig /renew命令强制获得一下,否则要等一段时间才能上网。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2004/11/04/60551.html

[测试]使用Mantis跟踪bug

file

在PPP项目中我们组使用PVCS Tracker来跟踪bug,感觉项目组的确是需要这样一套系统的,PVCS虽然功能比较强,但首先不是免费的,另外也比较大,对于示范中心这样的小项目来说有些不够灵活。因此我安装了Mantis,一个十分小巧的bug跟踪工具。

Mantis是php写的开源软件(Bugzilla也是开源的,written in perl,但在windows下安装麻烦,所以暂时不考虑)。安装Mantis的步骤很简单,以下总结在Win2000/XP下的安装过程:

1、如果机器上有IIS,确保已经启动;如果希望使用Apache,从 httpd.apache.org 下载apache的windows安装程序,我用的是1.3版本,直接运行这个程序就安装完成了。

2、从 www.php.net 下载php的windows安装程序,我用的是4.3.8版本,也是直接运行下载来的程序。我用IIS时安装程序会自动对IIS进行设置,但在另一台没有IIS而使用Apache的时候,即使在安装过程中选择了正确的服务器类型,也会提示自动设置出错。不过手动设置也很简单,只要在apache安装目录下的conf目录里的httpd.conf里增加这样一段:

ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"

这样就可以了。不过按照PHP的安装说明,这种方式是很危险的,我对PHP不熟,说不出到底危险在哪,可能是容易给Web服务器带来一些安全漏洞吧。

3、从 www.mantisbt.org 下载mantis的0.8.3版本(原来写成1.8.3是笔误,谢谢wfifi指出。mantis目前已有1.0.0rc版本),它很小只有几百K。如果是IIS,把mantis解压缩到Inetpub下(我一开始解到c:下总是不行,可能是权限问题),然后增加一个虚拟路径指向mantis目录;如果是Apache,把mantis解压缩到apache的安装目录下,并在httpd.conf里把主目录改为指向这个目录,或者增加一个Alias,但权限要设够才能正常运行。为了方便,可以在Web服务器里增加index.php为缺省文件名。

4、从 www.mysql.net 下载mysql,我用的是4.0版本。在mysql里为mantis建立一个帐户,然后建立一个名为bugtracker的数据库,这是mantis配置文件里的缺省名字,在mantis安装路径下的sql目录里有一个db_generate.sql文件,这里面是建表的语句,执行它。

5、把mantis安装路径下的config_inc.php.sample改名为config_inc.php,打开并修改里面的内容。主要是和数据库连接的信息,例如数据库名、用户名等等。我在最后加了这样两句:

$g_default_language = 'chinese_simplified';
$g_enable_email_notification = OFF;

这样缺省界面就是简体中文的,并且不发送邮件通知。要发送邮件还要对PHP进行另外的配置,我还没有试过,好象挺麻烦的,所以干脆禁掉。另外mantis提供的简体中文语言包里好象很多“删除”都写成了“.h除”,我对lang目录中的strings_chinese_simplified.txt文件做了一个替换(.h除->删除)就好了。

6、最后,重启一下Web服务器,就可以访问了,地址是 http://localhost/mantis 这样的。按照mantis的建议,应该新建至少一个administrator级别的用户,然后把admin目录删除,并删除administrator这个帐号。

我们的项目不复杂,而且成员少,所以mantis的安装能用就行,对安全和报表、邮件的配置都没有关心,以后需要用到的时候再研究吧。

Update(2012/11/12): 今天再次看了一下Mantis网站,这个bug跟踪系统又有很多改进,而且增加了手机客户端,下次有机会还要继续使用。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2004/08/18/34380.html