❏ 站外平台:

在 Windows 世界中使用 Linux

| 2013-05-22 08:48      

简介: Linux 是互联网上大多数服务器首选的操作系统,而且现在越来越多地用作桌面操作系统。但是,在桌面上简单地迁移到 Linux,无法保证仍然可与您的工作或兴趣所需要的所有企业资源交互。本文探讨要与遗留 Microsoft Windows 文件和文件服务器交互,以及从桌面 Linux 系统使用新的网络硬件时,您需要执行的其他配置任务。

  每一年,Linux 新闻记者和爱好者都会公开讨论,下一年是否会成为 “Linux 桌面” 之年。尽管购买一台已在运行 Linux 的新机器或将现有的 Windows 系统迁移到 Linux 比以往更加容易,但简单地安装和启动 Linux 还不足以将其打造为日常使用的操作系统。您可能已开始在桌面上使用 Linux,但您使用新 Linux 系统的环境可能不那么现代化。大部分企业、中小型企业,以及小型办公室/家庭办公环境都拥有必须考虑的 Windows 相关需求。您可能还需要将仅在 Windows 平台上能得到有效支持的硬件用于 Linux 系统。所幸,这些问题已存在各种各样的解决方案。

访问共享的 Windows 文件系统

  访问共享的 Windows 文件系统可能是 Linux 系统用户最常见的业务需求。许多企业仍在使用 Windows 作为基础架构的核心,以支持企业邮件和日历系统(比如 Microsoft Exchange Server),以及通过导出的文件系统(一般称为 Windows 共享)来支持简单的文件和数据共享。

  Linux 提供了多种方式来访问 Windows 共享。具体选择哪种机制,依赖于您需要访问 Windows 共享上的数据的频率,以及您配置的 Linxu 系统是个人、单用户系统还是多个用户共享的系统。

从命令行访问 Windows 共享

  Samba Project(参见 参考资料) 是一个开源项目,支持 Linux、UNIX 和其他类似 UNIX 的操作系统与 Windows 互操作。大部分 Linux 发行版的存储库中都包含 Samba,而且一般通过安装和配置来支持 Linux 系统能够加入一个现有的 Windows 工作组或域并与其互操作,常常用作一个可供 Windows 系统使用的通用互联网文件系统 (Common Internet File System, CIFS) 文件服务器。Samba 4.x 安装还允许 Samba 服务器充当 Windows 域的一个活动目录域服务 (Active Directory Domain Service) 控制器和集成的域名系统 (Domain Name System)。

  尽管 Samba 服务器提供了一种优秀机制来从 Windows 系统提供 Linux 资源,使 Linux 系统可打印到 Windows 打印机,但如果您感兴趣的只是偶尔从 WIndows 共享检索文件,安装和配置 Samba 服务器可能会大材小用。Samba 客户端包 (samba-client) 包含多个专为这类偶尔交互所设计的实用程序,包括 smbclient 应用程序,该应用程序提供了一个交互式命令行接口 (CLI) 来远程访问 Windows 共享。

  如果不确定远程 Windows 服务器上提供的共享名称,则可使用 smbclient 应用程序查询一个服务器,在服务器的名称或 IP 地址后键入 -L 选项来列出该服务器上的可用资源,如 清单 1 中所示。


清单 1. 使用 smbclient 列出 Windows 服务器资源

$ smbclient -L win2008server
Enter wvh's password:
Domain=[WORDSMITHS]
OS=[Windows (R) Small Business Server 2008 6001 Service Pack 1]
Server=[Windows (R) Small Business Server 2008 6.0]

Sharename        Type      Comment
---------        ----      -------
Address           Disk      "Access to address objects"
ADMIN$            Disk      Remote Admin
Brother HL-2070N  Printer   Brother HL-2070N
C$                Disk      Default share
ExchangeOAB       Disk      OAB Distribution share
IPC$              IPC       Remote IPC
NETLOGON          Disk      Logon server share
print$            Disk      Printer Drivers
Public            Disk
RedirectedFolders Disk
Resources$        Disk      "Event logging files"
SYSVOL            Disk      Logon server share
[...]

  如上所示,smbclient 应用程序使用当前的 Linux 用户作为要在远程 Windows 服务器上验证的用户,并提示用户输入密码来访问远程服务器。如果 Windows 服务器上的登录名不同,则可使用 -U 选项指定要使用的登录名。

  确定希望连接到的共享的名称后,可使用 smbclient 应用程序连接到一个特定的共享,以检查或检索文件,如 清单 2 中所示。


