Linux系统基础

Linux系统基础知识

1 基本的编译命令

多数UNIX平台都通过CC调用它们的C编译程序.除标准和CC以外,LINUX和FREEBSD还支持gcc.
基本的编译命令有以下几种:

-c     编译产生对象文件(*.obj)而不链接成可执行文件,当编译几个独立的模块,而待以后由链接程序把它们链接在一起时,就可以使用这个选项,如: 
             $cc -c hello.c ===> hello.o
             $cc hello.o

-o     允许用户指定输出文件名,如
            $cc hello.c -o hello.o
            or
            $cc hello.c -o hello

 -g    指明编译程序在编译的输出中应产生调试信息.这个调试信息使源代码和变量名引用在调试程序中或者当程序异常退出后在分析core文件时可被使用.

-D   允许从编译程序命令行定义宏符号
        一共有两种情况:一种是用-DMACRO,相当于在程序中使用#define MACRO
        ,另一种是用-DMACRO=A,相当于程序中的#define MACRO A.
        如对下面这代码:
          #ifdefine DEBUG
          	printf("debug message\n");
          #endif
       编译时可加上-DDEBUG参数,执行程序则打印出编译信息

-I   可指定查找include文件的其他位置.例如,如果有些include文件位于比较特殊的地方,比如/usr/local/include,就可以增加此选项如下:
        $cc -c -I/usr/local/include -I/opt/include hello.c 此时目录搜索会按给出的次序进行.

-E   这个选项是相对标准的,它允许修改命令行以使编译程序把预先处理的C文件发到标准输出,而不实际编译代码.在查看C预处理伪指令和C宏时,这是很有用的.可能的编译输出可重新定向到一个文件,然后用编辑程序来分析:
      $cc -c -E hello.c >cpp.out       此命令使include文件和程序被预先处理并重定向到文件cpp.out.以后可以用编辑程序或者分页命令分析这个文件,并确定最终的C语言代码看起来如何.

-o   优化选项,     这个选项不是标准的
          -O和 -O1指定1级优化
         -O2 指定2级优化
        -O3 指定3级优化
        -O0指定不优化
      $cc -c O3 -O0 hello.c  当出现多个优化时,以最后一个为准!!

-Wall  以最高级别使用GNU编译程序,专门用于显示警告用!!
      $gcc -Wall hello.c

-L指定连接库的搜索目录,-l(小写L)指定连接库的名字
      $gcc main.o -L/usr/lib -lqt -o hello

上面的命令把目标文件main.o与库qt相连接,连接时会到/usr/lib查找这个库文件.也就是说-L与-l一般要成对出现.
2 关于镜像和分区
2.1 创建的各个分区,镜像与分区的关系是什么?

分区是单独存放某镜像的一段地址空间。可便于直接访问寻址(有明确的的起始地址),否则放在文件系统中的话,需要先加载到DDR中,再去访问其起始地址。

3 根文件系统

根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行

我们要明白文件系统和内核是完全独立的两个部分。在嵌入式中只移植内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。

根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。

根文件系统包含系统启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件。例如:

init进程的应用程序必须运行在根文件系统上;
根文件系统提供了根目录“/”;
linux挂载分区时所依赖的信息存放于根文件系统/etc/fstab这个文件中;
shell命令程序必须运行在根文件系统上,譬如ls、cd等命令;
总之:一套linux体系,只有内核本身是不能工作的,必须要rootfs(上的etc目录下的配置文件、/bin /sbin等目录下的shell命令,还有/lib目录下的库文件等···)相配合才能工作。

3.1 根文件系统各个常用目录简介

正常来说,根文件系统至少包括以下目录:

/etc/:存储重要的配置文件。
/bin/:存储常用且开机时必须用到的执行文件。
/sbin/:存储着开机过程中所需的系统执行文件。
/lib/:存储/bin/及/sbin/的执行文件所需的链接库,以及Linux的内核模块。
/dev/:存储设备文件。

注:五大目录必须存储在根文件系统上,缺一不可。

3.2 linux文件系统的常用目录

Linux文件系统中一般有如下几个目录:

/bin目录
该目录下存放所有用户都可以使用的、基本的命令,这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。
/bin目录下常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,test等,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。

/sbin 目录
该目录下存放系统命令,即只有管理员能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统,修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中。
/sbin目录下常用的命令有:shutdown,reboot,fdisk,fsck等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。

/dev目录
该目录下存放的是设备文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。比如通过"dev/ttySAC0"文件可以操作串口0,通过"/dev/mtdblock1"可以访问MTD设备的第2个分区。

/etc目录
该目录下存放着各种配置文件,对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。

/lib目录
该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。

/home目录
用户目录,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。

