6
29
2014
0

umount遇到问题

问题描述:在umount时遇到下面问题

umount /mnt/sdd1:device is busy.

     (In some cases useful info about processes that use the device is found by losf(8) or fuser(1))

 

解决方法:

一开始我使用ps查看正在运行进程,kill -9 也没有强制杀死,后来用了下述方法,成功搞定:

step1:fuser -m -v /mnt/sdd1 查看到底哪些进程使用了/mnt/add1

-m 指定路径表示的是一个磁盘挂载的目录或者磁盘分区

-v 指定fuser结果显示的格式

 

step 2:fuser -m -v -i -k /mnt/sdd1 杀死使用了/mnt/add1设备的进程

-k kill  杀死与/mnt/sdd1相关的进程

-i interactive .交互式的,该参数在Kill process时交互式询问用户是否要kill进程

问题与解决的截图如下:

 

补充一句:umount时若device is busy.你可以试试umount -l /dev/sdd1

其中-l是lazy的含义。man mount

 -l     Lazy  unmount.  Detach  the  filesystem  from the filesystem hierarchy now, and
              cleanup all references to the filesystem as soon as it  is  not  busy  anymore.
              (Requires kernel 2.4.11 or later.)
Category: Linux | Tags:
6
28
2014
4

Linux进程Ctrl+c与Ctrl+x

Ctrl+c和Ctrl+z都是中断指令,区别如下

Ctrl+c是强制中断程序执行

Ctrl+z将任务中断,但是任务没有结束,它仍在进程中只是维持挂起的状态。

总之,我们使用应该差不多都是Ctrl+c,强制中断执行。总之养成使用ctrl+c的习惯,因为有一些程序如果用ctrl+z挂起任务,若想再次运行会出现错误。如systemtap中,若ctrl+z终端任务,那么程序会挂起,插入的模块由于挂起而不能被移除,再次运行时就会报错:**.ko is already exsit.若想再次运行就需要通过rmmod **.ko 手动移除掉.ko文件。

Category: Linux | Tags:
6
26
2014
1

挂载磁盘

挂载磁盘无非分两步

step1:格式化分区。将分区(或整张磁盘)格式化为你需要的文件系统

step2:将该分区挂载在特定目录

 

若你想挂载某一个分区,则应该先通过fdisk指令建立分区,然后对分区进行格式化。

mkfs.ext2 /dev/sdb1

mkdir /mnt/sdb1_mount

mount -t ext2 /mnt/sdb1_mount (mount指令最好加上-t 指定文件系统类型,否则有可能出现奇怪的错误)

 

附录:

实验室小鱼师兄做了一个文件系统,以模块的形式可以插入到内核,那么挂载这个文件系统的步骤如下:

进入mkfs目录后,运行如下指令:

gcc mkfs/mkfs.pcmfs.c -o mkfs/mkfs.pcmfs
./mkfs/mkfs.pcmfs /dev/sdb1
cd pcmfs/
make clean
make
rmmod pcmfs
insmod pcmfs.ko
mount /dev/sdb1 /mnt
 
我在自己的虚拟机下运行没问题,但是今天在大机房的机器上,又遇到了奇葩问题,问题如下:
root@f303server:/mnt/sde1_ext2/code/pcmfs/mkfs# mount /dev/sdd1 /mnt/sdd
NTFS signature is missing.
Failed to mount '/dev/sdd1': Invalid argument
The device '/dev/sdd1' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
问题截图如下:
 
后来"灵机一动" 把mount指令加上了-t pcmfs,就好了,即mount -t  /dev/sdb1 /mnt。奇葩
所以说,以后mount时习惯性的加上-t指明类型,这样比较好!
 
 

 

6
10
2014
2

awk 语句

1  awk '{if($5==18448)print $1" "$2" "$3" "$4" "$5}' fprintf_100.txt 

在fprintf_100.txt文件中,输出第五列的值为18448所在的行的第1,2,3,4,5列。输出的列与列之间用空格分开

 

2.  awk '{if($5==18448)print }' fprintf_100.txt 输出当前行的所有内容

 

3.  若第六列为字符A,则打印

awk '{if($6=="A")print }' sda.txt  记住比较字符要用双引号

 

4. awk做脚本,接受三个输入,输入1:比较数字   输入2:输入文件名  输入3: 输出文件名