清单 2. 使用 smbclient 从 Windows 共享中检索文件

$ smbclient //win2008server/Public
Enter wvh's password:
Domain=[WORDSMITHS]
OS=[Windows (R) Small Business Server 2008 6001 Service Pack 1]
Server=[Windows (R) Small Business Server 2008 6.0]
smb: \> cd Software\Linux
smb: \Software\Linux\> ls
  .                            D        0  Sun Jan 27 23:40:42 2013
  ..                           D        0  Sun Jan 27 23:40:42 2013
  acl82express-linux-x86.bz2   A 44960643  Sun Jan 27 23:40:24 2013
  alien_8.87.tar.gz            A    64336  Sun Jan 27 23:39:24 2013
  crossover-12.1.0-1.i386.rpm  A 47233108  Sun Jan 27 23:39:14 2013
  [...]
		59997 blocks of size 1048576. 32474 blocks available
smb: \Software\Linux\> get softmaker-office-2012-674.x86_64.rpm
getting file \Software\Linux\softmaker-office-2012-674.x86_64.rpm \
        of size 147058656 as softmaker-office-2012-674.x86_64.rpm \
        (16345.5 KiloBytes/sec) (average 16345.5 KiloBytes/sec)
smb: \Software\Linux\> quit

  清单 2 中的示例表明,smbclient 提供了一个 CLI 来连接远程服务器。此接口支持熟悉的 Linux 命令,比如 cd(用于在远程服务器上的目录中移动)和 ls(用于列出给定目录的内容)。找到希望检索的文件后,可使用 get 命令检索该文件,将其存储在您希望从中执行 smbclient 的目录中。要将检索到的文件存储在另一个目录中,可使用 lcd(本地更改目录)命令来更改 smbclient 视为当前目录的目录。

  如果仅需要偶尔访问 Windows 共享中的一个或多个文件,且并不关心使用文件管理器(比如 Gigolo、GNOME Nautilus、KDE Dolphin、Konqueror 或 Thunar)来以图形方式浏览 Windows 共享,那么可以放心地使用 smbclient 应用程序。smbclient 应用程序使一个远程共享可在该应用程序的上下文中使用,而不是在您的整个系统中使用。要浏览 Windows 共享并将其提供给您选择的应用程序,则必须采用挂载本地文件系统的相同方式将该共享挂载到您的系统上。

永久挂载 Windows 共享

  可将 Windows 共享手动挂载在系统上的目录上,方法是以 root 用户身份使用 mount 命令或使用 sudo 应用程序,如 清单 3 中所示。mount 命令的 -t 选项及其 cifs 参数指定您挂载的文件系统类型,而且在此情况下,会导致一般性的 mount 命令调用 /bin/mount.cifs 命令。使用您系统的 package-management 命令安装 cifs-utils 程序包,该程序包是 Samba 套件的一部分。


清单 3. 挂载并列出手动挂载的 Windows 共享的内容

