1. 程式人生 > >Linux裝置驅動--LCD平臺裝置與驅動(tiny4412)

Linux裝置驅動--LCD平臺裝置與驅動(tiny4412)

1 環境與簡介

    Host:Ubuntu14.04(64bit)

    Target:Tiny4412

    Kernel:linux-3.5.0

2 平臺裝置

2.1 宣告

extern struct platform_device s5p_device_fimd0;

標頭檔案:arch/arm/plat-samsung/include/plat/devs.h

對比分析:與《Linux裝置驅動--LCD平臺裝置與驅動(smdk2440)》不同的是,這裡不是通過EXPORT_SYMBOL(s5p_device_fimd0)使其在別的原始檔可見,而是在標頭檔案中宣告該變數。

2.2 定義

    先定義一個通用版的s5p_device_fimd0

,其名字為s5p-fb,這個名字在後面中還會根據實際使用的配置進行設定。

struct platform_device s5p_device_fimd0 = {
    .name       = "s5p-fb",
    .id     = 0,
    .num_resources  = ARRAY_SIZE(s5p_fimd0_resource),
    .resource   = s5p_fimd0_resource,
    .dev        = {
        .dma_mask       = &samsung_device_dma_mask,
        .coherent_dma_mask  = DMA_BIT_MASK(32),
    },
}; 

原始檔:arch/arm/plat-samsung/devs.c

對比分析:與《Linux裝置驅動--LCD平臺裝置與驅動(smdk2440)》和《Linux裝置驅動--LCD平臺裝置與驅動(smdk6410)》不同的是,這裡平臺裝置並不命名為xxx_device_lcd或者xxx_device_fb,而是命名為xxx_device_fimd。前面兩個都命名都容易讓人想到是與顯示相關的,但是後面的命名卻讓不熟悉的人感到困惑。其實,fimdfully Interactive mobile display的縮寫,意為完全互動式移動顯示裝置[2]。知道這層之後,就不會對xxx_device_fimd感到困惑了。

2.3 引用

    定義一個平臺裝置陣列smdk4x12_devices,該陣列包含了Tiny4412開發板的所有平臺裝置,其中當然包括上述s5p_device_fimd0,如下第35行所示:

static struct platform_device *smdk4x12_devices[] __initdata = {
#ifdef CONFIG_EXYNOS4_DEV_DWMCI
	&exynos_device_dwmci,
#endif
	&s3c_device_hsmmc2,
	&s3c_device_hsmmc3,
	&wm8994_fixed_voltage0,
	&wm8994_fixed_voltage1,
	&wm8994_fixed_voltage2,
	&s3c_device_i2c0,
	&s3c_device_i2c1,
	&s3c_device_i2c2,
	&s3c_device_i2c3,
#ifdef CONFIG_VIDEO_M5MOLS
	&s3c_device_i2c4,
#endif
	&s3c_device_i2c7,
	&s3c_device_adc,
	&s3c_device_rtc,
	&s3c_device_wdt,
#ifdef CONFIG_TINY4412_BUZZER
	&s3c_device_timer[0],
#endif
#ifdef CONFIG_VIDEO_EXYNOS_FIMC_LITE
	&exynos_device_flite0,
	&exynos_device_flite1,
#endif
	&s5p_device_mipi_csis0,
	&s5p_device_mipi_csis1,
	&s5p_device_fimc0,
	&s5p_device_fimc1,
	&s5p_device_fimc2,
	&s5p_device_fimc3,
	&s5p_device_fimc_md,
	&s5p_device_fimd0,
	&mali_gpu_device,
	&s5p_device_mfc,
	&s5p_device_mfc_l,
	&s5p_device_mfc_r,
	&s5p_device_jpeg,
#ifdef CONFIG_SAMSUNG_DEV_KEYPAD
	&samsung_device_keypad,
#endif
	&tiny4412_device_1wire,
	&tiny4412_device_adc,
#ifdef CONFIG_INPUT_GPIO
	&tiny4412_input_device,
#endif
#ifdef CONFIG_IR_GPIO_CIR
	&tiny4412_device_gpiorc,
#endif
#ifdef CONFIG_VIDEO_EXYNOS_FIMC_IS
	&exynos4_device_fimc_is,
#endif
#ifdef CONFIG_LCD_LMS501KF03
	&s3c_device_spi_gpio,
#endif
#ifdef CONFIG_S3C64XX_DEV_SPI0
	&s3c64xx_device_spi0,
#endif
#ifdef CONFIG_S3C64XX_DEV_SPI1
	&s3c64xx_device_spi1,
#endif
#ifdef CONFIG_S3C64XX_DEV_SPI2
	&s3c64xx_device_spi2,
#endif
#ifdef CONFIG_ION_EXYNOS
	&exynos_device_ion,
#endif
	&s5p_device_i2c_hdmiphy,
	&s5p_device_hdmi,
	&s5p_device_mixer,
	&exynos4_bus_devfreq,
	&samsung_asoc_dma,
	&samsung_asoc_idma,
#ifdef CONFIG_SND_SAMSUNG_I2S
	&exynos4_device_i2s0,
#endif
#ifdef CONFIG_SND_SAMSUNG_PCM
	&exynos4_device_pcm0,
#endif
#ifdef CONFIG_SND_SAMSUNG_SPDIF
	&exynos4_device_spdif,
#endif
	&tiny4412_audio,
#ifdef CONFIG_VIDEO_EXYNOS_FIMG2D
	&s5p_device_fimg2d,
#endif
#ifdef CONFIG_EXYNOS_THERMAL
	&exynos_device_tmu,
#endif
	&s5p_device_ehci,
	&exynos4_device_ohci,
	&s5p_device_usbswitch,
#if defined CONFIG_SND_SAMSUNG_ALP
	&exynos_device_srp,
#endif
#ifdef CONFIG_BUSFREQ_OPP
	&exynos4_busfreq,
#endif
#ifdef CONFIG_BATTERY_SAMSUNG
	&samsung_device_battery,
#endif
};

