虚拟化之lxc

时间:2022-09-18 10:43:20

LXC 中文名称就是 Linux 容器工具,容器可以提供轻量级的虚拟化,以便隔离进程和资源,使用 LXC 的优点就是不需要安装太多的软件包,使用过程也不会占用太多的资源,本文循序渐进地介绍LXC的建立和管理方法以及虚拟网络接口的设置方法。

  LXC 在资源管理方面依赖 Linux 内核的 cgroups (Control Groups) 系统,cgroups 系统是 Linux 内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。它最初由 Google 的工程师提出,后来被整合进 Linux 内核。cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段。LXC 目前已经进入 Linux 内核,这意味着 LXC 技术将是目前最有竞争力的轻量级虚拟容器技术。

  1、搭建第一个 LXC 虚拟计算机

  #yum install lxc*

  2、安装软件包后要检查 Linux 发行版的内核对 LXC 的支持情况,可以使用下面命令

  #lxc-checkconfig

  #lxc-checkconfig 命令检查之后如果所有项目显示“enabled”表示可以直接使用 LXC

  3、建立一个 fedora Server LXC 虚拟计算机系统

  #lxc-create -t fedora -n testA

  #这里使用的是fedora模板,模板文件保存在/usr/lib/lxc/templates/目录

  上面命令完成后, 会在 /var/lib/lxc 目录中, 产生虚拟计算机testA

  4、检查创建的虚拟机系统

  #tree -L 2 /var/lib/lxc/

  5、启动 LXC 虚拟计算机

  # lxc-start -n testA

  确认账号和密码后登录虚拟计算机

  6、列出当前系统所有的容器

  # lxc-ls

  7、使用 console 登入容器

  #lxc-console -n testA –t 3

  8、停止运行一个容器

  # lxc-stop -n testA

  9、获取一个容器的状态

  # lxc-info -n ol6ctr1

  10、把一个容器销毁

  # lxc-destroy -n testA1

  11、复制一个容器

  # lxc-clone -o testA -n ol6ctr2

  12、暂停或恢复一个容器

  # lxc-freeze -n testA

  # lxc-unfreeze -n testA

  13、修改 LXC 网络接口

  # vi /etc/default/lxc

  #用户修改后要重新启动网络服务

  #service lxc-net restart

  上面就是Linux系统中安装部署LXC的方法介绍了,LXC目前已进入Linux内核,为Linux系统搭建LXC是很有必要的,如果你想要安装LXC,不妨来了解下吧。

到底该不该选择LXC(Linux Container)技术?

 最近使用Container构建云平台的企业越来越多,其实Container并不是新技术,OpenVZ、Linux-VServer、FreeBSD jails、Solaris Containers都是Container技术的实现,随着Paas的发展,Container技术受到更多的重视。那么在进行虚拟化技术选择时,到底是该如何选择呢?

首先,什么是虚拟化?

虚拟化是指在同一台物理服务器上模拟多台虚拟机的能力,且每台虚拟机在逻辑上拥有独立的CPU、内存、硬盘和网络接口等。虚拟化可以提高硬件资源的利用率,使多个应用能隔离的运行在同一台物理机上。虚拟化分为硬件层面的虚拟化和软件层面的虚拟化。

什么是硬件虚拟化?

一种对计算机或操作系统的虚拟,对用户隐藏了真实的计算机硬件,表现出另一个抽象计算平台。硬件虚拟化通过模拟硬件的方式来获得真实计算机的环境,可以运行一个完整的操作系统。在硬件虚拟化中,又有Full Virtualization、Partial Virtualization和Paravirtualization等不同的实现方式。

