Linux installation and startup process

Source: Internet
Author: User
Tags crypt gz file dmesg
Linux installation and startup processes. linux installation process 1.1 Installation Process Overview 1. BIOS power-on self-check 2. run isolinux under the isolinux directory. binfile, which is isolinux. bind Files according to isolinux. cfg File option to load...
Linux installation and startup processes. linux installation process 1.1 Installation Process Overview 1. BIOS power-on self-check 2. run isolinux under the isolinux directory. binfile, which is isolinux. bind Files according to isolinux. cfg File option to load kernel vmlinuz and initrd. imgfile, initrd. the imgfile generates a virtual linux operating system in the memory, providing an installation environment for the installation process. 3. initrd. the/sbin/loader file in the imgfile detects the installation media. if cd is detected, the image file stage2.img (all images required during installation) in the images directory is run, the most important thing in this file is the anaconda program. The Wizard diagram we see during the installation process is the role of this anaconda program. 4. after the installation is complete, restart the system. The file calling sequence is isolinux/vmlinuz ---> isolinux/initrd. img --->/init --->/sbin/loader ---> imagaes/install. img --->/usr/bin/anaconda disk structure * ISO Linux Directory stores the installation interface information when the disc is started * the images directory contains the necessary startup image files, the most important thing is to guide the image file install required for second-stage installation. img (stage2.img in rhel 5), and the anaconda program is in this image file. * The CentOS Directory stores the installation package and information *. the discinfo file is the identification information of the installation price. This file is very important * lemp.tar.gz file storage system initialization and related program installation script. * EFI Directory: a 64-bit EFI-based system boot. In the BOOT directory, BOOTX64.conf is the grub configuration file, which is used to display the BOOT menu. * TRANS. TBL File: record the list of the current directory and use the-T parameter of mkisofs to generate a new one, mainly for the long file name. /Isolinux/iso. cfg is under the isolinux directory in the iso file, isolinux. cfg displays the information on the first interface during installation. It also specifies the kernel image and initrd image to be loaded: install or upgrade an existing system Install system with basic video driver Rescue installed system Boot from local drive Memory test/isolinux/boot. msg this file information only displays Key to begin installation process. this picture is the background image of our installation interface 1.2 vmlinuzvmlinuz is a bootable, compressed kernel. "Vm" represents "Virtual Memory ". Linux supports virtual memory. Unlike earlier operating systems such as DOS, there is a limit of KB memory. Linux can use hard disk space as virtual memory, so it is named "vm". vmlinuz is an executable Linux kernel. Vmlinuz is a bootable and compressed kernel. "Vm" represents "Virtual Memory ". Linux supports virtual memory. Unlike earlier operating systems such as DOS, there is a limit of KB memory. Linux can use hard disk space as virtual memory, so it is named "vm ". Vmlinuz is an executable Linux kernel, and vmlinuz is an executable Linux kernel. It is located in/boot/vmlinuz. There are two ways to establish vmlinuz. One is to compile the kernel through "make zImage" to create, and then through: "cp/usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz" generated. Vmlinux is not a compressed kernel, while vmlinuz is a compressed kernel. Generally, it is easy to understand that the system kernel vmlinuz is loaded into the memory to provide underlying support, and various modules and services are loaded and run with kernel support. This is, of course, the most acceptable method for everyone. Once linux was running like this. If your hard disk is a scsi interface and your kernel does not support this interface, your kernel cannot access the hard disk or load the file system on the hard disk. what should I do? Easy to handle! Add the kernel to the scsi driver source code and re-compile a new kernel file to replace the original vmlinuz. There are still many examples that need to change the standard kernel to provide support by default. it is too troublesome to compile the kernel every time. Therefore, linux later provided a flexible solution to these problems-initrd. img 1.3 initrd. img inininrd. img What is it? The meaning of initrd is that initialized ram disk. ramdisk simulates a part of the memory into a disk for the operating system to access. We can decompress initrd in the following ways. img, let's take a look at some files in this file system: # file initrd. img/* check the file format. if it is gzip compressed data, you can use the following method to operate */# cp init. img/initrd (the directory initrd is self-built) # cd/initrd # mv initrd. img initrd.gz (change the name) # gunzip initrd.gz (decompress the package and obtain an initrd file. The file command shows that it is a compressed file in cpio format) # mkdir tmp # cd tmp # cpio-id <.. /initrd (this command can be used to extract initrd, so that the file bin, dev, etc, firmware, init, lib, lib6 can be seen in the current tmp directory. 4, mode les, proc, sbin, selinux, sys, tmp, usr, var ). Initrd was initially designed to split the startup of the kernel into two phases: retaining the least basic startup code in the kernel, then, the support for various hardware devices is placed in initrd as a module, so that the module to be loaded in the root file system can be mounted from initrd during startup. One advantage of this is that you can flexibly support different hardware by modifying the content in initrd without changing the kernel. At the end of the startup, the root file system can be mounted to another device. We often use make menuconfig to compile the core. for some out-of-the-box drivers, you can choose to compile the module or <*> directly compile it into the core. For example, if the ext3 file system driver needs to be installed on the file system, there are two methods: reference 1. compile all of them into the kernel, you only need one kernel file system to start. 2. compile it as a module and load it through the initrd virtual memory system. that is to say, because initrd virtualizes a file system in the memory, then, different drivers can be loaded based on different hardware without re-compiling the entire core. Therefore, most distributions load the driver in this way. 1.4 The anaconda system starts, loads the boot image, creates a linux system environment in the memory, parses the installation program image file, loads the installation program into the memory, and executes the main execution program anaconda, this program is a port of the specific installation program. it is responsible for starting the specific installation process and completing the installation of the linux system. The Anaconda installer supports two installation methods: interactive installation and non-interactive installation. Interactive installation: prompts you to set some network and partition settings during the installation process. non-interactive: automated installation is achieved through the kickstart configuration file. Next, you can view the content of the anaconda File: First, go to the installation disk image and install. run the following command to Mount img: Mount-o loop-squashfs (optional) images/install. after parsing img/mnt/stage2 Cd/mnt/stage2, we can see that the main execution body of the installer anaconda is in. in the/usr/bin directory, it is written in python, and other installation script modules are in. in the/usr/lib/anaconda Directory, for future lines, unless it is the main execution body of anaconda, the rest refer. the module in the/usr/lib/anaconda directory. The main directory structure of anaconda: Installclasses: each module in the subdirectory defines the installation types that you can select during the installation process. Redhat9.0 contains four files: workstation. py, server. py, custom. py, and Workstation. py describes the workstation installation type, server. py describes the server installation type, custom. py describes the user-defined installation type, and describes the personal desktop installation type. Each installation type description file provides different solutions for the installation steps, partition policies, and installation packages based on the characteristics of the corresponding installation types. The Iw sub-directory contains all modules where the graphic interface class is installed. each graphic interface corresponds to a class, and is responsible for displaying the specific appearance of the graphic interface and interacting with users. (possible) call the relevant installation behavior module in the main directory of anaconda to complete the installation. The textw sub-directory and iw sub-directory have the same meaning. they only contain the modules of the front-end character user interface class in character installation mode. each character user interface corresponds to a class, interaction with users. The character interface adopts the python snack Library. If the user interface class is used to handle the appearance of the installer, the python modules in the anaconda home directory execute the specific installation behavior behind each installation interface, including installation operations without user interface installation steps. 1.5 isolinux. cfg configuration file default vesamenu. c32 # The first line, default vesamenu. c32, required. this vesamenu is required to use the menu function. c32 file # prompt 1 timeout 600 # The Countdown 600 is 6 seconds display boot. msg # display a message. you can modify menu background splash.jpg # display menu bar's installation interface background image menu title Welcome to NeoKylin Linux Security OS V5! # Display menu bar title menu color border 0 # ffffffff #00000000 # menu bar border color menu color sel 7 # ffffffff # ff000000 # selected text color menu color title # 0000ff # 0000ff # title color menu color tabmsg 5 # ffffffff #00000000 menu color unsel #000000 #000000 # unselected color menu color hotsel 6 # ff000000 # ffffffff menu color hotkey 7 # ffffffff # ff000000 menu color scrollbar # fafac0 # fafac0 label install # indicates that we want to install the system # The following shows the installation interface information we saw during installation, if we select The corresponding operation is to set through this file. Menu label Install system with ^ basic video driver kernel vmlinuz append initrd = initrd. img ks = cdrom:/isolinux/ks. cfg xdriver = vesa nomodeset quiet label install text menu label Install system with ^ basic video driver (text) kernel vmlinuz append initrd = initrd. img ks = cdrom:/isolinux/ks_text.cfg xdriver = vesa nomodeset quiet label rescue menu label ^ Rescue installed system kernel vmlinuz append initrd = initrd. img rescue label local menu label Boot from ^ local drive localboot 0 xffff label memtest86 menu label ^ Memory test kernel memtest append-2. linux startup overview