原始檔:arch/arm/mach-exynos/mach-tiny4412.c

2.4 註冊

(1)註冊函式

    在smdk4x12_machine_init()函式中呼叫platform_add_devices()函式將上述smdk4x12_devices註冊到系統,即可完成平臺裝置的註冊,如下第121行所示:

static void __init smdk4x12_machine_init(void)
{
#ifdef CONFIG_TOUCHSCREEN_FT5X0X
	struct s3cfb_lcd *lcd = tiny4412_get_lcd();
	ft5x0x_pdata.screen_max_x = lcd->width;
	ft5x0x_pdata.screen_max_y = lcd->height;
#endif

	exynos_bootdev_init();
	tiny4412_hwrev_init();

#ifdef CONFIG_S3C64XX_DEV_SPI0
	spi_register_board_info(spi0_board_info, ARRAY_SIZE(spi0_board_info));
#endif
#ifdef CONFIG_S3C64XX_DEV_SPI1
	spi_register_board_info(spi1_board_info, ARRAY_SIZE(spi1_board_info));
#endif
#ifdef CONFIG_S3C64XX_DEV_SPI2
	spi_register_board_info(spi2_board_info, ARRAY_SIZE(spi2_board_info));
#endif

	if (samsung_pack() != EXYNOS4412_PACK_SCP) {
#ifdef CONFIG_REGULATOR_MAX77686
		max77686_populate_pdata();
#endif
	}

	s3c_adc_set_platdata(NULL);
	s3c_adc_setname("samsung-adc-v4");

	s3c_i2c0_set_platdata(&tiny4412_i2c0_data);
	i2c_register_board_info(0, smdk4x12_i2c_devs0,
			ARRAY_SIZE(smdk4x12_i2c_devs0));

	s3c_i2c1_set_platdata(&tiny4412_i2c1_data);
	i2c_register_board_info(1, smdk4x12_i2c_devs1,
			ARRAY_SIZE(smdk4x12_i2c_devs1));

	s3c_i2c2_set_platdata(NULL);
	i2c_register_board_info(2, smdk4x12_i2c_devs2,
			ARRAY_SIZE(smdk4x12_i2c_devs2));

	s3c_i2c3_set_platdata(&tiny4412_i2c3_data);
	i2c_register_board_info(3, smdk4x12_i2c_devs3,
			ARRAY_SIZE(smdk4x12_i2c_devs3));

	s3c_i2c4_set_platdata(NULL);

	smdk4x12_rtc_wake_init();
	smdk4x12_pmu_wdt_init();
	smdk4x12_touch_init();

	if (is_board_rev_B()) {
#ifdef CONFIG_INPUT_GPIO
		tiny4412_key_info_fixup();
#endif
	} else {
		tiny4412_wifi_init();
	}

	s3c_i2c7_set_platdata(&tiny4412_i2c7_data);
	i2c_register_board_info(7, smdk4x12_i2c_devs7,
			ARRAY_SIZE(smdk4x12_i2c_devs7));

	s3c_hsotg_set_platdata(&smdk4x12_hsotg_pdata);
#ifdef CONFIG_USB_EXYNOS_SWITCH
	smdk4x12_usbswitch_init();
#endif
	samsung_bl_set(&smdk4x12_bl_gpio_info, &smdk4x12_bl_data);

	tiny4412_fb_init_pdata(&smdk4x12_lcd0_pdata);
	s5p_fimd0_set_platdata(&smdk4x12_lcd0_pdata);
#ifdef CONFIG_LCD_LMS501KF03
	spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
#endif

#ifdef CONFIG_SAMSUNG_DEV_KEYPAD
	samsung_keypad_set_platdata(&smdk4x12_keypad_data);
#endif

#ifdef CONFIG_EXYNOS4_DEV_DWMCI
	exynos_dwmci_set_platdata(&exynos_dwmci_pdata);
#endif

	s3c_sdhci2_set_platdata(&smdk4x12_hsmmc2_pdata);
	s3c_sdhci3_set_platdata(&smdk4x12_hsmmc3_pdata);

#ifdef CONFIG_ION_EXYNOS
	exynos_ion_set_platdata();
#endif
	s5p_tv_setup();
	s5p_i2c_hdmiphy_set_platdata(NULL);
	s5p_hdmi_set_platdata(smdk4x12_i2c_hdmiphy, NULL, 0);

#ifdef CONFIG_VIDEO_EXYNOS_FIMG2D
	s5p_fimg2d_set_platdata(&fimg2d_data);
#endif
#if defined(CONFIG_VIDEO_M5MOLS) || defined(CONFIG_VIDEO_S5K6A3)
	smdk4x12_camera_init();
#endif
#ifdef CONFIG_VIDEO_EXYNOS_FIMC_LITE
	smdk4x12_set_camera_flite_platdata();
	s3c_set_platdata(&exynos_flite0_default_data,
			sizeof(exynos_flite0_default_data), &exynos_device_flite0);
	s3c_set_platdata(&exynos_flite1_default_data,
			sizeof(exynos_flite1_default_data), &exynos_device_flite1);
#endif
	smdk4x12_ehci_init();

#ifdef CONFIG_S3C64XX_DEV_SPI0
	s3c64xx_spi0_set_platdata(NULL, 0, 1);
#endif
#ifdef CONFIG_S3C64XX_DEV_SPI1
	s3c64xx_spi1_set_platdata(NULL, 0, 1);
#endif
#ifdef CONFIG_S3C64XX_DEV_SPI2
	s3c64xx_spi2_set_platdata(NULL, 0, 1);
#endif

	smdk4x12_ohci_init();
	platform_add_devices(smdk4x12_devices, ARRAY_SIZE(smdk4x12_devices));
	if (!uhost0)
		platform_device_register(&s3c_device_usb_hsotg);

#ifdef CONFIG_VIDEO_EXYNOS_FIMC_IS
	exynos4_fimc_is_set_platdata(NULL);
#endif

	if (soc_is_exynos4412()) {
		if ((samsung_rev() >= EXYNOS4412_REV_2_0))
			initialize_prime_clocks();
		else
			initialize_non_prime_clocks();

#ifdef CONFIG_S3C64XX_DEV_SPI0
		exynos4_setup_clock(&s3c64xx_device_spi0.dev, "mdout_spi",
				"mout_mpll_user", 50 * MHZ);
#endif
	}
#ifdef CONFIG_BUSFREQ_OPP
	dev_add(&busfreq, &exynos4_busfreq.dev);
	ppmu_init(&exynos_ppmu[PPMU_DMC0], &exynos4_busfreq.dev);
	ppmu_init(&exynos_ppmu[PPMU_DMC1], &exynos4_busfreq.dev);
	ppmu_init(&exynos_ppmu[PPMU_CPU], &exynos4_busfreq.dev);
#endif
	set_tmu_platdata();
}