# mkdir /mnt/PUBLIC
# mount -t cifs //winserver2008/Public /mnt/PUBLIC
Password:
# ls -l /mnt/PUBLIC
total 1
drwxr-xr-x. 1 root root   0 Jan 27 16:19 Desktop
-rwxr-xr-x. 1 root root 174 Jan 19  2008 desktop.ini
drwxr-xr-x. 1 root root   0 Jan 19  2008 Documents
drwxr-xr-x. 1 root root   0 Jan 27 23:38 Downloads
drwxr-xr-x. 1 root root   0 Jan 19  2008 Favorites
drwxr-xr-x. 1 root root   0 Jan 19  2008 Music
drwxr-xr-x. 1 root root   0 Jan 19  2008 Pictures
drwxr-xr-x. 1 root root   0 Jan 27 23:37 Software
drwxr-xr-x. 1 root root   0 Jan 19  2008 Videos

  清单 3 中的示例 mount 命令使远程共享可通过 /mnt/PUBLIC 目录使用,但具有一些缺点:

  • 简单地将此命令添加到 /etc/fstab 文件中无法自动挂载该共享,因为您在执行 mount 命令后会被提示输入密码。如果尚未确定要用于验证的特定用户,就必须为用于执行 su 或 sudo 命令的用户提供远程 Windows 密码。
  • 以 root 用户身份执行 mount 命令,将共享挂载为 root 用户所有的资源。如果仅希望读取该共享中的文件,尽管可通过此方式挂载共享,但您只能以 root 用户身份向挂载的共享写入数据,这通常很不方便。

  要解决这些问题,可在执行 mount 命令时指定特殊的 CIFS 相关选项,以挂载一个 CIFS 共享。这些选项包括:

  • username= - 指定将用于对远程共享进行验证的用户。可将此选项缩写为 user=。
  • password= - 指定将对远程共享进行验证的用户(您将该用户指定为将使用的用户)的密码。
  • uid= - 指定将拥有所挂载共享中的文件和目录的用户 ID (UID)。如果在 Linux 桌面上使用密码文件身份验证方式,则可使用grep命令在系统的密码文件中搜索您的登录名,以找到您的 UID,如以下示例中所示。
    $ grep wvh /etc/passwd
    wvh:x:500:500:William von Hagen:/home/wvh:/bin/bash
    

    UID 是密码文件条目中的第三个字段(在本例中为 efficiently500)。

  • gid= - 指定将拥有所挂载共享中的文件和目录的用户的组 ID (GID)。如果在 Linux 桌面上使用密码文件身份验证方式,则可使用 grep 命令在系统的密码文件中搜索您的登录名,以找到您的 GID。GID 是密码文件条目中的第四个字段,如上面的示例中所示。

  下面给出了一个使用这些选项的示例 mount 命令,出于格式化用途将该命令分为两行:

# mount -t cifs -o username=wvh,password=MYPASSWORD,uid=500,gid=500 \
     //win2008server/Public /mnt/PUBLIC

 

  可从 CLI 使用一条类似这样的命令或向 /etc/fstab 文件添加一个类似条目,以在启动系统时自动挂载该文件系统。以下是与前面的 mount 等效的 /etc/fstab 文件条目:

//win2008server/Public /mnt/PUBLIC cifs \
    username=wvh,password=MYPASSWORD,uid=500,gid=500 0 0

 

  此命令将在 /etc/fstab 文件中显示为一行,但在本例中出于格式化用途而分为多行。遗憾的是,此命令具有明显的安全问题,因为您必须在 /etc/fstab 条目中公开密码,而文件 /etc/fstab 通常可供系统上的每个用户读取。要解决此问题,可使用 credentials 挂载选项将用户名和密码放在指定的文本文件中。例如:

//win2008server/Public /mnt/PUBLIC cifs \
    credentials=/etc/cred.wvh,uid=500,gid=500 0 0

 

  一个 credentials 文件的格式如下所示:

username=wvh
password=MYPASSWORD

 

  然后可使用以下命令,使 /etc/cred.wvh 文件仅可供 root 用户(必须以其身份执行 mount 命令的用户)读取:

# chmod 600 /etc/cred.wvh

 

  使用 credentials 挂载选项,可在每次挂载文件系统时必须指定用户名和密码,与不向每个能访问系统的人公开该信息之间实现很好的平衡。

使用 sudo 按需挂载 Windows 共享

  如果只希望偶尔挂载一个共享,可将 noauto 选项添加到上一节示例中所示的挂载选项列表中。此选项可在每次重新启动系统时避免自动挂载指定的 Windows 共享。然后,在希望访问该共享中的文件时,必须从命令行挂载该共享。

  必须始终以 root 用户身份执行 mount 命令,这通常意味着任何希望挂载该共享的人都必须知道该系统上的 root 密码。如果不希望在每次重新启动系统时自动挂载该共享,且希望限制需要知道 root 密码的用户(或只是限制必须使用该命令的次数),则可使用 sudo 命令使一个普通用户能够挂载该共享。为此,使用 visudo 命令编辑 /etc/sudoers 文件,这会将一个以下格式的条目添加到 /etc/sudoers 文件的末尾。