Start overview 3. load BIOS when you turn on the computer power, the computer will first load the BIOS (Basic Input Output System ). After the system is powered on, it reads various data. BIOS information is so important that the computer must find it at the very beginning. This is because the BIOS contains CPU information, device startup sequence information, hard disk information, memory information, clock information, and PnP features. In PC, boot Linux starts from the BIOS address 0xFFFF0. After that, the PC obtains the first startup device code. 4. boot Loader4.1 stage1 the first sector of the 0th track on the first Boot device is called MBR, that is, Master Boot Record, that is, the Master Boot Record. The size of the Record is 512 bytes, it contains the pre-start Information and partition table information. After the startup device is found, load the MBR to RAM for execution. In linux, the files read at this stage are/boot/grub/stage1. Once the boot loader is loaded into RAM, the BIOS gives control of the computer to it. The MBR running in the memory includes two parts: the program code and the partition table, as shown in figure 2. The first 446bytes in 512bytes is used to put bootloader, which contains both executable code and error message files. The next 64 bytes is four partition tables, each of which is 16 bytes. The last two bytes magic numbers (actually 0xAA55) are mainly used to verify whether the MBR is valid. The main function of stage1 bootloader is to load the second bootstrap program (stage2). This is mainly because there is not enough space in the main bootstrap sector for other operations. To view the MBR content, run the following command: # dd if =/dev/sda of = MBR. bin bs = 512 count = 1 # od-xa mbr. bin: 0000000 ...... * The leftmost part of 0001000 represents the file offset, expressed in octal notation, and (0001000) represents 512 in decimal notation. this dd command needs to be run as the root user, it reads the content of the first 512 bytes from/dev/sda and writes it to mbr. binfile. The od command prints the contents of the binary file in hexadecimal format and ASCII format. 4.2 stage1.5 in the/boot/grub Directory, there are fat_stage_1.5 e2fs_stage_1.5 xfs_stage_1.5 and so on. stage1.5 is related to the file system. Sometimes the basic bootstrap loader (stage1) cannot identify the file system partition where stage2 is located. in this case, stage1.5 is required to connect stage1 and stage2. Therefore, different file systems have different stage1.5 values. 4.3 stage2Stage2 Boot Loader is a small program that runs before the operating system kernel runs. Through this small program, we can initialize hardware devices and build a map of memory space to bring the system's hardware and software environment to a suitable state, in order to make all preparations for the final call to the operating system kernel and load the kernel. we often combine boot loaders of first-stage (stage1) and second-stage (stage2) into Linux Loader (LILO) or GRand uniied Bootloader (GRUB) in x86 PC ). In GRUB, you can use the file/boot/grub. conf to display a menu or enter a command. The biggest advantage of GRUB over LILO is its ability to read various linux file systems. In fact, GRUB extends the boot loader of the two stages mentioned above to three stages, that is, after stage1, it adds stage1.5 boot loader to realize the awareness of the file system. For example, reiserfs_stage00005 (from a Reiser file system) or e2fs_stage00005 (from an ext2 or ext3 file system. After the stage 1.5 boot loader is loaded and run, the stage 2 boot loader is loaded. Grub is in grub. if grub runs under the control of conf, once grub receives the correct command from its command line or configuration file to start the operating system, it will find the necessary boot file, then, the control of the machine is handed over to the operating system. Grub functions: 1. which operating system can be started? 2. grub editing mode can directly pass parameters to the kernel. 3. the encryption protection function is available in my system/boot/grub. the linux boot command in the conf file is as follows: # grub. conf generated by anaconda # Note that you do not have to rerun grub after making chan ges to this file # NOTICE: You do not have a/boot partition. this means that # all kernel and initrd paths are relative to/, eg. # root (hd0, 0) # kernel/boot/vmlinuz-version ro root =/dev/sda1 # initrd/boot/initrd-[generic-] version. img # bo Ot =/dev/sda default = 0 timeout = 10/* default wait time, which can be set a little longer */splashimage = (hd0, 0) /boot/grub/splash.xpm.gz Hiddenmenu/* hides the menu. if you have installed multiple systems, comment out the menu, it will be easier to select the OS when the system starts */title Red Hat Enterprise Linux (2.6.32-131.0.15.el6.i686) root (hd0, 0) kernel/boot/vmlinuz-2.6.32-131.0.15.el6.i686 ro root = UUID = export rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG = zh_CN.UTF- 8 KEYBOARDTYPE = pc ke ytable = us crashkernel = auto rhgb quiet initrd/boot/initramfs-2.6.32-131.0.15.el6.i686.img root (hd0, 0 ), root indicates the partition used to define some file package configuration files and kernel files used in the second stage of grub (hd0, 0) indicates the first primary partition of the first hard disk. No matter what hard disk you are, grub is called hd. hd0 is the first hard disk and 0 is the first partition, which indicates (hd0, 0 ). The kernel command in the file is used to specify the location of the kernel. "/" indicates (hd0, 0), that is, the grub root directory. This information is recorded in/var/log/dmesg, and all information during initialization is recorded. The initrd command is used to specify the location of the imgfile used to initialize RAM. Encrypt the grub command: 1) use the command/sbin/grub-md5-crypt to generate the Password for grub/sbin/grub-md5-crypt password: Retype Password: $1 $3 YbPF $ FVKSKDFJKWJEKJF90XRkrl 2) modify/boot/grub. add password to conf -- md5 $1 $3 YbPF $ FVK SKDFJKWJEKJF90XRkrl. this sentence must be added before the title. In this way, when the grub menu is started during system restart, to press e to enter the compilation mode, you must press p to enter the grub password. After stage 2 is loaded, GRUB can list available kernel (defined in/boot/grub. conf ). You can select one of them and set the startup parameters of the selected kernel. When stage 2 boot loader is loaded into the memory, the default kernel image and initrd image are loaded into the memory. After these images are loaded, stage 2 boot loader will activate the kernel image. 5. after kernelStage 2 bootloader, the kernel has been loaded into the memory and the control is transferred to kernerl. This kernel is generally not an executable kernel, but a compressed kernel image. This image is usually compressed to zImage (compressed image, smaller than kB) or bzImage (big compressed image, larger than kB) using zlib ). The initial part of this image is a small module, which performs some basic hardware initialization, and decompress the executable kernel part to put it in the memory high. Next, this module calls the kernel to start the kernel boot work. After the kernel is decompressed, the screen outputs "OK, booting the kernel ". The system places the unzipped kernel in the memory, and the kernel immediately initializes various devices in the system and performs related configuration work, including CPU, I/O, and storage devices. In the 2.6 kernel, two formats of initrd are supported, one is the 2.4 kernel file system image-initrd, and the other is the cpio format. Taking the cpio format as an example, after the kernel determines that initrd is a cpio file format, the content in initrd will be released to rootfs. Initrd is a memory-based file system. during startup, the system first accesses the initrd file system when accessing the real root file system. Open the content in initrd and you will find files (including directories) such as bin, devetc, lib, procsys, sysroot, and init ). It includes some device drive simulation blocks, such as scsi ata and other device driver modules, as well as several basic executable programs such as insmod, modprobe, lvm, and nash. The main purpose is to load some drive modules of storage media, such as the device driver modules such as scsi ideusb mentioned above, initialize LVM, after the/root file system is read-only mounted to initrd and the content is released to rootfs, the Kernel will execute the init file. the init here is a nash script, executed by the nash interpreter. At this time, the control of the kernel is handed over to the init file for processing. we can view the content of the init file, which is mainly used to load device drivers related to various storage media. After the driver is loaded, a root device is created, and then the root file system/is mounted in read-only mode. After this step, execute switchroot, convert it to the real root/, and run the/sbin/init Program at the same time. This is the No. 1 process of our system. after that, control of system startup is handed over to the init process. For switchroot, this is the program defined in nash. Summary: during the startup of the entire kernel, the boot loader in stage 2 is loaded into the initial-RAM disk (initrd) in the memory and copied to RAM and mounted. It works in RAM as a temporary file system so that the kernel can be fully started without any physical device mounting. It is precisely because all the interactions related to peripheral devices can be placed in initrd. Although the kernel itself is small, it supports a wide range of hardware devices. After the kernel is started, the root file system will be rolled back (via javast_root). the root file system of initrd will be uninstalled, and the actual root file system will be mounted. Initrd exists because Linux Kernel needs to adapt to a variety of different hardware architectures, but it is impractical to compile all hardware drivers into the Kernel, and it is impossible to create a hardware structure for each Kernel, write the device driver of the hardware to the kernel. In fact, LinuxKernel only contains the basic hardware driver. during system installation, the system detects the system hardware information and writes some device drivers to initrd based on the installation information and system hardware information. In this way, when the system is started later, some device drivers will be loaded in initrd. In summary, the main operations of the kernel include: 1. device Detection 2. driver Initialization 3. load the root file system in read-only mode 4. start the init process. when there is initrd, the machine startup process is probably the following steps (when the initrd line is replaced by the noinitrd command, there will be no initrd) 1) boot loader (grub) load the kernel and initrd. img 2) the kernel will compress the initrd. img decompress it into a normal ram disk and release the memory space occupied by initrd. 3) initrd is mounted as the root directory in read/write mode. 4) The linuxrc file in initrd is executed. 5) linuxrc mounting the new file system 6) linuxrc uses the cmdt_root system to call the specified new root directory and place the existing root directory to the specified location. 7) officially init 8) initrd in the new file system Uninstalled 6. after the init process 6.1 reads the inittable kernel and is loaded and run, the first program to run is/sbin/init, which reads the/etc/inittab file, find a line of code specifying the default running level, and then run the initialization service at the specified level. The configuration information in/etc/inittab is in the following format: id: runlevel: action: process id: identifier runlevel: running level action: process for the operation at the running level: run the following runlevel command: 0: Shutdown 1: Single-user mode 2: Multi-user mode without network support 3: Multi-user mode with network support 4: RETAIN, 5 Not used: the network supports multi-user mode with X-Window support 6: reboot the system, that is, restart the action has the following option: respawn: indicates that the init Program monitors this process, the process is started immediately even if it is terminated. wait: indicates that the init process only calls this process once and waits until the process ends before performing the next operation. initdefault: indicates the running level that the system enters by default after running. because various processes at the corresponding level are started by default when entering a level, process is not defined, as shown in figure If this record does not exist, it will directly enter the text mode. sysinit: the command to be run when the system starts. this command points directly to the first initialization script/etc/rc that runs after the system starts. d/rc. sysinint; powerfail: indicates the proces after the power supply is cut off (when there is a ups); powerokwait: when the power monitoring finds that the power supply is restored, the following process is executed; ctrlaltdel: enable init to restart the system when you press the C t r l + A l t + D e l key combination on the console keyboard. Note: If the system is deployed in A public place, the system administrator can configure the C t r l + A l t + D e l combination key as another action, such as ignore. 6.2 in single-user mode, an important operation level is single-user mode (Operation Level 1). In this mode, only one system administrator uses a specific machine, and run as few system services as possible, including logon. Single-user mode is necessary for a few management tasks (such as running fsck on A/usr partition), because it needs to detach the partition, but this is impossible, unless all service systems have been killed. A running system can enter the single-user mode. the specific method is to use init to request the running level 1. When the kernel is started, specify the single or emergency keyword in the kernel command line to enter level 1. The kernel also specifies the Command Line for init. init knows from the keyword that it should not use the default running level (the input mode of the kernel command line is related to the mode in which you start the system ). Sometimes, it is necessary to start in single-user mode. in this way, before you mount a partition, or at least before loading a scattered/usr partition, run fsck manually (any activity on a distributed file system can make it more dispersed, so run fsck as much as possible ). If the automated fsck fails to be started, the startup script init automatically enters the single-user mode. This is done to prevent the system from using an inconsistent file system, which is not automatically repaired by f s c k. File system inconsistencies are rare, and usually lead to inconsistent hard disks or experimental kernel release, but it is best to prevent problems before they happen. Due to security considerations, in single-user mode, a properly configured system requires the user to provide the root password before starting the shell script. Otherwise, it will simply enter a proper line of code for l I L O and log on as r o O t (of course, if/etc/passwd is not coherent due to file system problems, it is not suitable for the principle here. to deal with this situation, you 'd better prepare a boot disk at any time ). Different running levels have different functions and should be set according to different situations. Run rc at 6.3. after sysinit sets the running level, the initialization script file/etc/rc executed by Linux. d/rc. sysinit performs basic configuration on the system, and mounts the root file system and other file systems in read/write mode. the following operations are performed: 1. activate udev and selinux; 2. read/etc/sysctl. conf sets kernel parameters 3. set system Time 4. load keyboard ing 5. enable swap partition 6. set host name 7. check the root file system and remount the root file system in read/write mode. activate LVM and RAID device 9. disk startup quota 10. mount other file systems 11. in the execution of the sysinit script, the system environment is set by default by calling the files in/etc/sysconfig. you can use dmesg to view the system loading information. 6.4 enable and disable the service. The service is executed according to the file/etc/rc. d/rcX. d/[KS. Terminate the service starting with "K" and start the service starting with "S. For each running level, there is a corresponding sub-directory in the/etc/rc. d sub-directory. The sub-directories at the running level are named as rcX. d. X indicates the number at the running level. For example, all the command script programs of running level 3 are saved in the/etc/rc. d/rc3.d subdirectory. In the sub-directories of each running level, the/etc/rc is created. d/init. d sub-directory command script program symbolic links, however, these symbolic links do not use the command script program in/etc/rc. d/init. the original name in the d sub-directory. If the command script program is used to start a service, its symbolic link name starts with the letter S. If the command script program is used to close a service, the name of the symbolic link starts with K. In many cases, the execution sequence of these script programs is very important. In order to arrange their execution sequence, a two-digit character is followed by the letter S or K, and a small value is followed by a large value. For example,/etc/rc. d/rc3.d/S50inet will be executed before/etc/rc. d/rc3.d/S55named. The system first runs the command script program with the letter K headers, and then runs the command script program with the letter S headers. The Stop parameter is passed for the command script program that starts with letters K. Similarly, the Start parameter is passed for the command script program that starts with letters S. 6.5 run the custom script program/etc/rc. d/rc. local, Redhat Linux Operating modes 2, 3, 5 put/etc/rc. d/rc. as the last part of the initialization script, Linux leaves users with a place to personalize. You can put what you want to set and start here. 7. after logging on to the system and completing all the startup tasks, you can enter your username and password. In Linux, the account verification program is login. login analyzes the user name. if the user name is not root and the/etc/nologin file exists, login outputs the content of the nologin file and then exits. This is usually used to prevent non-root user logon during system maintenance. Only terminals registered in/etc/securetty allow the root user to log on. If this file does not exist, the root user can log on to any terminal. The/etc/usertty file is used to add access restrictions to users. If this file does not exist, there are no other restrictions. After analyzes the user name, login searches for/etc/passwd and/etc/shadow to verify the password and set other information about the account, such as what is the main directory and what shell is used. If no main directory is specified, the root directory is used by default. If no shell is specified,/bin/bash is used by default. After the login program is successful, the last logon information (recorded in/var/log/lastlog) is output to the corresponding terminal ), check whether the user has any new emails (in the directory of the corresponding user name of/usr/spool/mail ). Then set various environment variables: For bash, the system first looks for the/etc/profile script file and runs it. then, if the user's main directory exists. execute the bash_profile file. other configuration files may be called in these files. after all the configuration files are executed, various environment variables are also set, A familiar command line prompt will appear, and the entire startup process ends. Author ping1214
Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.