原始檔:arch/arm/mach-exynos/mach-tiny4412.c

(2)註冊時機

    上述smdk4x12_machine_init()函式是何時被呼叫的呢?答案是在核心初始化裝置的時候,如下第9行所示:

MACHINE_START(TINY4412, "TINY4412")
	/* Maintainer: FriendlyARM (www.arm9.net) */
	/* Maintainer: Kukjin Kim <[email protected]> */
	/* Maintainer: Changhwan Youn <[email protected]> */
	.atag_offset	= 0x100,
	.init_irq	= exynos4_init_irq,
	.map_io		= smdk4x12_map_io,
	.handle_irq	= gic_handle_irq,
	.init_machine	= smdk4x12_machine_init,
	.init_late	= exynos_init_late,
	.timer		= &exynos4_timer,
	.restart	= exynos4_restart,
	.reserve	= &smdk4x12_reserve,
MACHINE_END
原始檔:arch/arm/mach-exynos/mach-tiny4412.c

3 平臺驅動

3.1 宣告

extern struct platform_driver fimd_driver;
標頭檔案:drivers/gpu/drm/exynos/exynos_drm_drv.h

3.2 定義

struct platform_driver fimd_driver = {
	.probe      = fimd_probe,
	.remove     = __devexit_p(fimd_remove),
	.driver     = {  
	  .name   = "exynos4-fb",
	  .owner  = THIS_MODULE,
	  .pm = &fimd_pm_ops,
	},
}; 
原始檔:drivers/gpu/drm/exynos/exynos_drm_fimd.c