wvh  ALL=/bin/mount /mnt/PUBLIC, /bin/umount /mnt/PUBLIC

 

  此条目使用户 wvh 能够使用 sudo 命令执行 /bin/mount /mnt/PUBLIC 和 /bin/umount /mnt/PUBLIC 命令,但不允许该用户使用 mount 或 umount 命令挂载或卸载任何其他文件系统。如果希望给定系统上的所有用户都能够挂载或卸载 /mnt/PUBLIC 共享,可将用户名 wvh 替换为一般性的 %users 表达式。在此情况下,请确保用户希望更新的文件可由关联的 /etc/fstab 条目中的 anongid 所标识的组写入数据,并且所有用户都属于这个组。

  备注:另一种挂载 Windows 共享的方法是使用一个支持 CIFS 文件系统的 File system in User Space (FUSE) 程序包。smbnetfs 和 fusesmb 程序包很流行,但已很久未更新了,且需要大量配置才能使它们正常工作。(参见 参考资料 获取这些项目的链接。)

Linux 系统上使用 Windows 文本文件

  大部分人都认为文本文件在每个计算机系统上都是一种标准的文件类型,因此可安全地用于配置文件、可在任何操作系统上读取的便笺等。不幸的是, 情况不是这样的。尽管 Windows 和 Linux 系统上的文本文件使用了相同的字符集,但用于标识文本的行尾的字符却不同。Windows 和 DOS 系统使用两个字符来标识文本的行尾:一个回车字符 (Ctrl-M) 和一个换行符 (Ctrl-J)。Linux 和所有类似 UNIX 的系统都使用单个字符来标识文本的行尾:换行符。如果使用 Linux 实用程序打开在 Windows 系统上创建的文本文件,将会在每行末尾看到一个 Ctrl-M 字符,该字符常常显示为 ^M 或 \r。这个额外的字符可能会让需要读取这类文件的 Linux 实用程序难以理解。

  Linux 提供了两个命令来自动更改文本文件中的行结束符。dos2unix 命令(位于大部分 Linux 发行版中都提供的一个具有相同名称的程序包中)自动转换在 Windows(或 DOS)中创建的文本文件,以使用 Linux 和 UNIX 约定来标记文本的行尾,这会删除所有的 Ctrl-M 字符。一个同名的程序包中有一个等效的程序 unix2dos,可将 Linux 和 UNIX 文本文件转换为 Windows 格式的文本文件。

  如果您是 Emacs 文本编辑器的爱好者,可以将 清单 4 中所示的 Emacs 命令添加到 Emacs 配置文件 (~/.emacs) 中。然后就能够执行 dos-file、mac-file 和 unix-file 命令,将一个文本缓冲区的上下文转换为使用该命令指定的文本文件格式。


清单 4. 更改文本文件类型的 Emacs 命令