/root目录
根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。

/usr目录
/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。

/var目录
与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。

/proc目录
这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。

/mnt目录
用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、硬盘。

/tmp目录
用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。

3.1 挂载根文件系统之rootfs

对于linux内核中第一个文件系统,不能通过mount命令或者系统调用来挂载。

根文件系统的概念这里从内核的角度和用户的角度来看,先从linux内核角度来看,根文件系统是rootfs;从用户的角度来看,根文件系统是用户指定的根文件系统,在linux引导时通过内核参数root=指定。二者的关系是:在linux内核启动流程的后续会把用户指定的根文件系统挂载到rootfs文件系统的根目录下。
在linux内核启动过程中,最先挂载的根文件系统是rootfs文件系统,该文件系统是一个内存文件系统,即是基于内存的,而且对用户隐藏。

3.2 linux内核如何挂载根文件系统?

kernel_init线程函数中会调用kernel_init_freeable()函数,在kernel_init_freeable函数中将调用prepare_namespace()函数挂载指定的根文件系统。

以下三种方式,在实际linux启动过程中,linux内核将选择其中一种作为挂载根文件系统的方式。

【方式一】:如果root_device_name是mtd或者ubi类型的根设备,则调用mount_block_root()函数挂载文件系统。

【方式二】:调用initrd_load()进行早期根文件系统的挂载,如果mount_initrd为true的情况下,将执行根文件系统挂载操作。在linux内核中包含两种挂载早期根文件系统的机制:初始化RAM磁盘(initrd)是一种老式的机制。而initramfs是新的用于挂载早期根文件系统的机制。设计initrd和initramfs机制的目的:用于执行早期的用户空间程序;在挂载真正(最后的)根文件系统之前加载一些必须的设备驱动程序。

【方式三】:调用mount_root()函数进行文件系统挂载。该种方式是linux内核中比较常用的方式,在这种方式下,又包含三种文件系统挂载操作:1、nfs方式。2、Floppy方式。3、block方式。在平时开发中,常使用nfs进行网络挂载根文件系统,以便进行开发和调试。

4 Linux引导过程和运行级别
4.1 Linux的引导过程

系统启动之后,在进入init.d之前,我们先来看看系统都做了什么工作。
系统加电之后,首先进行的硬件自检,然后是bootloader对系统的初始化,加载内核。内核被加载到内存中之后,就开始执行了。一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。从这里开始,内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)。内核挂装了根文件系统,并已初始化所有的设备驱动程序和数据结构等之后,就通过启动一个叫init的用户级程序,完成引导进程。

4.2 运行级别(run level)

Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。不同的运行级定义如下:

0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)

1 - 单用户模式

2 - 多用户,没有 NFS

3 - 完全多用户模式(标准的运行级)

4 – 系统保留的

5 - X11 (x window)

6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

5 Linux中“/”, “./“和”…/“的含义

Linux中的文件(夹)是以树形结构表示的。

#表示根目录
/

#表示当前目录
./

#表示上一层目录
../

#表示上两级目录
../..
6 tmpfs文件系统

在平常工作中,我们经常需要查看Linux服务器磁盘挂载使用情况,可以使用df命令,但是使用此命令除了会查看到系统盘以及数据盘挂载情况,还会看到一个tmpfs也在挂载。

这个tmpfs的名称是临时文件系统,是为了储存一些需要高速读写的文件而开辟的临时空间,tmpfs可以使用系统的内存或swap分区来存储文件。由此可见,tmpfs主要存储暂存的文件。
tmpfs默认的大小是RM的一半,假如你的物理内存是1024M,那么tmpfs默认的大小就是512M。

tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的tmpfs文件系统会完全驻留在内存RAM中,读写几乎可以是瞬间的。同时它也有一个缺点tmpfs数据在重新启动之后不会保留,这点与内存的数据特性是一致的。

但是这个df查看到的挂载内存大小的数值,如果没有使用,是没有去真正占用的,只有真正在tmpfs存储数据了,才会去占用。比如,tmpfs大小是777M,如果用了10M大小,内存里就会使用真正使用10M,剩余的767M是可以继续被服务器其他程序来使用的。

适用场景:

(1)天生就是为临时目录而生的
(2)适合存储socket、session等,对于的临时数据也可以选择进行存储,
(3)对于高I/O并且还需要持久化到磁盘的,需要通过其他手段,tmpfs可以提高linux系统的性能。

6.1 调整大小
[root@localhost ~]# mount -o remount,size=500M tmpfs /dev/shm
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 2.0G     0  2.0G   0% /dev
tmpfs                    500M     0  500M   0% /dev/shm
tmpfs                    2.0G   13M  2.0G   1% /run
tmpfs                    2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/centos-root   36G  5.6G   30G  16% /
/dev/sda1               1014M  162M  853M  16% /boot
tmpfs                    394M  4.0K  394M   1% /run/user/42
tmpfs                    394M   48K  394M   1% /run/user/0