3.3 註冊

    在exynos_drm_init()函式中呼叫platform_driver_register()將上述fimd_driver註冊到系統中,例如下面第8行所示。

static int __init exynos_drm_init(void)
{
	int ret;

	DRM_DEBUG_DRIVER("%s\n", __FILE__);

#ifdef CONFIG_DRM_EXYNOS_FIMD
	ret = platform_driver_register(&fimd_driver);
	if (ret < 0)
		goto out_fimd;
#endif

#ifdef CONFIG_DRM_EXYNOS_HDMI
	ret = platform_driver_register(&hdmi_driver);
	if (ret < 0)
		goto out_hdmi;
	ret = platform_driver_register(&mixer_driver);
	if (ret < 0)
		goto out_mixer;
	ret = platform_driver_register(&exynos_drm_common_hdmi_driver);
	if (ret < 0)
		goto out_common_hdmi;
#endif

#ifdef CONFIG_DRM_EXYNOS_VIDI
	ret = platform_driver_register(&vidi_driver);
	if (ret < 0)
		goto out_vidi;
#endif

#ifdef CONFIG_DRM_EXYNOS_G2D
	ret = platform_driver_register(&g2d_driver);
	if (ret < 0)
		goto out_g2d;
#endif

	ret = platform_driver_register(&exynos_drm_platform_driver);
	if (ret < 0)
		goto out;

	return 0;

out:
#ifdef CONFIG_DRM_EXYNOS_G2D
	platform_driver_unregister(&g2d_driver);
out_g2d:
#endif

#ifdef CONFIG_DRM_EXYNOS_VIDI
out_vidi:
	platform_driver_unregister(&vidi_driver);
#endif

#ifdef CONFIG_DRM_EXYNOS_HDMI
	platform_driver_unregister(&exynos_drm_common_hdmi_driver);
out_common_hdmi:
	platform_driver_unregister(&mixer_driver);
out_mixer:
	platform_driver_unregister(&hdmi_driver);
out_hdmi:
#endif

#ifdef CONFIG_DRM_EXYNOS_FIMD
	platform_driver_unregister(&fimd_driver);
out_fimd:
#endif
	return ret;
}

原始檔:drivers/gpu/drm/exynos/exynos_drm_drv.c

4 裝置與驅動匹配

    平臺裝置和驅動必須同名才能匹配,然而上述平臺裝置的name為s5p-fb,而平臺驅動的name為exynos4-fb,根本就不一致!這是不是搞錯了呢?答案是否定的,這其實是一個用於支援多種顯示裝置的技巧:在特定的函式中對上述裝置名進行更改,使其和驅動名匹配。下面分析該過程。

4.1 更改裝置名字

(1)exynos4_map_io()

    該函式呼叫s5p_fb_setname()函式將上述s5p_device_fimd0的名字由原來的s5p-fb改為exynos4-fb,見38行。