在硬件虚拟化的层面,现代虚拟化技术通常是全虚拟和半虚拟的混合体。常见的虚拟化技术例如VMWare、Xen和KVM都同时支持全虚拟化和半虚拟化。硬件虚拟化方式提供的虚拟机,都独立的运行着一个完整的操作系统,这样在同一台物理宿主机上存在大量相同或者相似的进程和内存页,从而导致较大的性能损耗(比如:宿主机操作系统是Centos,使用KVM生成的多个虚拟机,且在每个虚拟机中都运行Windows操作系统和相同的QQ程序,这样宿主机的性能必然产生较大损耗)。因此,硬件虚拟化也被称为重量级虚拟化,在同一宿主机上能够同时运行的虚拟机数量相当有限。

什么是软件层面的虚拟化?

指在同物理服务器上提供多个隔离的虚拟运行环境,也被称为容器技术。在软件虚拟化的层面,同一宿主机上的所有虚拟机(又称Container)共享宿主机的操作系统实例,不存在由于运行多个操作系统实例所造成的性能损耗(比如:宿主机的操作系统为Centos,通过软件虚拟化技术生成多个Container,且每个Container都运行着QQ程序,由于它们共享同一个宿主机Centos操作系统,所有Container中QQ程序的进程在Centos中只有一个)。因此,软件虚拟化也被称为轻量级虚拟化,在同一宿主机上能够同时运行的虚拟运行环境数量比较宽松。以Solaris操作系统上的Container为例,一个Solaris操作系统的实例理论上可以支持多达8000个Container(实际能够运行的Container数量取决于系统资源和负载)。与此类似,Linux操作系统上的LXC也可以轻松地在同一宿主机上同时支持数量可观的虚拟运行环境。

LXC(Linux Container)的优势有哪些?

(1)与宿主机使用同一个内核,性能损耗小;

(2)不需要指令级模拟;

(3)不需要即时(Just-in-time)编译;