上面这种是临时修改,重启后会恢复为默认值,永久修改可以通过修改配置文件的方式。

[root@localhost ~]# vim /etc/fstab
~          
tmpfs                   /dev/shm                tmpfs   defaults,size=777M  0 0
~          

这样设置后重启会自动挂载为777M大小,永久生效。

8 Linux文件系统格式区别
8.1 swap - 交换内存的固定格式,

当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。

8.2 EFI system partition - EFI 系统分区

EFI 系统分区(也称为 ESP 或者 EFISYS)是一个 FAT32 格式的物理分区 (在硬盘主分区表上,而不是 LVM 或软件 RAID 等等) ,从这里 UEFI 固件启动 UEFI 引导器和应用程序。它与操作系统无关而是作为 EFI 固件要启动的引导器和应用程序的存储空间,是 UEFI 启动所必须。

8.3 xfs - XFS

xfs - XFS 是高度灵活性的高性能文件系统,最大可支持 16 EB(大约一千六百万 TB)的文件系统,大小为 8EB 的文件(大约八百万 TB),同时目录结构包含千百万条目。XFS 支持元数据日志,它可提高崩溃恢复速度。XFS 文件系统还可在挂载和激活的情况下清除磁盘碎片并重新定义大小。默认选择并推荐使用这个文件系统。XFS 最大支持分区大小为 500 TB。

8.4 ext4

ext4 是基于 ext3 文件系统,并有大量改进。这些改进包括支持大文件系统和大文件;更迅速、有效的磁盘空间分配;目录中无限的子目录数;更快速的文件系统检查及更强大的日志功能。Red Hat Enterprise Linux 7 中目前支持的最大 ext4 文件系统为 50 TB。

8.5 ext3

ext3 文件系统是基于 ext2 文件系统,其主要优点是日志功能(journaling)。使用记录日志的文件系统可减少崩溃后恢复文件系统所需时间,因为它不需要在每次发生崩溃时都运行 fsck 程序检查文件系统元数据一致性。

8.6 ext2

-ext2 文件系统支持标准的 Unix 文件类型,包括常规文件、目录、符号链接等等。可分配长文件名,最多有 255 个字符。
vfat - VFAT 文件系统是一个 Linux 文件系统,它兼容 FAT 文件系统中的微软 Windows 长文件名。

9 查看硬件信息指令
#查看CPU型号
cat /proc/cpuinfo | grep 'model name' |uniq
#查看CPU位数
getconf LONG_BIT
#查看cpu个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
#查看CPU核心数
grep 'core id' /proc/cpuinfo | sort -u | wc -l
#查看cpu线程数
grep 'processor' /proc/cpuinfo | sort -u | wc -l


#查看硬盘型号
sudo fdisk -l 

#0表示固态硬盘,1表示机械硬盘
lsblk -d -o name,rota

#查看硬盘大小
sudo fdisk -l | grep Disk

#查看内存总容量
cat /proc/meminfo | grep MemTotal
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux是一种自由和开放源代码的操作系统,使用广泛,尤其在服务器领域。以下是Linux系统基础入门教程: 1. Linux系统安装 首先需要选择合适的Linux发行版,如Ubuntu、Debian、CentOS等。然后下载并安装相应的ISO镜像文件,通过光盘或U盘启动电脑安装Linux系统。 2. 常用命令 Linux系统的命令行非常强大,学习常用命令可以提高工作效率。例如: - cd:切换目录 - ls:列出目录内容 - mkdir:创建目录 - rm:删除文件或目录 - cp:复制文件或目录 - mv:移动或重命名文件或目录 - cat:查看文件内容 - grep:查找文件中的文本 - chmod:修改文件权限 - chown:修改文件所有者 3. 文件系统 Linux系统采用了树形结构的文件系统,根目录为/。其他目录按照功能分配,例如/bin存放系统可执行文件,/etc存放配置文件,/home存放用户目录,/var存放变化的文件等。 4. 用户管理 Linux系统支持多用户同时登录,需要进行用户管理。例如: - useradd:添加用户 - passwd:修改用户密码 - userdel:删除用户 - usermod:修改用户属性 5. 软件包管理 Linux系统的软件包管理非常方便,可以通过包管理器安装、更新、删除软件包。例如: - apt-get:Debian系列系统的包管理器 - yum:Red Hat系列系统的包管理器 - pacman:Arch Linux的包管理器 以上是Linux系统基础入门教程的一些内容,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值