static void __init exynos4_map_io(void)
{
    iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));

    if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0)
        iotable_init(exynos4_iodesc0, ARRAY_SIZE(exynos4_iodesc0));
    else
        iotable_init(exynos4_iodesc1, ARRAY_SIZE(exynos4_iodesc1));

    if (soc_is_exynos4412())
        iotable_init(exynos4412_iodesc, ARRAY_SIZE(exynos4412_iodesc));
    else
        iotable_init(exynos4xxx_iodesc, ARRAY_SIZE(exynos4xxx_iodesc));

    /* initialize device information early */
    exynos4_default_sdhci0();
    exynos4_default_sdhci1();
    exynos4_default_sdhci2();
    exynos4_default_sdhci3();

    s3c_adc_setname("samsung-adc-v3");

    s3c_fimc_setname(0, "exynos4-fimc");
    s3c_fimc_setname(1, "exynos4-fimc");
    s3c_fimc_setname(2, "exynos4-fimc");
    s3c_fimc_setname(3, "exynos4-fimc");

    s3c_sdhci_setname(0, "exynos4-sdhci");
    s3c_sdhci_setname(1, "exynos4-sdhci");
    s3c_sdhci_setname(2, "exynos4-sdhci");
    s3c_sdhci_setname(3, "exynos4-sdhci");

    /* The I2C bus controllers are directly compatible with s3c2440 */
    s3c_i2c0_setname("s3c2440-i2c");
    s3c_i2c1_setname("s3c2440-i2c");
    s3c_i2c2_setname("s3c2440-i2c");

    s5p_fb_setname(0, "exynos4-fb");
    s5p_hdmi_setname("exynos4-hdmi");
}

原始檔:arch/arm/mach-exynos/common.c

(2)s5p_fb_setname()

    該函式主要就是用於給s5p_device_fimd0這個全域性變數改名,詳見下面第5行:

static inline void s5p_fb_setname(int id, char *name)
{
    switch (id) {
#ifdef CONFIG_S5P_DEV_FIMD0
    case 0:
        s5p_device_fimd0.name = name;                                                                                                                                                                        
    break;
#endif
    default:
        printk(KERN_ERR "%s: invalid device id(%d)\n", __func__, id);
    break;
    }
} 

原始檔:arch/arm/plat-samsung/include/plat/fb-core.h 

4.2 匹配過程

5 總結

參考資料

相關推薦

Linux裝置驅動--LCD平臺裝置驅動tiny4412

1 環境與簡介     Host:Ubuntu14.04(64bit)     Target:Tiny4412     Kernel:linux-3.5.0 2 平臺裝置 2.1 宣告 extern struct platform_device s5p_device_fim

Linux裝置驅動--LCD平臺裝置驅動smdk2440

1 環境與簡介     Host:Ubuntu14.04(64bit)     Target:smdk2440     Kernel:linux-2.6.39.4     類似於《Linux裝置驅動--WDT平臺裝置與驅動》,本文再以LCD為例進行說明。本文的原始碼均來自L

Linux裝置驅動--LCD平臺裝置驅動s3c64xx

1 開發環境     Host:Ubuntu14.04     Target:s3c64xx     Kernel:linux-3.18.2 2 平臺裝置         關於裝置樹是如果被載入並解析成裝置節點的,詳見參考資料[1],本文重點分析如何利用裝置節點建立相

Linux裝置驅動--LCD平臺裝置驅動smdk6410

1 環境與簡介     Host:Ubuntu14.04(64bit)     Target:smdk6410     Kernel:linux-3.5.0     在《Linux裝置驅動--LCD平臺裝置與驅動(smdk2440)》中基於linux-2.6.39.4對LC

軟體測試中樁模組驅動模組的概念區別轉載,打樁

樁模組和驅動模組(以C語言為例):   很多人對樁模組和驅動模組的概念會搞不清楚,那麼下面來介紹這兩個概念:   模組結構例項圖:   假設現在專案組把任務分給了7個人,每個人負責實現一個模組。你負責的是B模組,你很優秀,第一個完成了編碼工作,現在需要開展單元測試工作,先分析結構圖:   1、由於

linux應用之vim的安裝配置centos

utf8 power scroll pbo gb2312 nco pla red vma 1.vim的安裝 #yum search vim //查看vim相關軟件信息 #yum install -y vim* //在線安裝vim 2.vim的配置 (1)~/.vimi

Linux下NFS伺服器的搭建配置