(4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;

(5)避免了准虚拟化和系统调用替换中的复杂性;

(6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

选择时考虑哪些因素?

在虚拟化这个领域,国内外的各大公司对硬件虚拟化的兴趣较大,在研发和生产环境中也大都采用硬件虚拟化技术。但是近段时间国内外很多云计算厂商纷纷开始尝试使用LXC替代KVM/XEN等硬件虚拟化技术以获得更好的性能。至于在实际的应用场景中到底应该选择硬件虚拟化还是软件虚拟化,需要从以下方面考虑。灵活性、易管理,可靠性、稳定性、性能考虑。硬件虚拟化更灵活、易管理,硬件虚拟化具有天生的迁移优势。软件虚拟化则有更高性能,更加节省资源,对于一些小的网站性能可以提升上千倍,在没有用户访问的时候,可以关闭LXC,从而节省资源。在有用户访问的时候,可以快速启动,但缺点是迁移成本高,学习成本高。而且,目前来看LXC仍属于小众路线。

因此,在选择上还需要根据自身的业务和公司的战略去确定使用哪种虚拟化技术。比如京东,在公有云方面采用Openstack + KVM硬件虚拟化技术;但在PaaS层和私有云方面,则采用了Openstack + LXC的方式进行实现。让彼此的优势互补,以达到最佳的运行效果。

lxc介绍: http://www.ibm.com/developerworks/cn/linux/l-lxc-containers/

    容器是一种轻量级的虚拟化技术,与qemu/kvm、VMware、Xen等完全的虚拟化方案相比,LXC更像是加强的“chroot”,因为LXC不但没有没有对硬件设备进行仿真,而且可以与主机共享一模一样的操作系统,所以LXC与solaris的zones和BSD的jails相比,更具优势。

容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制。此外,也避免了半虚拟化(paravirtualization)和系统调用替换中的复杂性。

通过提供一种创建和进入容器的方式,操作系统让应用程序就像在独立的机器上运行一样,但又能共享很多底层的资源。

虚拟机的好处在于可以上下扩展,可控的计算资源,安全隔离,并可以通过API进行部署;但其缺点在于,每一台虚拟机都消耗了一部分资源用于运转一个完整的操作系统。所以,另一种方式更适合一个云平台,就是Linux Containers。

Container并不是新技术。虽然Container能提升资源利用率,但迁移成本是很高的,包括工程师的学习成本。

    目前,有两个比较方便的管理容器的用户空间的工具:libvirt和lxc。libvirt通过"lxc:///"像管理其他虚拟机驱动一样管理lxc虚拟机。另一个是与libvirt完全独立的LXC,它定义了一些列的命令,可以更灵活的管理和使用lxc。

虚拟化的类型
XEN和KVM实现了真正的虚拟化方案;LXC确切来说应该是资源隔离(namespace),并不能提供完整的物理隔离功能。
XEN虚拟化是相对于KVM来说更加成熟的虚拟化方案,像AWS、Azure等公有云都是使用的XEN作为虚拟化方案;而随着最近几年KVM的发展以及KVM较好的性能,国内的部分虚拟化厂商开始选择KVM作为新的虚拟化方案,像百度、Intel中国、阿里云等开始逐步向KVM迁移。
LXC通过资源隔离和命名空间实现了伪虚拟化功能,由于LXC较高的性能和不彻底的隔离,越来越多的应用到私有云上。 虚拟化性能分析(XEN/KVM/LXC):http://blog.chinaunix.net/uid-20662820-id-4514947.html
三种虚拟化性能比较 LXC>>KVM>>XEN
由于LXC使用cgroup机制,其性能损坏基本为0。
三种虚拟化隔离比较 XEN>>KVM>>LXC
LXC只能虚拟化linux。
三种虚拟化内存利用率 LXC>>KVM>>XEN
由于LXC共用内核,内存利用率最高;其他两种方案每个虚机都需要单独的操作系统占用一部分内存空间。

Linux Container容器是一种内核虚拟化技术,简称LXC,是一种轻量级的虚拟化手段

安装lxc,c7.2环境下
yum install epel-release
yum install lxc

Installing:
 lxc                                x86_64                     1.0.8-1.el7                        epel                     140 k
Installing for dependencies:
 libseccomp                         x86_64                     2.2.1-1.el7                        base                      49 k
 lua-alt-getopt                     noarch                     0.7.0-4.el7                        epel                     7.4 k
 lua-filesystem                     x86_64                     1.6.2-2.el7                        epel                      28 k
 lua-lxc                            x86_64                     1.0.8-1.el7                        epel                      17 k
 lxc-libs                           x86_64                     1.0.8-1.el7                        epel                     271 k
 rsync                              x86_64                     3.0.9-17.el7                       base                     360 k

yum install lxc lxc-templates

[root@1st-kvm templates]# pwd
/usr/share/lxc/templates
[root@1st-kvm templates]# ll
total 340
-rwxr-xr-x. 1 root root 10557 Nov 15  2015 lxc-alpine
-rwxr-xr-x. 1 root root 13534 Nov 15  2015 lxc-altlinux
-rwxr-xr-x. 1 root root 10556 Nov 15  2015 lxc-archlinux
-rwxr-xr-x. 1 root root  9878 Nov 15  2015 lxc-busybox
-rwxr-xr-x. 1 root root 29149 Nov 15  2015 lxc-centos
-rwxr-xr-x. 1 root root 10486 Nov 15  2015 lxc-cirros
-rwxr-xr-x. 1 root root 17354 Nov 15  2015 lxc-debian
-rwxr-xr-x. 1 root root 17757 Nov 15  2015 lxc-download
-rwxr-xr-x. 1 root root 49319 Nov 15  2015 lxc-fedora
-rwxr-xr-x. 1 root root 28253 Nov 15  2015 lxc-gentoo
-rwxr-xr-x. 1 root root 13962 Nov 15  2015 lxc-openmandriva
-rwxr-xr-x. 1 root root 14046 Nov 15  2015 lxc-opensuse
-rwxr-xr-x. 1 root root 35540 Nov 15  2015 lxc-oracle
-rwxr-xr-x. 1 root root 11868 Nov 15  2015 lxc-plamo
-rwxr-xr-x. 1 root root  6851 Nov 15  2015 lxc-sshd
-rwxr-xr-x. 1 root root 23494 Nov 15  2015 lxc-ubuntu
-rwxr-xr-x. 1 root root 11349 Nov 15  2015 lxc-ubuntu-cloud

命令检查之后如果所有项目显示“enabled”表示可以直接使用 LXC
lxc-checkconfig

创建一个容器,下载与安装,大概花了半小时。
lxc-create -n testA -t fedora

Container rootfs and config have been created.
Edit the config file to check/enable networking setup. You have successfully built a Fedora container and cache. This cache may
be used to create future containers of various revisions. The directory
/var/cache/lxc/fedora/x86_64/bootstrap contains a bootstrap
which may no longer needed and can be removed. A LiveOS directory exists at /var/cache/lxc/fedora/x86_64/LiveOS.
This is only used in the creation of the bootstrap run-time-environment
and may be removed. The temporary root password is stored in: '/var/lib/lxc/testA/tmp_root_pass' The root password is set up as expired and will require it to be changed
at first login, which you should do as soon as possible. If you lose the
root password or wish to change it without starting the container, you
can change it from the host by running the following command (which will
also reset the expired flag): chroot /var/lib/lxc/testA/rootfs passwd

下面二选一,要么使用预设的密码,或者自己直接改一个
[root@1st-kvm templates]# cat /var/lib/lxc/testA/tmp_root_pass
Root-testA-38xUoG
chroot /var/lib/lxc/testA/rootfs passwd

yum install bridge-utils
brctl addbr br0
brctl addif br0 eno1
ip addr del 192.168.10.101/24 dev eno1
ip addr add 192.168.10.101/24 dev br0
ip link set br0 up

如果没有做以上的br0操作的话,启动时会报错
[root@1st-kvm ~]# lxc-start -n testA

lxc-start: conf.c: instantiate_veth: 3105 failed to attach 'vethJPPDLN' to the bridge 'virbr0': No such device
lxc-start: conf.c: lxc_create_network: 3388 failed to create netdev
lxc-start: start.c: lxc_spawn: 841 failed to create the network
lxc-start: start.c: __lxc_start: 1100 failed to spawn 'testA'
lxc-start: lxc_start.c: main: 341 The container failed to start.
lxc-start: lxc_start.c: main: 345 Additional information can be obtained by setting the --logfile and --logpriority options.

man lxc.container.conf

[root@1st-kvm lxc]#  cat /etc/lxc/default.conf
lxc.network.type = veth
lxc.network.link = virbr0
lxc.network.flags = up

下面这个配置文件优先于上面那个

cat /var/lib/lxc/testA/config

这个配置文件基本不用动,只需要在宿主机上创建一个虚拟网卡br0即可

lxc.utsname = testA
lxc.network.type = veth  这是一对,一侧赋给容器,一侧附加到一个桥上(由lxc.network.link指定的)
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0  这是veth容器上的网卡名称          eth0@if13:
lxc.network.veth.pair = v-testA-e0  这是veth宿主机上的网卡名称  v-testA-e0@if12
lxc.network.hwaddr = 4a:49:43:49:79:bf
lxc.network.ipv4 = 192.168.10.67/24 255.255.255.0
lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3597

[root@1st-kvm ~]# lxc-start -n testA

systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization lxc.
Detected architecture x86-64. Welcome to Fedora 22 (Twenty Two)! Set hostname to <testA>.
Initializing machine ID from random generator.

[root@1st-kvm ~]# lxc-ls
testA

[root@1st-kvm ~]# lxc-info --name testA
Name:           testA
State:          RUNNING
PID:            3338
IP:             192.168.10.115
IP:             192.168.10.76
CPU use:        0.09 seconds
BlkIO use:      0 bytes
Memory use:     1.29 MiB
KMem use:       0 bytes
Link:           vethH044VE
 TX bytes:      1.38 KiB
 RX bytes:      9.35 KiB
 Total bytes:   10.73 KiB

[root@1st-kvm testA]# lxc-console -n testA -t 3
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

lxc使用心得

环境

[root@localhost journal]# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
[root@localhost journal]# rpm -qa|grep lxc
lxc-templates-1.0.8-1.el7.x86_64
lxc-libs-1.0.8-1.el7.x86_64
lua-lxc-1.0.8-1.el7.x86_64
lxc-1.0.8-1.el7.x86_64 安装
yum install epel-release
yum install lxc lxc-templates
lxc-checkconfig
lxc-create -n wo -t centos
sed -i 's/virbr0/br0/' /var/lib/lxc/wo/config
chroot /var/lib/lxc/wo/rootfs passwd
lxc-start -n wo

lxc-create -n f -t fedora也很慢,花费了2小时
运行了两个lxc容器,第一个是centos,创建很快。
lxc-create -n wo -t centos
[root@localhost wo]# lxc-start -n wo
但是有时lxc-console -n wo连不进去,而且100%占用一个cpu核,还有就是在这个容器里运行了一个
yum install cobbler,就卡住了,动不了了。

第二个是gentoo,创建很慢。主要是下载速度慢,总共300M的东西,用了3个小时
lxc-create -n ni -t gentoo
然后启动(在centos已经启动,并在里面操作时)第二个,启动时就卡住了
[root@localhost ni]# lxc-start -n ni
INIT: version 2.88 booting

OpenRC 0.19.1 is starting up Gentoo Linux (x86_64)

* Mounting /proc ... [ ok ]
 * Mounting /run ... * /run/openrc: creating directory
 * /run/lock: creating directory
 * /run/lock: correcting owner
 * Caching service dependencies ... [ ok ]
 * Mounting devtmpfs on /dev ... [ ok ]
 * Mounting /dev/mqueue ... [ ok ]
ssh-keygen: generating new host keys: RSA DSA ED25519
 * Starting sshd ... [ ok ]
 * Setting up tmpfiles.d entries for /dev ... [ ok ]

这是cpu利用率,启动了两个容器,就100%占用了两个核。
[root@localhost templates]# mpstat -P ALL 1
Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all   20.40    0.00   29.61    0.00    0.00    0.00    0.00    0.00    0.00   49.99
Average:       0   26.05    0.00   73.95    0.00    0.00    0.00    0.00    0.00    0.00    0.00
Average:       1   55.52    0.00   44.48    0.00    0.00    0.00    0.00    0.00    0.00    0.00
Average:       2    0.01    0.00    0.01    0.00    0.00    0.00    0.00    0.00    0.00   99.98
Average:       3    0.01    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.99
[root@localhost templates]# vmstat 1 -w
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 2  0            0     28329360          984      4065896    0    0     5    87  264   64  13  11  76   0   0
 2  0            0     28329344          984      4065896    0    0     0     0 2030   43  21  29  50   0   0
 2  0            0     28329344          984      4065896    0    0     0     0 2016   31  21  30  50   0   0
 2  0            0     28329344          984      4065896    0    0     0     8 2018   42  21  30  50   0   0

虚拟化之lxc的更多相关文章

  1. 网络虚拟化技术 -- LXC TUN&sol;TAP MACVLAN MACVTAP

    Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等 [ LXC内核命名空间 ],这里使用LXC的网络虚拟化来模拟多个网络环境. 创 ...

  2. kvm虚拟化1

    计算机的五大组成部分: 运算器,控制器,存储器,输入,输出 虚拟化是对cpu   ,内存,,磁盘, 网络,IO 的虚拟 cpu的虚拟 以时间分片形式进行,这样使得cpu可以运行多个进程 内存进行了空间 ...

  3. 最佳虚拟容器LXC

    最佳虚拟容器LXC 和"真正的虚拟机环境"不同, "容器"(container)只能在Linux上虚拟Linux, 不能虚拟WIndows, 因为它不能虚拟硬件 ...

  4. 2&period;LXC和namespace介绍

    lxc介绍 LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化.(主流的解决方案Xen ,KVM, LXC) Linux Container容器是一种内核虚拟化技术 ...

  5. 【深圳】OSC源创会第44期 开始报名

    时间:2016-03-19 14:00 地点: 深圳 南山区海德三道天利*商务广场B座负一楼(意启创业) 费用:50元/人(现场交),女士.50积分的账号.开源软件作者.学生免费 (用于准备茶歇小食 ...

  6. 浅谈OpenStack架构

    首先,先来了解,什么是OpenStack?   OpenStack是一个云平台管理的项目,它不是一个软件.这个项目由几个主要的组件组合起来完成一些具体的工作.OpenStack是一个旨在为公共及私有云 ...

  7. Docker简介&sol;安装&sol;使用

    什么是Docker?docker是一个开源的应用容器引擎,系统级的轻量虚拟化技术.应用程序的自动化部署解决方案,能够迅速创建一个容器,并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的 ...

  8. Xen安装部署和基本原理

    Refer to : http://www.178linux.com/14764 目录:   1. Xen的简介   1.1  Xen的大体结构   1.2 Xen对VM的称呼   1.3 Xen对C ...

  9. Libvirt代码架构

    Libvirt介绍 参考资料 Libvirt学习 通过virsh了解libvirt api的调用方式 通过virHypervisorDriver了解libvirt api的实现 virsh代码阅读 通 ...

随机推荐

  1. LUA类

    cpp_object_map = {}setmetatable(cpp_object_map, { __mode = "kv" }) local search_basesearch ...

  2. iOS文件类型判断

    最近在做的东西有下载zip,只是服务器发送过来的是二进制,需要根据二进制来判断是什么类型的文件,从而进行保存操作.起初很不理解,到后来发现可以通过二进制的前2位的ascii码来进行判断.如下: // ...

  3. 解决IE9下JQuery的ajax失效的问题

    jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)   1. 设置浏览器安全属性,启用[通过域访问数据源]选项,如图:

  4. sql分类及基本sql操作&comma;校对规则&lpar;mysql学习笔记二&rpar;

    sql针对操作对象分为不同语言 数据操作(管理)语言 DML或者将其细分为 ( 查询  DQL 管理(增,删,改)  DML) 数据定义语言(对保存数据的格式进行定义) DDL 数据库控制语言(针对数 ...

  5. QUOTENAME函数的用法

    quotename函数的语法为:quotename('expression1','expression2') expression1:指的是需要被特殊处理的字符 expression2:例如{}.[] ...

  6. window的画图工具&lpar;mspaint&rpar;也可以帮助我们开发和调试代码的&period;

    经常在视频中看到老师使用画图板来给学生讲解概念. 久而久之,发现私下里,开发程序调试程序时也可以使用画图板来辅助开发. 新建一个"无标题"的画图板 -> 把将要区分的问题扔进 ...

  7. 使用Java打印字符串表格(中英文内容不乱)

    最近在学习使用java来编写cli应用,但是在信息展示上碰到了难题.原因是没有很好工具来展示一个由字符串组成的表格.在git上搜到阿里巴巴有一个叫做 text-ui 的开源项目可以用,但是这个工具在制 ...

  8. app&period;&dollar;mount&lpar;&quot&semi;&num;app&quot&semi;&rpar; 手动挂载

    $mount()手动挂载 当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中: 假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载.例如: new Vue({ //el: ...

  9. H5禁止手机自带键盘弹出

    一个功能中用到这个, 调用软键盘,  不想弹出手机默认的输入法 网上找了个 http://blog.csdn.net/qq_24147051/article/details/52958610 处理方式 ...

  10. sqlserver获取指定数据库的描述

    SELECT 字段名= convert(varchar(100), a.name), 表名= convert(varchar(50), d.name ), 类型= CONVERT(varchar(50 ...