#!/bin/sh
awk '{if($5=='$1')print}' $2 > $3 
其中括号中$5表示第五列,‘$1’表示第一个输入参数,$2表示第二个输入参数,$3表示第三个输入。注意这儿列$  以及第几个参数$ 不能混淆了
运行 ./run 510 input.txt output.txt
功能:检查input.txt的每一行,若该行第五列的数字为510,则输出至output.txt文件中
Category: Linux | Tags: awk
5
5
2014
2

virtual box 中 Ubuntu安装增强包

virtual box 中安装增强包后可以实现windows中的文件夹内容在linux中直接访问,而不需要通过u盘转文件到linux中,很方便。方法:

step1:设备->安装增强功能。在弹出的文件夹框中点击运行 VBoxLinuxAddtions.run

       若没有弹出框,则cd /media/VBOXADDTIONS_*。然后在该文件夹下输入./VBoxLinuxAdditions.run。安装好后再reboot。我当时输入的指令如下:

 

step2:设备->共享文件夹。在出现的界面中添加一个固定分配的文件夹。例如,我在windows的D盘底下建立了一个目录V-box。作为windows目录中linux访问点。

step3:在linux的终端中建立文件。然后mount。指令

       mkdir share 

       mount -t vboxsf V-box share   其中V-box, 是step2中文件名字,share是你该文件夹在linux中的名字。

我的指令如下

 

此时linux中的share文件就是共享的windows的D盘中V-box的数据内容了

 


ps:后来我开机在mount -t vboxsf V-box share时,出现如下提醒

sbin/mount.vboxsf:mounting failed with the error:no such device

然后我做法是

重新进入cd /media/VBOXADDTIONS_*。然后在该文件夹下输入./VBoxLinuxAdditions.run。

再mount -t vboxsf V-box share

 

Category: Linux | Tags:
2
28
2014
1

linux 常用指令总结

1.看ubuntu版本   cat /etc/issue

  查看cpu信息 cat /proc/cpuinfo

2.查看内核版本  uname -r

3.机器的位数 uname -a (a表示all,即所有信息,其中64为系统一般是X86-64,32位系统是i386,i686)

4.apt-get -f install (当软件安装不符合依赖关系时,通过-f 来修复依赖关系)

5.查找文件指令: find

  例子 find / -name *.py   全盘搜索以.py结尾的文件。因为/为根目录,且没规定深度。

       find -maxdepth 1 -name *.py 在本级目录下搜索*.py的文件

       find /usr -maxdepth 1 -name *.py 在/usr目录下搜索*.py的文件

       应用:想查看某个配置文件,但忘记目录位置,则可以在/底下:

       find / -name resolveconf

6.查看文件行数 wc -l /home/test.cvs 

7.远程拷贝,即从自己的系统拷贝东西到别的系统中 例子: scp /home/space/music/1.mp3 root@www.cumt.edu.cn:/home/root/others/music  

scp /home/space/music/1.mp3 root@192.144.2.21:/home/root/others/music      root@表示192.144.2.21的root身份 

8.关于看文件的行数、或一个目录下有多少个文件: wc -l /home/text.txt  看文件行数 ls | wc -l 看目录下文件个数。  上一行中|为管道,即前面的输出作为下一行的输入。类似你可以使用: ll | wc -|   你会发现该指令显示的文件个数比ls | wc -l 多三个,多出来的东西为 total ./ 和../

9 看某一个文件的头几行,或末尾几行  head -n /home/text.txt  tail -n /home/text.txt

10 将某个文件的1至100000行拷贝到另一个文件中awk 'NR>1&&NR<100000 {print } ' ./source.csv > ./result.csv

11 把一个disk挂载到某个路径下。

    mkfs.ext3 /dev/sdb

    mkdir ./data

     mount /dev/sdb ./data

这里注意的是:格式化文件系统是对分区的概念而言的。若你想把sdb1格式化为ext3文件系统,你应该先fdisk /dev/sdb 来对sdb进行分区,然后对分好的区sdb1进行格式化。而不是先mkfs.ext2 /dev/sdb ,再对sdb进行分区