一、NFS服務簡介  NFS 就是 Network FileSystem 的縮寫,最早之前是由sun 這家公司所發展出來的。 它最大的功能就是可以透過網路,讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 (share files)。所以,你也可以簡單的將他看做是一個檔案伺服器 (file server

Linux中的Redis的下載安裝附圖

一,Redis下載         1,下載地址:http://redis.io/download         2,進入Redis官網首頁下載最新版進行. 二,安裝redis (在root許可權下操

平臺程式設計開發:Java雲平臺服務商一覽

因為Java語言的跨平臺性和高度靈活性,成為目前雲端計算平臺的主流開發語言;所以,這裡重點討論一下Java 雲平臺的比較情況。尤其是討論X5Cloud雲平臺與現有幾個Java雲平臺的聯絡和區別:      * App Engine (http://code.google.com/appengine/)    

linux驅動-7-平臺裝置驅動

[toc] --- ## 前言 區分**裝置驅動模型**和**平臺裝置驅動模型**。 **裝置驅動模型** 可以理解為 **匯流排、裝置、驅動**。 **平臺裝置驅動模型** 就是那些 Linux 核心管理沒有物理匯流排(*即是不需要特殊時序控制的裝置*)(*也是Linux核心沒有自動建立相應驅動匯流

Linux總線、設備驅動》USB設備發現機制

buffer 嵌入 void smo b- 嵌入式系統 root 顯示 ice 說明:本分析基於mstar801平臺Linux2.6.35.11內核,其他內核版本僅供參考。 一、程序在內核中的位置 1.usb host做為pci總線下的一個設備存在(嵌入式系統中有可能也會

Linux驅動平臺設備驅動模型簡析驅動分離分層概念的建立

技術 描述 rst 操作 mem iou 系統 簡單 reg Linux設備模型的目的:為內核建立一個統一的設備模型,從而有一個對系統結構的一般性抽象描述。換句話說,Linux設備模型提取了設備操作的共同屬性,進行抽象,並將這部分共同的屬性在內核中實現,而為需要新添加設備

Linux驅動學習筆記----------IIC框架流程

歷時一個月期末課程設計終於結束了!發現好多東西忘記了,iic流程也有些淡忘,有點慌,夜深人靜的時候就整理下吧!還有,杭州最近熱的我腦袋都不好用了! 關於iic: 1.是一種資料傳輸協議(spi,usb,sdio,uart…)

linux驅動篇之 driver_register 過程分析

linux驅動註冊過程分析--driver_register(一) 個人筆記,歡迎轉載,請註明出處,共同分享 共同進步  http://blog.csdn.net/richard_liujh/article/details/45825333 kernel版本3.10.1

Linux 驅動開發之核心模組開發 —— 核心模組編譯 Makefile 入門

一、模組的編譯  我們在前面核心編譯中驅動移植那塊,講到驅動編譯分為靜態編譯和動態編譯;靜態編譯即為將驅動直接編譯進核心,動態編譯即為將驅動編譯成模組。 而動態編譯又分為兩種: a -- 內部編譯        在核心原始碼目錄內編譯 b -- 外部編譯        在核

【翻譯】SklearnTensorFlow機器學習實用指南 ——第12章 裝置和伺服器上的分散式TensorFlow

在第 11 章,我們討論了幾種可以明顯加速訓練的技術:更好的權重初始化,批量標準化,複雜的優化器等等。 但是,即使採用了所有這些技術,在具有單個 CPU 的單臺機器上訓練大型神經網路可能需要幾天甚至幾周的時間。在本章中,我們將看到如何使用 TensorFlow 在多個裝置(C

LINUX系統服務管理Services---------第六天

rsync同步? ? ?虛擬機A? ? 1. 將防火墻狀態設置為trusted? 2.SELinux當前修改為permissive? 3.SELinux永久狀態修改為permissive? ? 4.清空Yum緩存,檢查Yum是否可用? ? 虛擬機B? ? 1. 將防火墻狀態設置為trusted? 2.SELi

LINUX系統服務管理Services---------第二天

根下常用的命令用途 自定義yum倉庫 ln創建軟連接 源碼包編譯安裝 主要用途/boot ? ? ? ? 存放系統引導必需的文件,包括內核、啟動配置/bin、/sbin ? 存放各種命令程序/dev ? ? ? ? ?存放硬盤、鍵盤、鼠標、光驅等各種設備文件/etc ? ? ? ? ?存放Li

LINUX系統服務管理Services---------第四天

dns服務器虛擬機A? ? 1. 將防火墻狀態設置為trusted? 2.SELinux當前修改為permissive? 3.SELinux永久狀態修改為permissive? ? 4.清空Yum緩存,檢查Yum是否可用? ? 虛擬機B? ? 1. 將防火墻狀態設置為trusted? 2.SELinux當前修

LINUX系統服務管理Services---------第五天

部署dhcp服務器 pxe網絡裝機服務器 虛擬機A? ? 1. 將防火墻狀態設置為trusted? 2.SELinux當前修改為permissive? 3.SELinux永久狀態修改為permissive? ? 4.清空Yum緩存,檢查Yum是否可用? ? 虛擬機B? ? 1. 將防火墻狀態設置為tr