;
; Functions for changing buffer modes
;
(defun dos-file ()
   "Change the current buffer to Latin 1 with DOS line-ends."
   (interactive)
   (set-buffer-file-coding-system 'iso-latin-1-dos t))

(defun mac-file ()
   "Change the current buffer to Latin 1 with Mac line-ends."
   (interactive)
   (set-buffer-file-coding-system 'iso-latin-1-mac t))

(defun unix-file ()
   "Change the current buffer to Latin 1 with Unix line-ends."
   (interactive)
   (set-buffer-file-coding-system 'iso-latin-1-unix t))

  备注:清单 4 中所示的样例 Emacs 命令假设您使用的是 Latin 1 字符集。如果在文本文件中使用另一个字符集,则将需要修改这些命令以反映该字符集。

使用针对 Windows 设计的网络设备

  尽管 Linux 提供了大多数人需要在其计算机上使用的软件,但对于任何操作系统而言,兼容最新的网络硬件都是一个问题。现在的 Linux 发行版包含大量网络硬件的设备驱动程序,但针对新网络协议和相关硬件的 Linux 驱动程序能够可能跟不上形势,尤其是在无线领域。如果 Linux 机器在系统启动时无法识别或使用新的网络设备,则表明该设备的驱动程序不可用,或者这些设备驱动程序需要的一些其他资源(比如特定于硬件的固件)不可用。 在这些情况下,友好的邻域搜索引擎始终应是您首要考虑的办法:具有同一个新发布的硬件的其他人可能已能在 Linux 系统上正确运行这个搜索引擎。(参见 参考资料 获取多个站点的链接,这些站点提供了 Linux 支持的硬件信息和人们使用该硬件的经验。)

  如果无法为新发布的网络硬件找到内置的 Linux 驱动程序,大多数新硬件都附带了一张 CD,其中包含使支持的操作系统能够高效使用该硬件的特殊驱动程序。不幸的是,这些驱动程序 CD 很少包含专为 Linux 系统设计的驱动程序。在一些情况下,特定硬件的 Linux 驱动程序可从硬件供应商的网站获得。在此情况下,供应商通常还会提供安装和配置说明。许多硬件供应商还提供了在线论坛,可在其中提出问题,或讨论您遇到的 任何安装或配置问题。

  如果您正在使用或试用的 Linux 发行版不支持您的桌面或笔记本电脑上的特定网络硬件,而且供应商未提供 Linux 驱动程序,也不是毫无办法。NDISwrapper 程序包使您能够在 Linux 系统上使用大部分 Windows XP 网络设备驱动程序。网络驱动程序接口规范 (Network Driver Interface Specification, NDIS) 是一个针对网络接口卡 (NIC) 的标准应用程序编程接口。NDISwrapper 程序包不支持 NDIS (V6),这是 Windows 8、Windows 7 和 Windows Vista 使用的驱动程序格式,所以您只能将 NDISwrapper 程序包用于 Windows XP 驱动程序。如果使用 64 位 Linux 系统,则只能使用 64 位 Windows XP 驱动程序;32 位 Windows XP 驱动程序不适用于 64 位系统。

  在系统上安装 ndiswrapper-utils 程序包(在一些 Linux 发行版上,可能还需要安装 ndiswrapper-common 程序包)后,可执行以下步骤来安装和使用 Windows XP NDIS 驱动程序:

  1. 检查是否已加载相同硬件的任何 Linux 驱动程序,如果已加载,则使用 rmmod DRIVER 命令卸载。
  2. 找到想要使用的驱动程序的 .inf 和 .sys 文件。

    如果您的硬件的 Windows XP 驱动程序已在一个自解压 .exe 文件中提供,通常可使用 Linux unzip 实用程序来提取。如果在一个 .cab 文件中提供,则可使用 Linux cabextract 实用程序提取。如果在 InstallShield 文件中提供,可使用 unshield 实用程序提取。(在大部分 Linux 发行版中,所有这些实用程序都在存储库中的同名程序包中。)在最糟糕的情况下,可将驱动程序安装在 Windows 计算机上,然后再将它们复制到 Linux 系统上。

  3. 以 root 用户身份使用以下这样的命令或使用sudo命令安装驱动程序:
    ndiswrapper -i DRIVER.inf
    
  4. 以 root 用户身份运行以下命令,或使用 sudo 命令验证 Windows 驱动程序是否已正确安装:
    ndiswrapper -l
    
  5. 以 root 用户身份运行以下命令,或使用 sudo 命令加载 NDISwrapper 可加载内核模块:
    modprobe ndiswrapper
    
  6. 以 root 用户身份运行以下命令,或使用 sudo 命令,为您的网络接口创建一个模块配置文件别名:
    ndiswrapper -m
    

    此条目将类似于以下形式:

    alias wlan0 ndiswrapper
    

    确保与 ndiswrapper 内核模块关联的以太网接口名称与您希望将其用于的接口匹配,如 ifconfig -a 命令的输出所示。

  此刻,新网络硬件应可从 Linux 系统中看到,而且您应能够使用标准的 Linux 网络配置实用程序(比如 /sbin/ifconfig),或者配置和使用关联的 NIC。

  如果希望为也拥有原生 Linux 驱动程序的硬件使用 ndiswrapper 内核模块和 Windows 驱动程序,则将需要创建一个名称类似于 /etc/modprobe.d/blacklist-DRIVER.conf 的文件,其中包含一个类似 blacklist DRIVER 的条目,以确保您下次重新启动系统时不会加载 Linux 驱动程序。

  如果偏爱图形应用程序的简单性,则有多个选项可用于 NDISwrapper 程序包。图 1 显示了 ndisgtk 应用程序,可从同名的程序包中将该应用程序安装到系统上。


图 1. 使用 ndisgtk 添加一个 Windows 驱动程序
该图展示了如何使用 ndisgtk 添加一个 Windows 驱动程序,按钮包括 “Install New Driver”、“Remove Driver”、“Configure Network” 和 “Close”。

  NDISwrapper 程序包不但有用,而且给人印象深刻。即使 Linux 为您的硬件提供了原生驱动程序,您也可能会发现,使用 Windows 驱动程序可提供比使用内置的 Linux 等效驱动程序更高的性能。

结束语

  Linux 是一个免费且强大的操作系统,而且(目前)还易于使用。在桌面或便携式电脑上使用 Linux,可带来比 Windows 等操作系统高得多的性能,这也是为旧计算机注入新活力的一种不错的方式。但是,与基于 Windows 的服务器、某些类型的 Windows 文件或面向 Windows 的网络硬件互操作,这仍然是许多企业和家庭环境的需求。Linux 提供了广泛的软件和技术选择,支持您与这些系统和硬件互操作,从而从桌面 Linux 系统为您提供了两全其美的办法。

参考资料

学习

  • Samba Project 为 Linux、UNIX 和类似 UNIX 的操作系统提供了一个 Windows 互操作性应用程序套件。
  • Linux 硬件兼容性列表 提供了以下链接:已知与特定 Linux 发行版良好兼容的硬件列表;打印机、扫描仪、视频卡、音频硬件列表;一般而言已知与 Linux 良好兼容的数码相机等。

  • Linux HCL 是另一个不错的站点,提供了某些硬件在 Linux 系统上的运行情况的信息。

  • Linux on Laptops 站点提供了来自用户的详细信息,其中包括关于不同版本的 Linux 在众多笔记本电脑和上网本(按供应商组织)上的运行情况。

获得产品和技术

  • 存在多个针对 Linux 和 UNIX 环境的图形文件管理器。本文中提及的示例包括:
    • Gigolo。此图形应用程序简化了对本地和远程文件系统的管理和浏览,而且最初是为 Xfce 桌面环境开发的应用程序。根据 GIMP Toolkit (GTK),Gigolo 可用在所有使用 GNOME 桌面或已安装 GTK 的 Linux 发行版上。
    • Nautilus。这是使用 GNOME 桌面的计算机系统上的默认图形文件管理器。
    • Dolphin。这是使用 KDE 桌面的 Linux 系统上的默认图形文件管理器。
    • Konqueror。这是一个用于使用 KDE 桌面的 Linux 系统的功能极其强大的图形文件管理器。Konqueror 多年来一直是默认的 KDE 文件管理器,且支持其他针对 KDE 桌面的文件管理器中未提供的许多功能。
    • Thunar。这个用于 Linux 系统的图形文件管理器最初是为 Xfce 桌面环境开发的。
  • dos2unix 和 unix2dos 是在 Linux 和 UNIX、DOS 以及 Macintosh 系统上使用的转换文本文件格式的应用程序。

  • Emacs 是一个真正用于现代计算机系统的文本编辑器。

  • Ndisgtk 是一个与命令行 NDISwrapper 应用程序交互的图形应用程序。

  • 使用户能够挂载 Windows 共享而无需 root 特权的 FUSE 实现包括 fusesmbsmbnetfs 项目。这两个项目都需要 libsmbclient 库,该库已包含在 samba-client 程序包中。这两个项目都很长时间未更新了,这要么表明它们 “仍能发挥作用”,要么表明它们已不再被广泛使用。

  • 参阅 SourceForge 上的 NDISwrapper Project 页面,获取最新的 NDISwrapper 版本或使用 NDISwrapper 程序包的详细信息。

  • 访问 Mono Project 站点,了解使用 Mono 在 Linux 系统上运行 Microsoft .NET 代码的信息。

  • Wine Project 提供的软件支持在 Linux 计算机上运行 Windows 软件。要查看您感兴趣的软件能否在 Wine 下运行,可查阅 Wine AppDB

  • 查阅 CodeWeavers,获取 Wine 的一个商用支持版本。查看他们的 What Runs? 页面,了解已知与 CrossOver 兼容的 Windows 软件的信息。

  • 考虑使用 VirtualBox 在虚拟机中运行 Windows。

关于作者

  William von Hagen 担任作家和 UNIX 系统管理员已经超过 20 年,并从 1993 年开始成为 Linux 爱好者。Bill 是一些图书的作者或合著者,涉及的主题包括 Ubuntu Linux、Xen Virtualization、GNU Compiler Collection (GCC)、SuSE Linux、Mac OS X、Linux 文件系统和 SGML。他还为 Linux 和 Mac OS X 出版物和网站撰写了许多文章。

来自:http://www.ibm.com/developerworks/cn/linux/l-linuxdesktop/index.html



最新评论


返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。