12 grep -n 'main' ./ceshi.c 则会返回main所在的行号和这一行的内容:

    例返回 11:void main(void){

13 cut指令  -d 定界符 -f 输出的内容。另外使用管道grep -n 'main' ./ceshi.c | cut -d : -f 1

    则上述输出11。 若-f 2,则输出void main(void){

14sed指令  sed -n '2,10p' ./text.c   输出2到10行,同样可以用>重定位到文件,即sed -n '2,10p' ./text.c > ./cope.c 。这个实现的功能和第10点相同。注意  >  这个符号是用来重新定位输出到文件中,避免输出到屏幕上。 sed '1,10d' ./text.c > ./cope1.c 这个实现的是1至10行delete掉后将剩下的行数输出到cope1.c中。请注意 前一条指令有 -n ,而后一条指令没有参数 -n

14.lsmod 查看当然有哪些模块。rmmod 删除模块。在rmmod之前需要确定该模块没被使用。如

mkfs.pcmfs /dev/sdb1

insmod pcmfs.ko /*若lsmod时没有对应的模块,在此为pcmfs。则用该语句插入模块*/

mount /dev/sdb1 /mnt 

则pcmfs模块在被使用。直接使用rmmod会提示错误。需要

umount /dev/sdb1

rmmod pcmfs

15.hexdump指令。以16进制方式产看内容。关键参数

-s 设定开始查看的起始位置 如:-s 4k ; -s 4096 ;-s 0xb000

-C 方便查看

如:

以上echo ...| hexdump 查看...的二进制表示 

-C 以三列方式看文件的二进制表示,第一列为地址,16进制表示

-s 看实际设备的某个起始地址后的数据

 

16 卸载apt-get install的软件

   apt-get remove **

   apt-get remove --purge **

   apt-get autoremove **

 

17 将缓存内容写回磁盘 sync,在sync后,再使用查看脏数据所占内存大小指令为:grep Dirty /proc/meminfo

会发现输出sync后,再查看内存脏数据,大小为0kb

18.window和linux文件之间传递会存在tab键等不兼容的问题

方法1:

apt-get install dos2unix

dos2unix filename

方法2:

运行脚本时出现以下错误很可能也是unix  dos格式的错误

bash: ./filename: /bin/bash^M: bad interpreter: No such file or directory

解决如下

vi filename

然后通过指令 :set ff? 可以看到dos或者unix的字样,若是dos格式的,那么可以用set ff=unix把文件强制转化成unix格式

 

19.ls -i dir/  可以看该dir目录下文件的inode号,ls中的-i显示inode号

20.ls -s dir/ 可以显示dir目录下文件所占的块数目,默认的块是1k来计数,但是可以通过--block-size来指定block大小,我们查看时,block大小一般指定与格式化时的文件系统大小相同。附:查看格式化时block大小:dumpe2fs | grep 'Block size'

21.dd指令指定拷贝的大小

dd if=/dev/hda of=/dev/hdb count=1 bs=512

count=1指定仅拷贝一个块,bs=512指定块大小为512字节

另外,可以指定源文件为zero

dd  if=/dev/zero of=/dev/hdb count=1 bs=512

dd指令创建一个100M的空文件

dd  if=/dev/zero of=hello.txt bs=100M count=1

dd  if=/dev/zero of=hello.txt bs=100M count=1 iflag=direct #iflag为指定读的方式,即input

dd  if=/dev/zero of=hello.txt bs=100M count=1 oflag=direct #oflag为指定写的方式,即output

 

22.通过dmesg来查看内核中printk的信息,该信息在/var/log中

dmesg -c  查看后清除log中信息

dmesg | tail 查看最近一次的输出

 

23.查看文件的大小

du -h 1.txt 查看1.txt的大小

 

 

Category: Linux | Tags:
1
15
2014
1

安装flashsim

安装flashsim网上有一个ppt做得相当详细,网址如下:

http://wenku.baidu.com/view/decc4bf904a1b0717fd5dd22.html

我照着这个做了,其中有几点ppt上要注意。

1.下载安装gcc2.95的五个包后,按照顺序依次装上,其实不一定gcc2.95就装上了,更改软链接后,(sudo ln -fs /usr/bin/gcc-2.95 /usr/bin/gcc).若使用gcc -v 没有看到版本,则其实你的gcc-2.95没装上。原因应该是你机子装的是64位系统,看网上说要在32位上安装。

2. 在安装完flex-old,和bison后查看版本,bison -V 和flex-old -V 。这里的V一定是大写的。

3.按照步骤打完补丁有如下

根据FAILED提示,syssim_driver.c的140补丁没打好。打开补丁文件,看该处的补丁要增加代码还是减少代码。手动完成。然后用手动改掉的文件替换之前的syssim_driver.c文件。

 

附录。关于怎么看补丁文件。下面以代码例子:

eulement dans src.release/: ~
Seulement dans src: ChangeLog
diff -crB src.release/dftl.c src/dftl.c
*** src.release/dftl.c 2009-06-15 07:05:37.000000000 +0200
--- src/dftl.c 2010-03-24 17:11:12.000000000 +0100
***************
*** 66,82 ****
    int i;
    int lpn = lsn/SECT_NUM_PER_PAGE; // logical page number
    int size_page = size/SECT_NUM_PER_PAGE; // size in page 
  
    sect_t s_lsn; // starting logical sector number
    sect_t s_psn; // starting physical sector number 
  
    ASSERT(lpn < opagemap_num);
    ASSERT(lpn + size_page <= opagemap_num);
  
-   sect_t lsns[SECT_NUM_PER_PAGE];
    memset (lsns, 0xFF, sizeof (lsns));
  
!   int sect_num = (size < SECT_NUM_PER_PAGE) ? size : SECT_NUM_PER_PAGE;
  
    if(mapdir_flag == 2){
      s_psn = mapdir[lpn].ppn * SECT_NUM_PER_PAGE;
--- 66,84 ----
    int i;
    int lpn = lsn/SECT_NUM_PER_PAGE; // logical page number
    int size_page = size/SECT_NUM_PER_PAGE; // size in page 
+   int sect_num;
  
    sect_t s_lsn; // starting logical sector number
    sect_t s_psn; // starting physical sector number 
  
+   sect_t lsns[SECT_NUM_PER_PAGE];
    ASSERT(lpn < opagemap_num);
    ASSERT(lpn + size_page <= opagemap_num);
  
    memset (lsns, 0xFF, sizeof (lsns));
  
!   sect_num = (size < SECT_NUM_PER_PAGE) ? size : SECT_NUM_PER_PAGE;
  
    if(mapdir_flag == 2){
      s_psn = mapdir[lpn].ppn * SECT_NUM_PER_PAGE;
 
黄色表示该段补丁是在dftl.c文件上打得
红色的**里面的行数是未达补丁前代码所在的行数,红色的--表示的是打补丁后对应的行数。
绿色+表示增加一行,绿色-表示减少一行
橙色!表示该变量原本没定义,打完补丁后才重新定义的
 
对了,若补丁没打好,会生成一个对应的.rej文件,这里syssim_driver生成的就是syssim_driver.c.rej,这个文件会有提示没有打好补丁的地方
Category: Linux | Tags:
1
6
2014
0

编译内核总结 及 修改开机启动项内核顺序

1.现在内核的压缩文件。把下载到的内核放到u盘里,把u盘插在linux系统上,把u盘mount上去

 mount -t vfat /dev/sdb4 /mnt/udisk 其中vfat是u盘文件系统格式,sdb4是u盘中带有*号的标号。用fdisk -l可以看到,u盘*号标号对应编号。

2.把u盘里的linux内核压缩文件放到linux的某个文件夹下

3.tar -xvzf linux-2.** -C /usr/src  解压缩到/usr/src这个文件夹下(一定要在linux下指令解压缩,window下解压缩后拖进去会出来问题,可能make menuconfig 不能执行)

4.cd /usr/src/linux-2.**

5.make menuconfig(若在这里提示了错误,缺少ncurses的library,则需要输入apt-get install libncurses5-dev)

6.make 也可以make -j 4哦 更快

7.make modules_install

8.make install

9reboot

 

注意如果你在reboot后没有进入不同系统的选项,而是直接进入了未编译的内核。则要修改以下文件

1.在root权限下vim /etc/default/grub

把里面的GRUB_TIMEOUT设置为GRUB_TIMEOUT=20

然后输入 update-grub

再reboot。

若reboot还没有选项,而是直接进入之前的内核,则

2.修改 vim /etc/grub.d/30_os_prober

把里面三个else   set timeout=0的地方 改为=20

然后在 update-grub

在reboot !

如果reboot后,还是没有进入如下界面,可以再reboot时按住shift键,进入到开机该内核选择界面。


按照如上操作还出现该问题:点击进入刚刚编译的内核后,提示root目录无法挂载(忘记截图了),解决方法:

step1:查看/boot目录下,发现没有刚刚编译的内核的启动项,如下,只有我原有内核版本initrd.img-2.6.32-38-generic的启动项。而没有我所需要的2.6.34.14版本的启动项。所以你需要做一个启动项。

step2:进入/lib/modules下与你编译的内核所对应的文件夹。运行update-initramfs -c -k 2.6.34.14 (该步骤我用mkinitramfs -o /boot/initrd.img-2.6.34.14指令后还是不能成功,建议用update-initramfs -c -k指令)。执行完此步骤后,就可以在/boot目录下,发现刚刚编译的内核的启动项了。如下图

step3: 输入update-grub。然后reboot,就ok了

现在应该大功告成啦!!啦啦啦

补充:

我今天又编译了一次内核,经过上面几次的总结,我觉得我已经肯定确定会了。。结果还是遇到了蛋疼的问题。。

编译内核的背景:

我在机房的服务器上编译的,这个服务器的环境本来就已经搭建好了,而且有不止一个内核。这几个内核装在不同的磁盘上,我运行其中一个版本的内核,并在此内核中编译我需要的内核,一切进展都很顺利,但是在最后开机重启时没有看到我需要的内核,但是在ls /boot 下已经有我需要的内核版本的启动项,即对应的initrd.img-...文件。重启开机的画面如下所示

我需要的内核版本是2.6.34.14.这里面没有。

 

解决:

其实这个内核版本已经有了,不过在previous linux version这个选项的子菜单中。隐藏得好深。哎。。。亏我当时想了各种原因,我还以为每个已经有的内核版本都需要重新编译一次2.6.34.14这个内核呢~~~~。。

 

如何把2.6.34.14内核变成系统启动屏幕上默认的启动的内核呢?

vi /boot/grub/grub.cfg

menuentry 'Ubuntu, with Linux 2.6.34.14' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos2)'
        search --no-floppy --fs-uuid --set=root 347d81cc-7111-45ea-b851-e53cc0fa1173
        linux   /boot/vmlinuz-2.6.34.14 root=UUID=347d81cc-7111-45ea-b851-e53cc0fa1173 ro   
        initrd  /boot/initrd.img-2.6.34.14
}
menuentry 'Ubuntu, with Linux 2.6.34.14 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos2)'
        search --no-floppy --fs-uuid --set=root 347d81cc-7111-45ea-b851-e53cc0fa1173
        echo    'Loading Linux 2.6.34.14 ...'
        linux   /boot/vmlinuz-2.6.34.14 root=UUID=347d81cc-7111-45ea-b851-e53cc0fa1173 ro recovery nomodeset 
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-2.6.34.14
}
menuentry 'Ubuntu, with Linux 2.6.34.14.old' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos2)'
        search --no-floppy --fs-uuid --set=root 347d81cc-7111-45ea-b851-e53cc0fa1173
        linux   /boot/vmlinuz-2.6.34.14.old root=UUID=347d81cc-7111-45ea-b851-e53cc0fa1173 ro   
        initrd  /boot/initrd.img-2.6.34.14
}
menuentry 'Ubuntu, with Linux 2.6.34.14.old (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos2)'
        search --no-floppy --fs-uuid --set=root 347d81cc-7111-45ea-b851-e53cc0fa1173
        echo    'Loading Linux 2.6.34.14.old ...'
        linux   /boot/vmlinuz-2.6.34.14.old root=UUID=347d81cc-7111-45ea-b851-e53cc0fa1173 ro recovery nomodeset 
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-2.6.34.14
}

 

如上所示,该文件中,有许多顺序出现的menuentry启动项。这里的顺利也就是启动时屏幕出现的启动项的顺序。把你想默认开机的启动项复制粘贴到第一位,即可以达到设定默认开机启动项的顺序。

Category: Linux | Tags:
1
6
2014
2

装机配置网络

1.装机完毕后要增加新用户,指令如下

sudo passwd root(root 为你要添加的用户名字),然后设置密码。OK。

附录:如果在已经有root用户的基础上再添加用户,则为:

useradd name

passwd name

userdel name

2.装机完毕后配置ip地址,在/etc/network/interfaces  文件下添加

 auto eth0

iface eht0 inet static

address *.*.*.* ip地址

netmask *.*.*.* 掩码

gateway *.*.*.* 网关

dns-nameservers *.*.*.*  dns解析地址

 

如下图:

然后输入:etc/init.d/networking restart

若上述restart后还是不能ping 通,在etc/resolvconf/resolv.conf.d 目录下添加tail文件 vim tail

在tail里添加如下:

 nameserver *.*.*.* 该处地址与上面红色部分相同

然后输入/etc/init.d/resolvconf  restart

 

Category: Linux | Tags:

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com